web-dev-qa-db-ja.com

すべての着信接続パケットをNFQUEUEに渡す方法

Linuxマシンに到着するパケットを検査するアプリケーションを開発しています。すべての着信接続パケットと着信パケットのみをNFQUEUEで送信したいと思います。 --state NEWだけでなく、クライアントによって開始される接続の場合は--state ESTABLISHED, RELATED

最後に、すべてのポートのtcpハンドシェイクを作成するには、このルールを追加で機能させる必要があります。

iptables -A PREROUTING -t nat -p tcp -match multiport! --dport 64646 -j REDIRECT --to-ports 1234

フローの例:

  1. 1.2.3.4によって開始されたサーバーへのssh接続(ポート22)
  2. サーバーはnfqueueにSYNを渡し、受け入れます
  3. リダイレクトルール(22-> 1234)
  4. pythonスクリプトはポート1234でリッスンしているため、SYN​​/ACKが送信されます
  5. クライアントはSYN/ACKを取得し、ACKを返します
  6. サーバーはnfqueueにACKを渡し、受け入れます
  7. リダイレクトルール(22-> 1234)
  8. クライアントはACK、DATAを返します
  9. サーバーはnfqueueにACK/DATAを渡します
  10. リダイレクトルール(22-> 1234)
  11. サーバーはプロトコルを知らず、常に同じメッセージを返し、接続は閉じられます。

どんな助けでも大歓迎です。

ありがとうございました!

1
vx3r

それが誰かに興味があるなら、私は解決策を見つけました。

# 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ではない)をログに記録します。

1
vx3r

新規または確立された接続からのすべての着信パケットを一致させたいが、クライアントからのみ一致させたい場合は、次のようなものを使用する必要があります。

iptables -A INPUT -d <your_ip_address> -s <your_client_net>/<mask> -i <your_eth> -J <nfqueue stuff>

実際、私はあなたが何を意味するのか理解していません:

すべてのポートのtcpハンドシェイクを作成するには、このルールが機能する必要があります

何を達成しようとしているのか明確にできますか?

0