質問:
host1
TLS暗号化された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