VirtualBox에서 완전히 개방형 FreeBSD 라우터

VirtualBox에서 완전히 개방형 FreeBSD 라우터

요약 - 홈 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

명시적인 "보류 상태"나 플래그를 혼동할 필요가 없습니다.

관련 정보