インターフェイス eth0 (インターネット アクセス) と tap_vpn0 (VPN タップ インターフェイス、ネットワーク 192.168.110.0/24) があります。私がしたいのは、eth0 を介して 192.168.110.2 に着信するすべての接続を DNAT することですが、サーバー自体にリスニング サービスがない場合に限ります (主に VPN サーバー自体ですが、netstat -plunt
SSH を含む、に表示される他の基本的にすべてのサービス)。
今私がやっていることは
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) を残しましたが、テストでは完璧に動作しているようです。