Linuxマシンに到着するパケットを検査するアプリケーションを開発しています。すべての着信接続パケットと着信パケットのみをNFQUEUEで送信したいと思います。 --state NEW
だけでなく、クライアントによって開始される接続の場合は--state ESTABLISHED, RELATED
。
最後に、すべてのポートのtcpハンドシェイクを作成するには、このルールを追加で機能させる必要があります。
iptables -A PREROUTING -t nat -p tcp -match multiport! --dport 64646 -j REDIRECT --to-ports 1234
フローの例:
どんな助けでも大歓迎です。
ありがとうございました!
それが誰かに興味があるなら、私は解決策を見つけました。
# Accept our ssh on a modified port
iptables -A PREROUTING -t raw -p tcp --dport 64646 -j ACCEPT
# Mark all packets of incoming NEW connection with mark 1 (netfilter connmark)
iptables -A PREROUTING -t mangle -m state --state NEW -j CONNMARK --set-mark 1
# Push into nfqueue all marked packets (netfilter nfqueue)
iptables -A PREROUTING -t mangle -m connmark --mark 1 -j NFQUEUE --queue-num 0
# Redirect all incoming connections to the userland listener to make TCP handshake
iptables -A PREROUTING -t nat -p tcp --match multiport ! --dport 64646 -j REDIRECT --to-ports 1234
最後に、すべての着信パケットがnfqueueに入りますが、マシンで作業している場合(更新、アップグレード、インストールなど)、パケットはルールに一致しません。さらに、リダイレクトはnfqueueの決定後に適用されるため、ベースポート(1234ではない)をログに記録します。
新規または確立された接続からのすべての着信パケットを一致させたいが、クライアントからのみ一致させたい場合は、次のようなものを使用する必要があります。
iptables -A INPUT -d <your_ip_address> -s <your_client_net>/<mask> -i <your_eth> -J <nfqueue stuff>
実際、私はあなたが何を意味するのか理解していません:
すべてのポートのtcpハンドシェイクを作成するには、このルールが機能する必要があります
何を達成しようとしているのか明確にできますか?