首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IPtables SNAT吃包

IPtables SNAT吃包
EN

Server Fault用户
提问于 2012-10-24 01:02:47
回答 3查看 5.7K关注 0票数 3

我正在尝试将具有源端口X的传出UDP数据包转换为Y的源端口。

我使用以下iptables规则完成了此操作:

代码语言:javascript
复制
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配置,与特定应用程序相关的规则不会影响到这一点。

代码语言:javascript
复制
# 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
EN

回答 3

Server Fault用户

发布于 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语句之前插入它。因为我没有更多的细节,所以我无法判断是错误还是故意的。

票数 4
EN

Server Fault用户

发布于 2012-10-24 01:12:51

我本以为会看到这样的景象:

代码语言:javascript
复制
iptables -t nat -A POSTROUTING -s 10.0.0.1 -p udp --dport X -j SNAT --to-port Y
票数 0
EN

Server Fault用户

发布于 2017-08-25 17:53:36

也许有一项服务已经监听了那个端口。iptables's SNAT翻译时,将尽量保持原包中的端口,如果这个端口不可用,它将使用另一个端口。

我遇到了这个问题,试图SNAT一个DNS服务器的答复。这导致从端口1发送答复,因为DNS服务器已经在使用端口53。

解决方案是让dns服务器监听另一个端口,将传入的通信量从目的端口53重定向到目的端口X,然后SNAT也将端口从X重写为53。

票数 0
EN
页面原文内容由Server Fault提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://serverfault.com/questions/441615

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档