免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2023 | 回复: 3
打印 上一主题 下一主题

[网络管理] 在服务器上用SNAT修改源IP时,服务响应包的源IP有时无法修改? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-25 17:56 |只看该作者 |倒序浏览
本帖最后由 owenwell 于 2015-07-25 17:58 编辑

服务器系统:ubuntu,iptables版本:1.4.2
net.ipv4.ip_forward=1
net.ipv4.ip_nonlocal_bind=1
需求:把本机 udp:端口 数据包的源IP修改为指定IP。
命令:iptables -t nat -A POSTROUTING -s 服务器IP -p udp --sport 端口 -j SNAT --to-source 指定IP

SSH到服务器上进行的测试

测试1:测试本机发出的包是否已经修改了
nc -u 本地计算机IP 端口
tcpdump -nn udp port 端口
nc中发送字符时,tcpdump中可以看到服务器使用的端口,例如:51369
iptables -t nat -A POSTROUTING -s 服务器IP -p udp --sport 51369 -j SNAT --to-source 指定IP
再次在nc中发送字符,在tcpdump中可以看到源IP已经修改为指定IP

测试2:测试服务器发出的响应包能否修改源地址
iptables -t nat -A POSTROUTING -s 服务器IP -p udp --sport 6000 -j SNAT --to-source 指定IP
nc -u -l 6000
1. 本地计算机发送数据包到服务器udp:6000,服务器收到发送的字符
2. 然后在服务器端发送字符,在tcpdump -nn udp port 6000中抓包发现,源IP并没有被修改
3. 保持nc的连接,清空nat链,并再次输入相同的iptables命令,如下:
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 服务器IP -p udp --sport 6000 -j SNAT --to-source 指定IP
4. 这时在tcpdump -nn udp port 6000中抓包发现,源IP已经被修改
5. 退出nc后,再次nc -u -l 6000,发现源IP又无法修改,此时检查nat链,刚才输入的命令是存在的。

问题1:请问这个SNAT命令必须在连接的过程中输入才生效吗?
问题2:如何稳定实现修改源IP的需求?

论坛徽章:
0
2 [报告]
发表于 2015-09-04 23:44 |只看该作者
我也发现有这个现象。
你的问题解决了没有?

论坛徽章:
1
IT运维版块每日发帖之星
日期:2016-07-14 06:20:00
3 [报告]
发表于 2015-09-10 20:02 |只看该作者
本帖最后由 ken1980 于 2015-09-10 20:04 编辑

注意netfilter的链接跟踪的优先级高于设置的规则,如果是已连接的包,直接用连接跟踪tuple里的信息修改IP地址,而不会到NAT表去查询规则,一条连接的第一个包(即状态为IP_CT_NEW)会查询规则,后续的包就不查询规则了,所以你测试1有效,测试2出问题

Linux/Net/Ipv4/Netfilter/nf_nat_standalone.c

case IP_CT_NEW:

                if (!nf_nat_initialized(ct, maniptype)) {
                        unsigned int ret;
                        if (unlikely(nf_ct_is_confirmed(ct)))
                                /* NAT module was loaded late */
                                ret = alloc_null_binding_confirmed(ct, hooknum);
                        else if (hooknum == NF_IP_LOCAL_IN)
                                /* LOCAL_IN hook doesn't have a chain!  */
                                ret = alloc_null_binding(ct, hooknum);
                        else
                                ret = nf_nat_rule_find(skb, hooknum, in, out,
                                                       ct)

论坛徽章:
0
4 [报告]
发表于 2015-09-13 18:26 |只看该作者
的确是conntrack导致的,非常感谢你的回答,tuple五元素,这时我后来才明白的。
还想请问一下,修改发出包的源ip这个操作,那种方法cpu资源占用最小?
1 用iptables的sant
2 自己编写netfilter的hook函数
或者其他的好方法?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP