VirtualBox で完全にオープンな FreeBSD ルーター

VirtualBox で完全にオープンな FreeBSD ルーター

TL;DR - 自宅の LAN (192.168.1.0/24) に 1 つのネットワーク カード、プライベート内部から VirtualBox へのネットワーク (10.9.9.0/24) に 1 つのネットワーク カードを備えた FreeBSD VM をセットアップし、2 つのネットワーク間ですべてのトラフィックをやり取りしたいと考えています。

長年の Linux ユーザー (サーバーでは Debian) ですが、FreeBSD を使い始めてまだ 1 日ほどです :)

とにかく、実験用に、2 つのネットワーク インターフェイスを備えた VirtualBox マシンを用意しました。1 つは自宅の LAN にブリッジされ、もう 1 つは内部専用ネットワークです。このマシンは、送信元や送信先に関係なく、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 と em0 に ping を実行できますが、vbox が実行されているホスト マシンや LAN 上の他のマシンに ping を実行したり、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

OK、解決策が見つかりました。

私の /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の設定により、全てパケットインターフェース実際には、ローカル パケットであっても、すべてのパケットを 1 つのネットワークから別のネットワークに送信します。これが重要な違いです。

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 ネット上の 1 台のマシンだけが C ネットの場所を知っています。これは C ネットにインターフェイスがあるため、192.168.1.10 です。実質的に、基本的なファイアウォールをセットアップしました。フィルタリングは準備ができていますが、まだ何もフィルタリングしていません。ただし、ルーティングがありません。
  • 2 番目の 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

明示的な「状態を保持」やフラグを操作する必要はありませんでした。

関連情報