
TL;DR - 내 홈 LAN(192.168.1.0/24)에 하나의 네트워크 카드와 개인-내부-가상박스 네트워크(10.9.9.0/24)에 하나의 네트워크 카드를 사용하여 FreeBSD VM을 설정하고 통과하고 싶습니다. 둘 사이를 오가는 모든 트래픽.
오랜 Linux 사용자(서버의 Debian)이지만 FreeBSD를 사용한 지 하루 정도밖에 되지 않았습니다. :)
어쨌든 실험적인 작업을 위해 2개의 네트워크 인터페이스가 있는 virtualbox 머신이 있습니다. 하나는 내 홈 LAN에 연결되고 다른 하나는 내부 전용 네트워크에 연결됩니다. 이 시스템은 블록 없음 라우터로 설정되어 소스나 대상에 관계없이 eth0과 eth1 사이에 패킷을 전달하기만 하면 됩니다. iptables로 충분히 쉽게 할 수 있습니다 -
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT
그러나 나는 이것을 pf와 함께 작동시키려고 노력해 왔고 부분적인 성공만을 거두었습니다.
와 함께
gateway_enable="YES"
pf_enable="YES"
pf_rules="/etc/pf.conf"
내 /etc/rc.conf
및 /etc/pf.conf
포함
pass from em1:network to any keep state
pass from em0:network to any keep state
pass in inet proto tcp to any keep state
pass in inet proto udp to any keep state
pass out inet proto tcp to any keep state
pass out inet proto udp to any keep state
내부에만 연결된 라이브 디스크 VM을 시작하고 em1의 IP를 기본 게이트웨이로 설정하고 em1, ping em0을 ping할 수 있지만 vbox가 실행 중인 호스트 시스템이나 내 다른 시스템을 ping할 수는 없습니다. LAN 또는 http, ssh 등을 통해 연결합니다.
[root@bsdtest ~]# pfctl -sa
FILTER RULES:
pass in inet proto tcp all flags S/SA keep state
pass in inet proto udp all keep state
pass out inet proto tcp all flags S/SA keep state
pass out inet proto udp all keep state
pass inet from 10.9.9.0/24 to any flags S/SA keep state
pass inet from 192.168.1.0/24 to any flags S/SA keep state
STATES:
all tcp 192.168.1.90:22 <- 192.168.1.10:48102 ESTABLISHED:ESTABLISHED
all udp 192.168.1.2:53 <- 10.9.9.5:59075 NO_TRAFFIC:SINGLE
all udp 10.9.9.5:59075 -> 192.168.1.2:53 SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:34207 NO_TRAFFIC:SINGLE
all udp 10.9.9.5:34207 -> 192.168.1.2:53 SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:43515 NO_TRAFFIC:SINGLE
all udp 10.9.9.5:43515 -> 192.168.1.2:53 SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:1636 NO_TRAFFIC:SINGLE
all udp 10.9.9.5:1636 -> 192.168.1.2:53 SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:60124 NO_TRAFFIC:SINGLE
all udp 10.9.9.5:60124 -> 192.168.1.2:53 SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:8866 NO_TRAFFIC:SINGLE
all udp 10.9.9.5:8866 -> 192.168.1.2:53 SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:25534 NO_TRAFFIC:SINGLE
all udp 10.9.9.5:25534 -> 192.168.1.2:53 SINGLE:NO_TRAFFIC
all udp 192.168.1.2:53 <- 10.9.9.5:30141 NO_TRAFFIC:SINGLE
all udp 10.9.9.5:30141 -> 192.168.1.2:53 SINGLE:NO_TRAFFIC
INFO:
Status: Enabled for 0 days 00:08:28 Debug: Urgent
State Table Total Rate
current entries 17
searches 1990 3.9/s
inserts 253 0.5/s
removals 236 0.5/s
Counters
match 253 0.5/s
bad-offset 0 0.0/s
fragment 0 0.0/s
short 0 0.0/s
normalize 0 0.0/s
memory 0 0.0/s
bad-timestamp 0 0.0/s
congestion 0 0.0/s
ip-option 0 0.0/s
proto-cksum 0 0.0/s
state-mismatch 0 0.0/s
state-insert 0 0.0/s
state-limit 0 0.0/s
src-limit 0 0.0/s
synproxy 0 0.0/s
map-failed 0 0.0/s
TIMEOUTS:
tcp.first 120s
tcp.opening 30s
tcp.established 86400s
tcp.closing 900s
tcp.finwait 45s
tcp.closed 90s
tcp.tsdiff 30s
udp.first 60s
udp.single 30s
udp.multiple 60s
icmp.first 20s
icmp.error 10s
other.first 60s
other.single 30s
other.multiple 60s
frag 30s
interval 10s
adaptive.start 6000 states
adaptive.end 12000 states
src.track 0s
LIMITS:
states hard limit 10000
src-nodes hard limit 10000
frags hard limit 5000
table-entries hard limit 200000
OS FINGERPRINTS:
758 fingerprints loaded
[root@bsdtest ~]#
어떤 아이디어가 있나요? 10.9.9.5(내 라이브 디스크)에서 192.168.1.2로의 udp 트래픽에 관한 줄은 내 홈 LAN 이름 서버에 대한 DNS용이지만 응답이 도착하지 않습니다... http 요청에 표시된 내용은 다음과 같습니다.
[root@bsdtest ~]# pfctl -sa | grep 80
all tcp 192.168.1.10:80 <- 10.9.9.5:59436 CLOSED:SYN_SENT
all tcp 10.9.9.5:59436 -> 192.168.1.10:80 SYN_SENT:CLOSED
all tcp 192.168.1.10:80 <- 10.9.9.5:59438 CLOSED:SYN_SENT
all tcp 10.9.9.5:59438 -> 192.168.1.10:80 SYN_SENT:CLOSED
아이디어?
답변1
좋아, 해결책을 찾았습니다.
내 /etc/rc.conf는 이대로 괜찮습니다 ...
/etc/pf.conf는 다음과 같아야 합니다.
# cat /etc/pf.conf
ext_if="em0"
int_if="em1"
boxnet = $int_if:network
homenet = $ext_if:network
nat on $ext_if from $boxnet to any -> ($ext_if)
pass quick from { lo0, $boxnet, $homenet } to any keep state
아마도 변수가 너무 많을 것입니다. 원래 em0/em1을 사용할 수도 있습니다. 어쨌든, 이것은 당신에게 -
[root@bsdtest ~]# pfctl -vnf /etc/pf.conf
ext_if = "em0"
int_if = "em1"
icmp_types = "echoreq"
boxnet = "em1:network"
homenet = "em0:network"
nat on em0:network inet from 10.9.9.0/24 to any -> 192.168.1.0/24
nat on em1:network inet from 192.168.1.0/24 to any -> 10.9.9.0/24
pass quick inet from 127.0.0.0/8 to any flags S/SA keep state
pass quick inet from 192.168.1.0/24 to any flags S/SA keep state
답변2
아래에는 추측이 있으므로 주의하시기 바랍니다. 그러나 이는 라우팅, 패킷 필터링(방화벽) 및 NAT(네트워크 주소 변환)을 혼합하여 시작하는 많은 사람들을 혼란스럽게 하는 매우 일반적인 설정입니다.
당신은 명확하게 언급하지 않았지만 당신의 네트워크는 다음과 같을 것 같습니다.
Internet <-A-> SOHO Router <-B-> Server/workstation <-C-> VM
귀하의 DNS 서버는 192.168.1.0/24인 B 네트워크에 있습니다.
나는 귀하의 인터넷 SOHO 라우터가 192.168.1.1이고 네트워크의 기본 게이트웨이로 설정되어 있다고 추측합니다. 이는 매우 일반적인 설정일 것입니다.
DNS 서버는 192.168.1.2에 있고 서버 브리지 인터페이스는 192.168.1.10이라고 명시했습니다. 그 뒤에는 네트워크 10.9.9.0/24가 있습니다.
귀하의 iptables 설정이 전달됩니다모두패킷상호 작용. 실제로는 한 네트워크에서 다른 네트워크로 모든 패킷(로컬 패킷 포함)을 보냅니다. 이것이 중요한 차이점입니다.
귀하의 pf 구성에서 당신은~ 아니다앞으로모두패킷상호 작용. 당신은회로망 em1:network
. 우리는 전체 구성을 가지고 있지 않지만 실제로 훌륭하고 작동하는 베어본 구성을 갖고 있다고 추측합니다. 당신을 괴롭히는 것은 누락된 경로입니다.
10.9.9.0/24에서 패킷을 보내면 192.168.1.0/24 네트워크에 도달합니다. 귀하의 서버는 해당 네트워크에 연결되어 있으므로 DNS에 직접 연결할 수 있습니다. 그러나 B 네트워크의 DNS 서버는 로컬이 아닌 C 10.9.9.0/24 네트워크에 연결하는 방법을 모릅니다. 그러면 모든 응답이 SOHO 라우터인 "기본 라우터"로 전송됩니다. 또한 이 라우터는 192.168.1.0/24 네트워크(10.9.9.0/24 아님)를 찾을 수 있는 위치만 알고 있으며 일반적으로 모든 것을 외부 인터넷 링크로 라우팅합니다. 이 경우 적절한 개인 주소를 사용하고 있으므로 개인 주소가 인터넷에서 라우팅되지 않으므로 패킷이 대신 삭제됩니다.
"적절한" 솔루션은 10.9.9.0/24에서 192.168.1.10으로 패킷을 라우팅하도록 SOHO 라우터에 경로를 설정하는 것입니다. 괜찮은 라우터를 사용하면 그렇게 할 수 있습니다. 불행히도 많은 저렴한 SOHO 라우터는 그렇지 않습니다. 이 경우 DNS 서버에 경로를 추가하여 테스트할 수 있습니다.
- iptables가 작동하는 이유는 응답 패킷이 eth0 인터페이스에 표시되고 모든 패킷이 전달되기 때문입니다. B 네트의 모든 트래픽은 C 네트(및 역방향)로 전송됩니다. 여기에는 지역적으로 유지될 수 있거나 유지되어야 하는 트래픽이 포함됩니다. 실제로 네트워크 브리지가 설정되었습니다.
- 첫 번째 pf 설정에서 작동하지 않는 이유는 표시할 네트워크를 지정했기 때문입니다. B 네트의 단 하나의 머신만이 C 네트를 찾을 수 있는 위치를 알고 있습니다. C net에 인터페이스가 있으므로 192.168.1.10입니다. 실제로 기본 방화벽을 설정했습니다. 필터링이 준비되었지만 아직 아무것도 필터링하지 않았습니다. 하지만 라우팅이 누락되었습니다.
- 두 번째 pf 구성(자신의 답변)에서 작동하는 이유는 10.9.9.0/24 네트워크를 192.168.1.0/24의 주소 공간으로 NAT하기 때문입니다. C 네트 10.9.9.0/24의 모든 트래픽은 B 네트에서 192.168.1.10에서 나오는 것처럼 보입니다.NAT는 피해야 합니다가능할 때마다 최후의 수단으로만 사용하십시오.
패키지를 필터링할 필요가 없거나 필터링하고 싶지 않다면 방화벽을 사용하지 말라고 조언합니다. 당신이하려는 일은 다음에 의해 처리되어야합니다간단한 라우팅.
답변3
"모두 개방형" 게이트웨이를 찾고 있다면 단일 규칙만 사용하여 이를 수행할 수 있습니다.
pass all allow-opts
명시적인 "상태 유지"나 플래그를 망칠 필요가 없었습니다.