免费注册 查看新帖 |

Chinaunix

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

[网络子系统] iptables 打标记+iproute2 fwmark 方式做双出口负载均衡 返回数据包无法进行nat转换 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2016-02-25 16:55 |只看该作者 |倒序浏览
5可用积分
实际测试的服务器采用debian6(内核2.6.32)

配置如下:
eth0:外网1,接口IP:10.0.1.2/24 网关:10.0.1.1
eth1:外网2,接口IP:10.0.2.2/24 网关:10.0.2.1
eth2:内网,接口IP:192.168.10.0/24
内网测试PC ,IP:192.168.10.120 通过交换机连接到eth2



设置iptables:对内网IP 192.168.10.120 打标签1
iptables -t mangle -A  PREROUTING -s 192.168.10.120    -j MARK --set-mark 0x1


设置nat:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth0 -j MASQUERADE
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -o eth1 -j MASQUERADE

设置两个策略路由表table10和table20:
ip route add default via 10.0.1.1 table 10   
ip route add 192.168.10.0/24 dev eth2 table 10
ip route add default via 10.0.2.1 table 20   
ip route add 192.168.10.0/24 dev eth2 table 20

设置策略路由规则:、标志位1的走出口eth0
/bin/ip rule add fwmark 1 priority 100 table 10

通过以上配置后发现无法上网,tcpdump显示返回数据包无法进行nat转换!
例如 在PC 上  ping 218.201.25.131
在eth2 上只能抓到 源地址为192.168.10.120 目的地址为218.201.25.131 的request 包  没有reply包
在eth0 上可以抓到 源地址为10.0.1.2 目的地址为218.201.25.131 的request 包  和 源地址为218.201.25.131 目的地址为10.0.1.2 的reply  包

最佳答案

查看完整内容

检查一下conntrack,按理说conntrack会把返回报文的目的ip改成内网ip的(关注一下应答方向的的counter是不是在增加)。同时检查一下ip route cache,对应答报文(注意是dnat后的,即目的ip已被修改为内网ip)的路由是不是eth0?会不会是反向路由检查的限制(检查一下接口的rp_filter配置)?对于dnat之后的应答报文(来自eth0)218.201.25.131 -> 192.160.10.120,如果rp_filter开启,会内部检查一下,逆向的报文(192.160.10.120- ...

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
2 [报告]
发表于 2016-02-25 16:55 |只看该作者
检查一下conntrack,按理说conntrack会把返回报文的目的ip改成内网ip的(关注一下应答方向的的counter是不是在增加)。

同时检查一下ip route cache,对应答报文(注意是dnat后的,即目的ip已被修改为内网ip)的路由是不是eth0?

会不会是反向路由检查的限制(检查一下接口的rp_filter配置)?

对于dnat之后的应答报文(来自eth0)218.201.25.131 -> 192.160.10.120,
如果rp_filter开启,会内部检查一下,逆向的报文(192.160.10.120->218.201.25.131)是不是从eth0出去。
注意这个过程没有iptables的参与,也就打不上mark,也就无法进入table10/20,只能走默认路由eth1,
这跟eth0不匹配, 相应的rt_cache的in_martian_src计数会增加。

搜素fib_validate_source
http://lxr.free-electrons.com/source/net/ipv4/fib_frontend.c#L409

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
3 [报告]
发表于 2016-02-26 18:17 |只看该作者
本帖最后由 nswcfd 于 2016-03-02 10:39 编辑

负载均衡在哪里体现的?

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
4 [报告]
发表于 2016-02-26 18:40 |只看该作者
默认路由是什么?

论坛徽章:
0
5 [报告]
发表于 2016-03-02 09:45 |只看该作者
默认路由设置的eth1 口

论坛徽章:
20
程序设计版块每日发帖之星
日期:2015-08-17 06:20:00程序设计版块每日发帖之星
日期:2016-07-16 06:20:00程序设计版块每日发帖之星
日期:2016-07-18 06:20:00每日论坛发贴之星
日期:2016-07-18 06:20:00黑曼巴
日期:2016-12-26 16:00:3215-16赛季CBA联赛之江苏
日期:2017-06-26 11:05:5615-16赛季CBA联赛之上海
日期:2017-07-21 18:12:5015-16赛季CBA联赛之青岛
日期:2017-09-04 17:32:0515-16赛季CBA联赛之吉林
日期:2018-03-26 10:02:16程序设计版块每日发帖之星
日期:2016-07-15 06:20:0015-16赛季CBA联赛之江苏
日期:2016-07-07 18:37:512015亚冠之萨济拖拉机
日期:2015-08-17 12:21:08
6 [报告]
发表于 2016-03-02 10:29 |只看该作者
不好意思,之前没看到table 10、table 20里的default路由。

招聘 : c/c++研发
论坛徽章:
0
7 [报告]
发表于 2016-03-15 17:55 |只看该作者
-MARK是将对应的数据包打上mark值
-CONNMARK是将数据包对应的流打上mark值
你这里用-MARK只是对出去的数据包打了mark,对返回的数据包,由于没有匹配iptables -t mangle -A  PREROUTING -s 192.168.10.120    -j MARK --set-mark 0x1,所以返回的数据包没打上mark,自然也没法在table 10里面找路由了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP