
次のルールを使用して、ポート 1986 宛てのすべてのトラフィックをポート 9 にリダイレクトして「接続拒否」を引き起こす iptables ルールを作成しようとしています。
iptables -t nat -I PREROUTING -p tcp -m tcp --dport 1986 -j DNAT --to-destination :9
これは新しい接続にはうまく機能しますが、確立された接続はこのルールをスキップし、拒否されないという問題があります。
NOTRACK
接続状態の追跡を回避するために、raw テーブルにルール
を追加しようとしましたが、効果はありませんでした。
iptables -t raw -I PREROUTING -p tcp --dport 1986 -m state --state ESTABLISHED,RELATED,NEW,INVALID -j NOTRACK
NAT ルールに状態を追加しても機能しません。
iptables -t nat -I PREROUTING -p tcp --dport 1986 -m state --state ESTABLISHED,RELATED,NEW,INVALID -j DNAT --to-destination :9
確立された接続で送信されたパケットに対して 'connection declined' エラーを発生させるために iptables をどのように使用すればよいですか?
答え1
このDNAT
ルールは、TCP 3 ウェイ ハンドシェイクで接続が確立されたときに、conntrack テーブルにエントリを作成します。
このnotrack
ルールは、新しい conntrack エントリの作成を無効にするようです。ただし、既存の conntrack エントリの使用は妨げません。
接続はすでに確立されているため、conntrack テーブルにエントリがすでに存在し、カーネルはそれを使用してトラフィックを転送します。
conntrack テーブルからフローを削除するには、ツールを使用する必要がありますconntrack
。例:
conntrack -D -s 192.168.1.10 -d 192.168.100.20 -p tcp --dport 1986
このコマンドを発行すると、iptables の新しい DNAT ルールを使用して、接続が conntrack に再度追加されます。その後、新しい宛先サーバーは接続を拒否します。新しい宛先サーバーが正確に何を返すかはわかりませんが、TCP RST かもしれません。