我正在尝试使用 iptables 将 eth0 上的传入数据包重定向到在环回接口上侦听的服务。基于此链接我正在尝试制定以下规则:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT -o lo --to-port 80
但我收到以下显示的错误:
Can't use -o with PREROUTING
手册页解释了为什么这不起作用:
(REDIRECT) redirects the packet to the machine itself by changing the
destination IP to the primary address of the incoming interface
我如何接收传入的数据包并将其传送至环回接口?
答案1
你为什么要添加-o lo
?这没有必要,也不起作用,甚至不在你链接的教程中。只需将其删除即可。
答案2
您使用 iptables 的解决方案应该可行,但不幸的是,Linux 内核不允许这样做,因为内核代码将每个目标地址为 127/8 的传入数据包视为“火星人”,并且不会接受它。
你可以通过以下方式看到这一点:
sysctl -w net.ipv4.conf.eth0.log_martians=1
允许其流量到 127/8 子网使用路由本地网络
# sysctl -w net.ipv4.conf.eth0.route_localnet=1
或者
$ echo 1 | sudo tee proc/sys/net/ipv4/conf/eth0/route_localnet
并检查设置。
$ cat /proc/sys/net/ipv4/conf/eth0/route_localnet
设置 /proc/sys/net/ipv4/conf/eth0/route_localnet 后,dnat 为 127.0.0.1 将起作用。
答案3
使用模型演示iptables 及其伪装功能,尝试重定向到 127.0.0.1 这是您的环回,对吗?