我开发了一个应用程序来检查到达 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.2.3.4 发起到我的服务器的 ssh 连接(端口 22)
- 服务器将 SYN 传入 nfqueue 并接受
- 重定向规则(22 -> 1234)
- python 脚本正在监听端口 1234,因此发送 SYN/ACK
- 客户端收到 SYN/ACK 并返回 ACK
- 服务器将 ACK 传入 nfqueue 并接受
- 重定向规则(22 -> 1234)
- 客户端返回ACK,DATA
- 服务器将 ACK/DATA 传入 nfqueue
- 重定向规则(22 -> 1234)
- 服务器不知道协议并且总是返回相同的消息,连接被关闭。
任何帮助都将非常感激。
谢谢你!
答案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 握手,我需要此规则起作用
你能解释一下你想要实现什么吗?