別のローカルポートを出た後、TCPパケットの宛先ポートを維持します。

別のローカルポートを出た後、TCPパケットの宛先ポートを維持します。

質問:

host1TLS暗号化されたTCPパケットを別のホスト(呼称)のポート5015に送信するホスト(呼称)に常駐するアプリケーションがありますhost2。ネットワークの制限により、host1すべてのインバウンドおよびアウトバウンドトラフィックは80または443を介して入って来る必要があります。にアクセスできませんhost2

方法:

host1私の考えは、5015から443のトラフィックをルーティング/リダイレクト/配信し、到着させるためのiptablesルールを作成できることですhost2:5015。私が経験している問題は正しいルールを作成することです。これが私が今まで持っているものです:

TCP_TRAFFIC_PORT=5015
PROXY_PORT=443

_apply_outbound_rules() {
    # Forward outgoing packets through the proxy port
    sudo iptables -t nat \
        -I OUTPUT 1 \
        -p tcp --destination-port $TCP_TRAFFIC_PORT \
        -j DNAT --to-destination :$PROXY_PORT

    # Send packets to host2:5015 port (this is likely the rule to fix)
    sudo iptables -t nat \
        -I POSTROUTING 1 \
        -p tcp --destination-port $PROXY_PORT \
        -j SNAT --to-source :$TCP_TRAFFIC_PORT
}

apply_outbound_rules

これを行う方法を知っている人はいますか?これがよくあることのようですが、悩みになりますね。

ベストアンサー1

まず、LinuxのNATはステートフルです。つまり、アウトバウンドとインバウンドのルールは必要ありません。トラフィックがNATを介してアウトバウンドに返されると、Linuxは自動的に戻りトラフィックのNATを解放します。

しかし、直面する主な問題は、TCPセッションが次の組み合わせで定義されることです。

  • ソースIP
  • ソースポート
  • 宛先IP
  • 宛先ポート

ソースIPは単一値(host1のIP)に制限されます。宛先IPはすでに単一値(ホスト2のIP)です。ソースポートには2つの値(80と443)のみがあります。そして、宛先ポートは単一値(5015)に制限されます。
これは、最大2つの同時接続しか持てないことを意味します(2つのポートにSNATの負荷を分散させる場合)。シーケンシャル接続を使用しても、TIME_WAIT 状態のポートなどのポートの再利用の問題が発生する可能性があります。

しかし、本当にこれを試したい場合は、従うべき規則は次のとおりです。

iptables -t nat -I POSTROUTING \
  -d $HOST2_IP -p tcp --dport $TCP_TRAFFIC_PORT \
  -j SNAT --to-source :$PROXY_PORT

おすすめ記事