我正在尝试让在端口 1234 上运行的 TCP 服务看起来像是在端口 81 上运行。我认为以下方法可以做到这一点:
iptables -A PREROUTING -t nat -p tcp --dport 81 -j REDIRECT --to-port 1234
nc -l 1234
但是,如果我在一个终端中启动,然后nc 127.0.0.1 81
在另一个终端中启动,则无法连接。第二个终端nc
立即退出。tcpdump
告诉我:
$ sudo tcpdump -i lo -v
tcpdump: listening on lo, link-type EN10MB (Ethernet), capture size 65535 bytes
07:54:21.628583 IP (tos 0x0, ttl 64, id 60458, offset 0, flags [DF], proto TCP (6), length 60)
localhost.45729 > localhost.81: Flags [S], cksum 0xfe30 (incorrect -> 0x06a3), seq 4232210875, win 43690, options [mss 65495,sackOK,TS val 755089 ecr 0,nop,wscale 6], length 0
07:54:21.628595 IP (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto TCP (6), length 40)
localhost.81 > localhost.45729: Flags [R.], cksum 0x98dc (correct), seq 0, ack 4232210876, win 0, length 0
看起来好像尝试了连接,然后立即重置。我看到校验和不正确——这是个问题吗?如果是,我该如何修复?
另一个nc
正在监听端口 1234,已验证netstat
并尝试直接连接端口 1234,成功。
奇怪的是,似乎根本没有任何东西与 PREROUTING nat 表匹配:
$ sudo iptables -t nat -L -n -v
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REDIRECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:81 redir ports 1234
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 2 packets, 120 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 2 packets, 120 bytes)
pkts bytes target prot opt in out source destination
请注意计数器为 0,尽管我多次尝试与上述情况建立联系nc
。现在,我的理解是所有流量都应该通过该PREROUTING
链,所以我应该看到一些东西。怎么回事?
答案1
NAT 重定向对来自和到本地主机的流量均不起作用。请尝试从 LAN 上的另一个系统进行操作。
编辑:尝试看看这个问题,它处理让非特权守护进程监听特权端口的问题。第一个答案没有帮助,但下一个答案应该有帮助。
至于告诉你它不起作用是否没有帮助,你完全可以自由地这么认为。不过请注意,我让你知道你没有实现问题,从而节省了你调试 NAT 规则的时间;相反,问题是你无法以你想要的方式做你想做的事情。可能只有 Rusty Russell 可以告诉你为什么它不起作用。