iptables:透明なTCPトラフィックプロキシ

iptables:透明なTCPトラフィックプロキシ

質問:

私は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処理されたパケットに関連付けられた着信パケットは、適切な戻りマッピングターゲットポートを取得します。

(コメントに基づいて修正しました)

おすすめ記事