FreeBSD 감옥 내에서 공용 IP의 포트에 액세스

FreeBSD 감옥 내에서 공용 IP의 포트에 액세스

FreeBSD 10 설정에는 공개적으로 액세스할 수 있는 nginx 웹 서버를 실행하는 감옥 하나와 Jetty 기반 Java 백엔드 서버를 실행하는 또 다른 감옥이 있습니다. 각 감옥에는 lo1 루프백 인터페이스에 연결된 자체 내부 IP 주소 127.0.1.x가 있습니다. 이 모든 것은 들어오는 트래픽을 nginx 감옥으로 리디렉션하고 그곳에서 Jetty 감옥으로 리디렉션하는 pf 방화벽과 함께 실행되도록 구성됩니다. 기본 pf 구성은 다음과 같습니다.

이제 https를 통해 외부에서 액세스할 수 있는 Git 저장소가 필요합니다. 이는 설정되어 잘 작동하지만 외부에서만 액세스할 수 있습니다. 부두 감옥에서 연결할 수 없습니다. 그러나 공용 IP 주소를 통해 Jetty 백엔드 감옥에서 Git 저장소에 액세스하고 싶습니다.

pf에서 이 기능을 활성화하기 위해 다음 줄과 같은 것을 시도했지만 성공하지 못했습니다.

rdr pass proto tcp from $ip_jetty to $ip_public port https -> $ip_nginx

내 PF 방화벽 구성은 다음과 같습니다.

ip_public = "6.7.8.9"
if_external = "igb0"
net_jails = "127.0.1.0/24"
ip_nginx = "127.0.1.1"
ip_jetty = "127.0.1.10"

# Allow traffic from jails to outside world, enabled by network address translation
nat pass on $if_external from $net_jails to any -> $ip_public

# Redirect incoming web traffic to nginx jail
rdr pass on $if_external proto tcp from any to $ip_public port { http, https } -> $ip_nginx

# Allow outgoing connections
pass out all

# Allow nginx access to Jetty backend
pass in on lo1 proto tcp from $ip_nginx to $ip_jetty port 8080

답변1

내 질문에 답하기 위해 다음 방화벽 구성을 사용하여 작동시켰습니다.

# Allow dynaserv jail to access git on https port of web jail
pass in on lo1 proto tcp from $ip_jetty to $ip_nginx port https

또한 Jetty Jail의 /etc/hosts 파일에 Nginx Jail의 내부 IP 주소를 추가했습니다.

127.0.1.1               git.mycompany.com

이렇게 하면 트래픽이 외부 네트워크 장치 대신 내부 lo1 루프백 인터페이스를 통해 라우팅됩니다. 이것은 내가 원래 게시물에서 원했던 것과 정확히 일치하지는 않지만 일단 구성되면 제대로 작동합니다.

외부 네트워크 장치를 사용하여 예상되는 방식으로 문제를 해결하는 방법을 아는 사람이 있다면 여전히 답변에 관심이 있습니다.

답변2

이 질문을 받은 지 꽤 시간이 지났다는 것을 알고 있지만 여기에는 다음과 같은 내용이 있습니다.

OP에서 설명하는 것을 "헤어핀 NAT"라고 합니다. 그러나 게이트웨이에 불필요한 로드를 추가하고 PF가 모든 변환을 처리하도록 하고 싶지는 않습니다. 귀하가 찾고 있는 답변이 여기 최고의 답변에 대한 첫 번째 댓글에 나열되어 있다고 생각합니다. https://serverfault.com/questions/55611/loopback-to-forwarded-public-ip-address-from-local-network-hairpin-nat.

기본적으로 PF는 기본적으로 이 작업을 수행하지 않지만 다음과 같이 수행할 수 있습니다. 여기서 $hairpin_int는 새로운 vNIC입니다. /etc/rc.conf에는 cloned_interfaces= "contents of lo1 hp1과 같은 내용이 있습니다. "):

no nat on $int_if proto tcp from $int_if to $int_net
nat on $int_if proto tcp from $int_net to $hairpin_int port $hairpin_ports -> $int_if
rdr on $int_if proto tcp from $int_net to $ext_if port $hairpin_ports -> $hairpin_int

관련 정보