- 主题:iptables的SNAT问题
- tcp的协议貌似都正常,没啥问题
 但是,udp的好像有问题
 
 用conntrack -L查看的结果如下
 udp      17 25 src=192.168.1.4 dst=222.0.0.88 sport=56473 dport=30099 [UNREPLIED] src=222.0.0.88 dst=202.0.0.31 sport=30099 dport=56473 mark=0 use=1
 
 内网A机器ip是192.168.1.4,iptables所在机器B的ip是202.0.0.31,对端服务器C的ip是222.0.0.0.88
 
 B机器做了SNAT地址转换,使内网A机器可以上网,这个都没问题,但是
 A访问C服务器的udp端口,感觉数据包能出去,但是,回不来
 这是什么问题呢?怎么解决呢?
 这个conntrack的结果显示UNREPLIED显然是不对的,正常的应该显示ASSURED
 --
 FROM 202.98.17.*
 
- B上iptables是否允许UDP转发?是否允许UDP的应答包?
 iptables的转发、nat、conntrack是比较复杂的,需要仔细检查。
 
 【 在 leeyc 的大作中提到: 】
 : tcp的协议貌似都正常,没啥问题
 : 但是,udp的好像有问题
 : 用conntrack -L查看的结果如下
 : ...................
 --
 FROM 111.196.240.*
 
- B上的iptables
 -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
 
 有这一条其实就够了吧
 没限制协议,icmp、tcp、udp全部允许通过的
 -A FORWARD -d 192.168.1.0/24 -j ACCEPT
 -A FORWARD -s 192.168.1.0/24 -j ACCEPT
 这个也有
 
 【 在 k7amd 的大作中提到: 】
 : B上iptables是否允许UDP转发?是否允许UDP的应答包?
 : iptables的转发、nat、conntrack是比较复杂的,需要仔细检查。
 --
 FROM 202.98.17.*
 
- A上TCP能通,UDP不通。
 如果iptables看起来没问题(比如,没有其它SNAT/DNAT项、没有在OUTPUT丢弃),
 测试B能否访问C的UDP。
 
 【 在 leeyc 的大作中提到: 】
 : B上的iptables
 : -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
 : 有这一条其实就够了吧
 : ...................
 --
 FROM 111.196.240.*
 
- B访问C的udp肯定没问题
 
 目前b上也有udp的服务在跑,一切正常。
 
 而且,同样的问题,在我另外的一个机器上也遇到了
 只不过,另外的那个环境下,A是个手机上的voip客户端,C是sip服务器
 a能连上c的sip服务器,但是打不了电话,说明从a到c通,但是从a收不到c返回来的udp包
 
 【 在 k7amd 的大作中提到: 】
 : A上TCP能通,UDP不通。
 : 如果iptables看起来没问题(比如,没有其它SNAT/DNAT项、没有在OUTPUT丢弃),
 : 测试B能否访问C的UDP。
 : ...................
 --
 FROM 202.98.17.*
 
- 你这是MADQUERADE,不是SNAT啊...
 
 如果说你的POSTROUTING里面就这一条MASQUERADE,理论上udp转发也就OK了。
 如果你用了DNAT,那你才需要搭配SNAT让udp包能正确返回。
 
 我建议是在堡垒机上tcpdump下看看有没有收到返回的udp包,再找找别的地方那里把udp包过滤掉了。你的情况按理说应该能work
 
 【 在 leeyc 的大作中提到: 】
 : B上的iptables
 : -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
 : 有这一条其实就够了吧
 : ...................
 --
 FROM 180.111.27.*
 
- MASQUERADE跟SNAT一样,只是动态地址伪装而已
 不要纠结这个
 之前有兄弟说openwrt上也用iptables,我那个路由器正好就是openwrt的系统,在那个路由器上就没问题
 我还特意跑那个路由器上去看他的iptables配置,openwrt的iptables太复杂了,没太看明白
 但是,FORWARD部分,openwrt啥也没配置,只是在POSTROUTING和PREROUTING配置了
 感觉也没有太特殊的东西啊
 为啥我在机器上配iptables就不行呢
 网上找到的答案,基本所有的都是加一条SNAT规则完事的那种,也鲜有人提到我的这个问题
 
 【 在 lvsoft 的大作中提到: 】
 : 你这是MADQUERADE,不是SNAT啊...
 : 如果说你的POSTROUTING里面就这一条MASQUERADE,理论上udp转发也就OK了。
 : 如果你用了DNAT,那你才需要搭配SNAT让udp包能正确返回。
 : ...................
 --
 FROM 202.98.17.*
 
- 有可能需要应用层处理模块,像ftp那样的。
 
 能否穿越nat主要看应用有没有具体的限制。比如我弄个自定义协议,发送端把源IP和目的IP加密放进载荷,在接收端解密,如果源IP无法访问就丢弃,这样的协议就不能穿过NAT。
 
 【 在 leeyc 的大作中提到: 】
 : MASQUERADE跟SNAT一样,只是动态地址伪装而已
 : 不要纠结这个
 : 之前有兄弟说openwrt上也用iptables,我那个路由器正好就是openwrt的系统,在那个路由器上就没问题
 : ...................
 --
 FROM 159.226.95.*
 
- 感觉还是哪里设置不对,缺少配置
 导致返回的数据包丢失
 数据包能出去,回不来
 
 【 在 k7amd 的大作中提到: 】
 : 有可能需要应用层处理模块,像ftp那样的。
 : 能否穿越nat主要看应用有没有具体的限制。比如我弄个自定义协议,发送端把源IP和目的IP加密放进载荷,在接收端解密,如果源IP无法访问就丢弃,这样的协议就不能穿过NAT。
 :
 --
 FROM 202.98.17.*
 
- 他说的对,我记得sip是有mod的。
 你看看有没有nf_conntrack_sip这个模块。
 
 此外可以先用netcat测试下udp通不通
 
 【 在 leeyc 的大作中提到: 】
 : 感觉还是哪里设置不对,缺少配置
 : 导致返回的数据包丢失
 : 数据包能出去,回不来
 : ...................
 --
 FROM 180.111.27.*