如何将所有传入的连接数据包传递给 NFQUEUE

如何将所有传入的连接数据包传递给 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. 服务器将 SYN 传入 nfqueue 并接受
  3. 重定向规则(22 -> 1234)
  4. python 脚本正在监听端口 1234,因此发送 SYN/ACK
  5. 客户端收到 SYN/ACK 并返回 ACK
  6. 服务器将 ACK 传入 nfqueue 并接受
  7. 重定向规则(22 -> 1234)
  8. 客户端返回ACK,DATA
  9. 服务器将 ACK/DATA 传入 nfqueue
  10. 重定向规则(22 -> 1234)
  11. 服务器不知道协议并且总是返回相同的消息,连接被关闭。

任何帮助都将非常感激。

谢谢你!

答案1

如果有人感兴趣的话我找到了解决方案。

# 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)。

答案2

如果您想要匹配所有来自新的或已建立的连接(但仅来自您的客户端)的传入数据包,您应该使用如下方法:

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

其实我不明白你的意思:

为了使所有端口都进行 TCP 握手,我需要此规则起作用

你能解释一下你想要实现什么吗?

相关内容