私は透明なプロキシサービスを使用しているので、Raspberry Piをホームルーターとして使用します。オペレーティングシステムはRaspbianです。現在、Minecraftサーバーを設定し192.168.2.28
、NATを使用してWANに公開しています。これは私のものです/etc/nftables.conf
:
#!/sbin/nft -f
flush ruleset
table ip filter {
chain output {
type filter hook output priority 0; policy accept;
tcp sport 25565 drop
}
}
table ip nat {
chain prerouting {
type nat hook prerouting priority 0; policy accept;
tcp dport 25565 dnat 192.168.2.28
}
chain postrouting {
type nat hook postrouting priority 0; policy accept;
tcp sport 25565 ip saddr 192.168.2.28 masquerade
}
}
しかし、次のような問題があります。オン192.168.2.28
、私は
nc -l -p 25565
オン192.168.2.27
、私は走る
echo "Hello, world!" | nc wan_ip 25565
欲しい動作は「Hello、world!」メッセージを受け取ることです192.168.2.28
。
ただし、最初のSYNパケットがルータを通過するとき、Saddrは同じままで、baddrのみNATします192.168.2.27
。
192.168.2.28
パケットが受信されると応答します192.168.2.27
。同じ L2 ネットワークにあるため、パケットはルータを通過せず、NAT を通過しません。
その後192.168.2.27
からパケットを受信しますが、192.168.2.28
応答かどうかは不明ですwan_ip
。
この問題を解決し、LANホストを含むどこでもポートフォワーディングが機能するようにするにはどうすればよいですか?
答え1
注意してください。nftables(良いiptables)は、NATされるフローの最初のパケットのみを表示します。 NAT が適用されると、同じフロー内の他のすべてのパケットが直接送信されます。Webフィルタ/つながる見なかったnftablesもう必要ありません。したがって、追加のサポートなしで自動的にNAT以外のトラフィックを返します。
唯一重要なのは、最初のパケット(TCPの場合はSYNパケット)で発生することです。応答パケットを含むこのフローの追加トラフィックは自動的に処理され、NATフックをバイパスします。
これは、192.168.2.28で発生したトラフィックを処理するための特別なルーティング後のルールがないことを意味します。一般的な変装規則は1つだけでなければなりません。みんな192.168.2.0/24 インターネットで通信するとき。とにかく、このルール自体は問題ではありません。発信トラフィックが応答トラフィックである場合、思ったほど頻繁に使用されません。既存のトラフィックの一部であるため、上記のようにこれらのパケットは通過しません。nftablesこれ以上ではありません。
権利を持つことが重要ですNATヘアピンサポート済み:クライアントとサーバーが同じLAN上にある状況で、注意しないと非対称トラフィックが発生する可能性があります。
ここで:
ルータがTCP宛先ポート25565に向かうすべてのエントリ(どこでも)を検出すると、宛先アドレスを192.168.2.28にリダイレクトします。
リダイレクトは外部と内部を区別しないため、LAN全体の適切な共通マスカレーディングルールに関連付けられている場合は、ルール自体で十分です。しかし、OPはそのようなルールを使用しませんでした。
ルーティング後の一般的な迷彩の代わりに、
OPの使用は、前のルール
tcp sport 25565 ip saddr 192.168.2.28
のフィルタリング部分とは何の関係もありません。最初パッケージtcp dport 25565
(また、新しいパッケージを受け取りました。目的地192.168.2.28):NATヘアピンは実装されていません。
何完了する必要があります代わりに、次のいずれかを実行してください。
LAN全体に一般的なマスカレーディングを使用します(NATヘアピンのユースケースに適応し、追加情報が不足しています)。
chain postrouting { type nat hook postrouting priority 0; policy accept; ip saddr 192.168.2.0/24 ip daddr != 192.168.2.0/24 masquerade }
サーバーが宛先の場合にのみ、宛先ポートが25565のパケットにマスカレーディングを使用します。
chain postrouting { type nat hook postrouting priority 0; policy accept; tcp dport 25565 ip daddr 192.168.2.28 masquerade }
つまり、サーバーへのトラフィック(適切なNATヘアピン用のLANからLANへのトラフィックを含む)のみが偽装されます(LANシステムはインターネットにアクセスできません)。
2代わりに、DNATを最初に取得するトラフィックにのみマスカレーディングを適用するように選択します。
chain postrouting { type nat hook postrouting priority 0; policy accept; ct status dnat masquerade }
2.と同じ効果ですが、より多様です。
必要に応じて変装のために1と3のみを組み合わせてください。
箇条書き2.または3.はインターネットソースアドレスを隠す副作用があるため、LANにのみ適用するのが最善です。
chain postrouting { type nat hook postrouting priority 0; policy accept; ip saddr 192.168.2.0/24 ip daddr != 192.168.2.0/24 ct status dnat masquerade }
したがって、1.または4.(インターネットへのLANアクセスを制限する)を使用してください。他に可能なオプションがあります。
注: 1. 極端な場合があります。クライアントがルーターの内部IPアドレスを宛先として使用している場合、この場合の追加の規則なしでは機能しませんが、クライアントがそうするかどうかは疑わしく不十分です。 OPのルール情報:ルーターの内部IPアドレス。