VirtualBox에서 FreeBSD 라우터를 완전히 엽니다.

VirtualBox에서 FreeBSD 라우터를 완전히 엽니다.

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

명시적인 "상태 유지"나 플래그를 망칠 필요가 없었습니다.

관련 정보