IPTables - 宛先がリッスンしていない場合は DNAT のみ

IPTables - 宛先がリッスンしていない場合は DNAT のみ

インターフェイス eth0 (インターネット アクセス) と tap_vpn0 (VPN タップ インターフェイス、ネットワーク 192.168.110.0/24) があります。私がしたいのは、eth0 を介して 192.168.110.2 に着信するすべての接続を DNAT することですが、サーバー自体にリスニング サービスがない場合に限ります (主に VPN サーバー自体ですが、netstat -pluntSSH を含む、に表示される他の基本的にすべてのサービス)。

今私がやっていることは iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 443 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 5555 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 992 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 4500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 500 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1194 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 1701 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 54700 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 63486 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p udp --dport 68 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2

静的例外の長いリストを書き留めます。しかし、実際のホストでポートが閉じられていない場合、パケットがローカルで正常に処理される場合に、IPTables に DNAT しないように指示する方法はありますか? たとえば、後でサーバー上でランダム ポート 9988 を開いた場合、別の例外を追加する必要はありませんiptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 9988 -j ACCEPTが、DNAT は実行されませんか?

答え1

うまくいっているようですiptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT-m socket説明によると、まさにそのとおりです。つまり、このパケットを受け入れるソケットがある場合に一致します。その秘訣は、--nowildcard私が以前省略したオプションを使用することです。そのマニュアル ページには、「ソケット マッチは、デフォルトではゼロ バウンド リスナーを受け入れません。そうしないと、ローカル サービスが、転送されるはずのトラフィックを傍受する可能性があるためです。」とさえ書かれています。これは、実際にまさに私が必要としていたことです。つまり、ローカル サービスが利用可能な場合に傍受するということです。

結果として得られるルールは次のようになります。 iptables -t nat -I PREROUTING 1 -i eth0 -m socket --nowildcard -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p tcp --dport 22 -j ACCEPT iptables -t nat -I PREROUTING 1 -i eth0 -p gre -j ACCEPT iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-destination 192.168.110.2

期待どおりに動作しない場合に備えてポート 22 (ssh) を残しましたが、テストでは完璧に動作しているようです。

関連情報