我正在尝试将具有源端口X的传出UDP数据包转换为Y的源端口。
我使用以下iptables规则完成了此操作:
iptables -t nat -A POSTROUTING -s 10.0.0.1 -p udp --sport X -j SNAT --to-source 10.0.0.1:Y当生成具有源端口X的数据包时,此规则的计数器会增加,但在此之后将完全消失。我无法在任何其他链或表的计数器中找到它们,也无法在使用tcpdump的任何接口上看到它们。
如果删除该规则,则可以在源端口X中很好地接收数据包,但一旦我将规则放回,数据包就会消失。
我使用的是在Voyage上运行的iptables版本v1.2.11。我无法轻松地进行更新,因为这需要在几百个远程设备上完成。
我做错了什么?
编辑:在下面添加的iptables配置,与特定应用程序相关的规则不会影响到这一点。
# Clear any existing rules
iptables -v -t filter -F
iptables -v -t nat -F
iptables -v -t mangle -F
iptables -v -t filter -X
iptables -v -t nat -X
iptables -v -t mangle -X
# Policies
iptables -t mangle -P PREROUTING ACCEPT
iptables -t nat -P PREROUTING ACCEPT
iptables -t filter -P INPUT DROP
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD DROP
# Allow established connections.
iptables -t filter -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -t filter -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t filter -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t filter -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allow localhost to talk to itself.
iptables -t filter -A INPUT -i lo -j ACCEPT
# Drop stealth scan.
iptables -t filter -A INPUT -p tcp -s 0/0 -d 0/0 --tcp-flags ALL NONE -j DROP
iptables -t filter -A INPUT -p tcp -s 0/0 -d 0/0 --tcp-flags ALL ALL -j DROP
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
# Allow forwarding from LAN to WAN.
iptables -t filter -A FORWARD -i lanif -o wanif -j ACCEPT
# The NAT, strict with fixed IP address - might be different with a DHCP assigned WAN_IP
iptables -t nat -A POSTROUTING -o wanif -j SNAT --to-source $WAN_IP
iptables -t nat -A POSTROUTING -m mark --mark 11 -j ACCEPT
# Change source port X to Y - why does this not work???
iptables -t nat -A POSTROUTING -s lanif -p udp --sport X -j SNAT --to-source wanif:Y发布于 2012-11-02 23:23:35
我做错了什么?
可能什么都没有。这是数据包穿越Netfilter的方式。
请将此图表作为参考:

(资料来源:Iptable教程1.2.1,Oskar Andreasson,2006年)
我在其他链子或桌子的柜台上找不到它们。
SNAT是最终的Netfilter目标,之后数据包不会出现在同一个链中。POSTROUTING-chain in nat-table是数据包可以遍历Netfilter框架的绝对最终表。在mangle/POSTROUTING中,Tcpdump被附加到一个相当均衡的阶段。
并且无法在使用tcpdump的任何接口上看到它们。这是因为tcpdump在进行
SNAT编辑之前就会看到数据包。
真的有什么不对劲吗?这听起来像完全正常的Netfilter-tcpdump转储怪事。
编辑:您的SNAT语句最终会发生。也许您需要在-o wanif -j SNAT --to-source $WAN_IP语句之前插入它。因为我没有更多的细节,所以我无法判断是错误还是故意的。
发布于 2012-10-24 01:12:51
我本以为会看到这样的景象:
iptables -t nat -A POSTROUTING -s 10.0.0.1 -p udp --dport X -j SNAT --to-port Y发布于 2017-08-25 17:53:36
也许有一项服务已经监听了那个端口。iptables's SNAT翻译时,将尽量保持原包中的端口,如果这个端口不可用,它将使用另一个端口。
我遇到了这个问题,试图SNAT一个DNS服务器的答复。这导致从端口1发送答复,因为DNS服务器已经在使用端口53。
解决方案是让dns服务器监听另一个端口,将传入的通信量从目的端口53重定向到目的端口X,然后SNAT也将端口从X重写为53。
https://serverfault.com/questions/441615
复制相似问题