私のOpenWRTゲートウェイ(自作の19.07、カーネル4.14.156)は、プライベートネットワークの前にあるパブリックIPアドレスにあります。私はnftables(not iptables)を使用しています。
パブリックアドレスで非標準ポートを公開し、ゲートウェイの背後にあるマシンの標準ポートに転送したいと考えています。以前はポートフォワーディングと呼ばれていたと思います。ゲートウェイマシンがhttpサービスなどを提供していたように見えますが、実際にはプライベートアドレスのゲートウェイの背後にあるマシンでした。
これが私のnftables設定です。これらの目的のために、私の「標準サービス」はポート1234にあり、公衆がゲートウェイ:4321でアクセスできるようにしたいと考えています。
#!/usr/sbin/nft -ef
#
# nftables configuration for my gateway
#
flush ruleset
table raw {
chain prerouting {
type filter hook prerouting priority -300;
tcp dport 4321 tcp dport set 1234 log prefix "raw " notrack;
}
}
table ip filter {
chain output {
type filter hook output priority 100; policy accept;
tcp dport { 1234, 4321 } log prefix "output ";
}
chain input {
type filter hook input priority 0; policy accept;
tcp dport { 1234, 4321 } log prefix "input " accept;
}
chain forward {
type filter hook forward priority 0; policy accept;
tcp dport { 1234, 4321 } log prefix "forward " accept;
}
}
table ip nat {
chain prerouting {
type nat hook prerouting priority 0; policy accept;
tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200;
}
chain postrouting {
type nat hook postrouting priority 100; policy accept;
tcp dport { 1234, 4321 } log prefix "nat-post ";
oifname "eth0" masquerade;
}
}
この設定を使用すると、外部マシンはgateway:1234
でプライベートマシンにアクセスできます。ロギングは、外部からゲートウェイIPへのnat-pre
SYNパケット、外部から内部IPへのforward
、外部から内部IPへのnat-post
を示し、「既存の接続」が残りの処理を行いますパケットの。
gateway:4321
に接続する外部マシンはraw
としてログに記録され、4321は1234に変更されます。次に、SYNパケットが内部サーバーに転送され、応答SYNパケットが戻ってきて、何もありません。
問題は、リモートマシンが期待しているinternal:1234
をgateway:4321
に戻すnftables構成を実行していないことだと思います。 masquerade
がinternal:1234
をgateway:1234
に変更しても、リモートマシンはそれを予期しておらず、おそらくダンプします。
この構成のアイデアはありますか?
ポート番号を変換していません。外部接続がポート1234である場合、これは問題ではありません。ただし、それが4321の場合、dnatはポート1234ではなく、内部サーバーのポート4321を通過します。
tcp dport { 1234, 4321 } log prefix "nat-pre " dnat 172.23.32.200:1234;
内部サーバーから戻ってくる返信パケットを変換する必要はありません。これは、最初のsynパケットで作成される接続追跡テーブルのエントリを使用して自動的に行われます。