
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
明示的な「状態を保持」やフラグを操作する必要はありませんでした。