我有一个相当不寻常的网络设置。它从互联网上的 vps 开始。使用多年,从未出现过连接问题。在它上面,我安装了我的 ip-networkstack-in-userspace (从现在开始为“MyIP”;它已经在互联网上的其他地方运行,提供 sip 和 http,所以它可以工作,至少对于基础知识来说足够好)。
现在我想将通过 vps 上的 eth0 传入的任何 UDP 端口 161 流量重定向到虚拟网络接口。由于某种原因,通常的 iptables 规则不起作用; tcpdump 显示虚拟接口上没有流量,并且 ip 堆栈(“MyIP”)也没有显示接收任何内容的迹象(甚至没有 ARP)。
internet -> vps[eth0, 37.34.63.177] -> vps[myip, 192.168.4.1] -> MyIP[myip, 192.168.4.2]
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 161 -j LOG --log-prefix "DNAT: " --log-level 0
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 161 -j DNAT --to 192.168.4.2:161
iptables -A FORWARD -d 192.168.4.2 -p udp --dport 161 -j LOG --log-prefix "FWD: " --log-level 0
iptables -A FORWARD -d 192.168.4.2 -p udp --dport 161 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --destination-port 161 -j ACCEPT
现在,如果我在 eth0 上进行 tcpdump,我会看到传入的请求。“myip”网络接口上的 tcpdump 没有显示任何内容。 dmesg 也没有任何内容,并且 iptables -t nat -L -n -v 显示没有增加计数器。
因此,要么无法将数据包转发到虚拟网络接口(这会影响 VPN),要么我的 iptables 规则错误。有人有主意吗?
(不要认为这是 MTU 问题,因为数据包通常小于 200 字节)
答案1
这假设您已经擦除了损坏的规则并处理了 INPUT 链中的 SSH 规则
您的 DNAT 声明应如下所示:
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 161 -j LOG --log-prefix "DNAT: " --log-level 0
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 161 -j DNAT --to 192.168.4.2:161
您的 FORWARD 语句应如下所示:
iptables -A FORWARD -d 37.34.63.177 -p udp --dport 161 -j LOG --log-prefix "FWD: " --log-level 0
iptables -A FORWARD -d 37.34.63.177 -p udp --dport 161 -j ACCEPT
最后允许返回流量:
iptables -A FORWARD -o eth0 -p udp -s 192.168.4.2 --sport 161 -m state --state RELATED,ESTABLISHED -j ACCEPT
DNAT 确实不需要 INPUT 语句来工作