요약 - 홈 LAN(192.168.1.0/24)에 하나의 네트워크 카드, 개인 내부 대 가상 박스 네트워크(10.9.9.0/24)에 하나의 네트워크 카드, 그리고 Pass를 사용하여 FreeBSD 가상 머신을 설정하고 싶습니다. 둘 사이를 오가는 모든 트래픽.
오랜 Linux 사용자(서버의 Debian)이지만 FreeBSD를 하루 정도만 사용했습니다. :)
어쨌든 내 연구실에는 2개의 네트워크 인터페이스가 있는 가상 머신이 있습니다. 하나는 홈 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에만 연결된 라이브 CD VM을 시작할 수 있고 em1의 IP를 기본 게이트웨이로 설정하고 em1, ping em0을 ping할 수 있지만 실행 중인 호스트 vbox나 내 LAN 또는 http, ssh를 통해 다른 컴퓨터를 ping할 수 없습니다. 그리고 다른 연결.
[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(Network Address Translation)를 혼동하는 많은 사람들을 혼란스럽게 하는 매우 일반적인 설정입니다.
명시적으로 지정하지는 않았지만 네트워크는 다음과 같을 것 같습니다.
Internet <-A-> SOHO Router <-B-> Server/workstation <-C-> VM
귀하의 DNS 서버는 네트워크 B(192.168.1.0/24)에 있습니다.
내 생각에는 인터넷 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 아님)를 찾을 수 있는 위치만 알고 있으며 일반적으로 모든 것을 외부 인터넷 링크로 라우팅합니다. 이 경우 올바른 개인 주소를 사용하고 있으므로 개인 주소가 인터넷에서 라우팅되지 않기 때문에 패킷이 삭제됩니다.
"올바른" 해결책은 SOHO 라우터에 경로를 설정하고 10.9.9.0/24에서 192.168.1.10으로 패킷을 라우팅하도록 지시하는 것입니다. 괜찮은 라우터를 사용하면 이 작업을 수행할 수 있습니다. 불행히도 많은 저렴한 SOHO 라우터에는 이 기능이 없습니다. 이 경우 DNS 서버에 경로를 추가하여 테스트할 수 있습니다.
- iptables에서 작동하는 이유는 응답 패킷이 eth0 인터페이스에 표시되고 모든 패킷이 전달되기 때문입니다. B 네트워크의 모든 트래픽은 C 네트워크로 전송됩니다(또는 그 반대로). 여기에는 온프레미스에 머물 수 있거나 유지되어야 하는 트래픽이 포함됩니다. 실제로 브리지를 설정했습니다.
- 첫 번째 pf 설정에서 작동하지 않는 이유는 보려는 네트워크를 이미 지정했기 때문입니다. 네트워크 B에는 네트워크 C를 찾을 수 있는 위치를 아는 머신이 하나만 있습니다. C 네트워크에 인터페이스가 있으므로 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
명시적인 "보류 상태"나 플래그를 혼동할 필요가 없습니다.