私は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
しかし、それでも運はありません。何が悪いのですか?
パケットをループバックインターフェイスにリダイレクトするには、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
チェーンを使用して、特定のルールでこの条件をバイパスする必要があります。