web-dev-qa-db-ja.com

内部SNATによるiptablesポート転送

外部ポートをプライベートネットワーク上のマシンの別のポートに転送したい。ただし、宛先マシンにはまったく異なる送信ルートがあるため、ゲートウェイの内部IPからのトラフィックのようにSNATする必要があります。ここでは2つの質問を組み合わせていますが、個別に質問した結果をマージできるかどうかはわかりません。

ゲートウェイ= 1.2.3.4/192.168.2.5、内部サーバー= 192.168.2.10

  1. 別のポートへの転送

私はこれに慣れており、Googleが私に見つけた唯一の回答であると思われます。

iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:12345
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 12345 -j ACCEPT
iptables -A POSTROUTING -t nat -d 192.168.2.10 -s 192.168.2.0/24 -p tcp --dport 12345 -j SNAT --to 1.2.3.4

これは、1.2.3.4の外部IPから192.168.2.10:12345にポート12345を転送します。ポート54321に転送する場合はどうなりますか?どのポート参照がどのマシンと一致するかについて混乱します。私は過去に試行錯誤してこれを解決しましたが、実際にはうまくいかなかったことが後でわかりました。

  1. LANアドレスからの転送

この部分は可能かどうかはわかりません。私が欲しいのは、192.168.2.10:54321に着信するトラフィックがインターネットからではなく、ゲートウェイマシンのLANアドレスから発信されていることです。 (ポート443をsshサーバーに転送しようとしていますが、そのサーバーはすでに別のIPアドレスで外部から認識されているため、応答トラフィックは別のルートをとります。)

上記の標準ルールを変更しました:

iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:12345
iptables -A POSTROUTING -t nat -p tcp -d 192.168.2.10 --dport 12345 -j SNAT --to-source 192.168.2.5
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 12345 -j ACCEPT
iptables -A POSTROUTING -t nat -d 192.168.2.10 -s 192.168.2.0/24 -p tcp --dport 12345 -j SNAT --to 1.2.3.4

tcpdumpは、トラフィックがゲートウェイのLANアドレス192.168.2.5からのものであり、サーバーが応答していることを示していますが、その後、外部アドレスに転送されていません。これは不可能であると私は疑っていますが、返信トラフィックには宛先としてクライアントのアドレスが必要ですが、iptables canが返信を正しくリダイレ​​クトする場合は、どうやって。

さらに、可能であれば、パート1のように、宛先ポートを変更するための正しい構文を含めます。

3
Iain Brown

いろいろ試してみたところ、私の質問には答えたと思うので、他の人が役に立つと思った場合に備えて、ここに投稿する必要があります。はい、それは可能であり、アドレスとポートの適切な組み合わせを取得するだけで、かなり簡単です。

私のスクリプトからのコメント:

# summary:
# allow forwarding *to* destination ip:port
# allow forwarding *from* destination ip:port
# nat packets identified by arrival at external IP / port to have
#  *destination* internal ip:port
# nat packets identified by arrival at internal IP / port to have
#  *source* internal network IP of gateway machine

質問の例では:

# allow inbound and outbound forwarding
iptables -A FORWARD -p tcp -d 192.168.2.10 --dport 54321 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.2.10 --sport 54321 -j ACCEPT

# route packets arriving at external IP/port to LAN machine
iptables -A PREROUTING -t nat -p tcp -d 1.2.3.4 --dport 12345 -j DNAT --to-destination 192.168.2.10:54321
# rewrite packets going to LAN machine (identified by address/port)
# to originate from gateway's internal address
iptables -A POSTROUTING -t nat -p tcp -d 192.168.2.10 --dport 54321 -j SNAT --to-source 192.168.2.5

実際のスクリプト。これは直接適用する方が簡単であるためです。

# EXTIP = external IP of gateway (1.2.3.4)
# EPORT = external port (12345)
# DIP   = destination IP in local network (192.168.2.10)
# DPORT = destination port (54321)
# INTIP = internal IP of gateway (192.168.2.5)

iptables -A FORWARD -p tcp -d $DIP --dport $DPORT -j ACCEPT
iptables -A FORWARD -p tcp -s $DIP --sport $DPORT -j ACCEPT

iptables -A PREROUTING -t nat -p tcp -d $EXTIP --dport $EPORT -j DNAT --to-destination $DIP:$DPORT
iptables -A POSTROUTING -t nat -p tcp -d $DIP --dport $DPORT -j SNAT --to-source $INTIP

答えが他の誰かに役立つこと、そして何度も処理されたものでサイトを散らかしていないことを願っています。

3
Iain Brown