質問:
私はTCPサーバーとクライアントがあり、それぞれポート9000をリッスンしています。トラフィックがポート80を介してのみ転送される2つの異なるホストにサーバーとクライアントを展開しました。 PREROUTINGルールが--source-port
。
方法:
サーバーがポート9000からポート80にトラフィックをルーティングするようにiptablesルールを設定しようとしており、ポート80から着信トラフィックがローカルから9000にルーティングされるクライアントの無料ルールを設定しようとしています。
ルールを適用するためにこのスクリプトを考えました。いくつかのバリエーションを試しましたが、パケットはサーバーホストでは許可されていますが、PREROUTING(インバウンド)ルールでは許可されていないようです。
#!/bin/bash
apply_inbound_rules() {
# Allow incoming server traffic from port 80 to the TCP client
sudo iptables -t nat \
-I PREROUTING \
-p tcp --destination-port $PROXY_PORT \
-j REDIRECT --to-port $TCP_PORT
}
apply_outbound_rules() {
# Setup outgoing packets created by the TCP server
# to route through local port 80
# and received on port 80 on the client host
sudo iptables -t nat \
-I OUTPUT \
-p tcp --destination-port $TCP_PORT \
-j DNAT --to-destination :$PROXY_PORT
# To maintain the TCP_PORT
sudo iptables -t nat \
-I POSTROUTING \
-p tcp --destination-port $PROXY_PORT \
-j SNAT --to-source :$TCP_PORT
}
apply_inbound_rules
apply_outbound_rules
このようなルールを作った経験がある人はいますか?これは一般的な問題のようですが、理解できないようです。
答え1
これは私のコメントを返信に翻訳したものです。
戻りパケットを処理するには、ソースポートのアウトバウンドMASQUERADEに依存するようにルールを調整する必要があります。したがって、発信パケットは、保持したルールを使用してDNATとして処理し、次のルールを使用してMASQUERADEとして処理する必要があります。
iptables -t nat -A POSTROUTING -p tcp --destination-port $PROXY_PORT -j MASQUERADE --to-ports $TCP_PORT
このルールを使用してください代わりにSNATルール。
MASQUERADE処理されたパケットに関連付けられた着信パケットは、適切な戻りマッピングターゲットポートを取得します。
(コメントに基づいて修正しました)