web-dev-qa-db-ja.com

CentOSポート転送が機能しない

私はCentOS 6.5を使用していて、次のコマンドをiptablesに追加して、すべての着信トラフィックをポート8088から4569に転送します。

iptables -A PREROUTING -t nat -p udp --dport 8088 -i eth0 -j DNAT --to-destination 127.0.0.1:4569
iptables -I FORWARD 1 -d 127.0.0.1 -p udp --dport 4569 -j ACCEPT

iptables --listは次の出力を示します。

iptables --list
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
ACCEPT     udp  --  anywhere             localhost.localdomain udp dpt:iax

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

しかし、udpポート4569でパケットトレースを取得すると、そのポートにパケットが表示されません。それから私はこれを追加しました:

iptables -A PREROUTING -t nat -p udp --dport 8088 -i eth0 -j REDIRECT --to-ports 4569

そして、私のiptableは次のようになります:

Table: nat
Chain PREROUTING (policy ACCEPT)
num  target     prot opt source               destination
1    DNAT       udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:8088 to:127.0.0.1:4569
2    REDIRECT   udp  --  0.0.0.0/0            0.0.0.0/0           udp dpt:8088 redir ports 4569

しかし、それでも運はありません。何が悪いのですか?

7
user3360140

パケットをループバックインターフェイスにリダイレクトするには、REDIRECTターゲットを使用する必要があります。

iptables -A PREROUTING -t nat -p udp --dport 8088 -i eth0 -j REDIRECT --to-ports 4569

それ以外の場合は、ルーティング決定が127.0.0.1に行われる前に宛先アドレスを変更します。これは、カーネルによってmartian packetと見なされ、リバースパスフィルタリングポリシーによってドロップされることを意味します。

この動作に関与する2つのカーネルパラメータは次のとおりです。

  • net.ipv4.conf.eth0.route_localnet

route_localnet-ブール値

ルーティング中は、ループバックアドレスを火星の送信元または宛先と見なさないでください。これにより、ローカルルーティングの目的で127/8を使用できるようになります。

デフォルトはFALSE

  • net.ipv4.conf.eth0.rp_filter

rp_filter-INTEGER

0-ソース検証なし。
1-RFC3704で定義されている厳密モード厳密な逆パス各着信パケットはFIBに対してテストされ、インターフェイスが最適な逆パスでない場合、パケットチェックは失敗します。デフォルトでは、失敗したパケットは破棄されます。
2-RFC3704 Loose Reverse Pathで定義されているルーズモード各着信パケットの送信元アドレスもFIBに対してテストされ、送信元アドレスがどのインターフェイスからも到達できない場合、パケットチェックは失敗します。

RFC3704で現在推奨されているプラ​​クティスは、厳密モードを有効にして、DDos攻撃によるIPスプーフィングを防止することです。非対称ルーティングまたは他の複雑なルーティングを使用する場合は、ルーズモードをお勧めします。

Conf/{all、interface}/rp_filterの最大値は、{interface}でソース検証を行うときに使用されます。

デフォルト値は0です。一部のディストリビューションでは、起動スクリプトで有効になっていることに注意してください。

この正当な動作を完全に維持したいので、REDIRECTチェーンを使用して、特定のルールでこの条件をバイパスする必要があります。

7
Xavier Lucas