免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123下一页
最近访问板块 发新帖
查看: 10584 | 回复: 22

[网络管理] 为什么打了fwmark标记但却不起作用呢【已解决】 [复制链接]

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2014-08-20 13:39 |显示全部楼层
本帖最后由 jiufei19 于 2014-08-21 10:05 编辑

大家好,下面一个问题我一直没有找到错误出在哪里,请大家帮忙指正。

问题描述:

我希望某台linux主机允许来自任意客户端的ssh访问,而不是特定IP发来的ssh访问请求。换句话讲,ssh客户端的ip随时可能发生变化。下面是我的部分配置:

iptables -t mangle -A OUTPUT -p tcp --sport 22 -j MARK --set-mark 100

ip route add default via x.x.x.x table 300
ip rule add fwmark 100 table 300 pref 32759


该设置的思想是对凡是由该linux产生的对ssh客户端的应答都标记其fwmark为100,然后对此标记fwmark为100的数据设置策略路由为查路由表300,而路由表300中缺省路由为x.x.x.x。另外,之所以我要这样设计的原因是主路由表有其他设置,我不能使用主路由表的default来解决,于是必须使用策略,但是经过上述配置后,客户端将无法再访问linux了,说明路由出了问题,fwmark没有起到应有的作用。

请问大家,上面的配置哪里有问题?谢谢!


论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
发表于 2014-08-20 15:02 |显示全部楼层
tracert 一下看看 数据包是怎么走的.

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2014-08-20 15:30 |显示全部楼层
本帖最后由 jiufei19 于 2014-08-20 16:11 编辑
q1208c 发表于 2014-08-20 15:02
tracert 一下看看 数据包是怎么走的.


请问q1208c,我没有反应过来如何使用tracert来看数据包如何走呢?

下面是我在linux上执行traceroute时的结果,其中192.168.0.145是ssh客户端的当前ip,可见ssh的应答先走192.168.23.2这个网关,然后再到192.168.0.145。但是我在策略路由中也设置了表300的网关为192.168.23.2,按理没有问题啊,但是实际结果不正确只能是说明fwmark没有起作用。

[admin@fedora8 ~]$ traceroute 192.168.0.145
traceroute to 192.168.0.145 (192.168.0.145), 30 hops max, 40 byte packets
1  192.168.23.2 (192.168.23.2)  0.487 ms  0.231 ms  0.262 ms
2  192.168.0.145 (192.168.0.145)  15.292 ms  14.306 ms  13.539 ms

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2014-08-20 15:47 |显示全部楼层
本帖最后由 jiufei19 于 2014-08-20 16:14 编辑

我下面把设置后的策略和路由列出,便于大家帮我发现问题

[admin@fedora8 ~]$ ip rule list
0:                from all lookup local
32759:        from all fwmark 0x64 lookup 300
32766:        from all lookup main
32767:        from all lookup default
[admin@fedora8 ~]$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
192.168.23.0    *                   255.255.255.0   U        0      0        0   eth1
link-local            *                   255.255.0.0       U        0      0        0   eth1
default           192.168.23.2    0.0.0.0            UG        0      0        0   eth1
[admin@fedora8 ~]$ ip route show table 300
default via 192.168.23.2 dev eth1

此时,ssh客户端还可以访问linux,但是如果我将上面的红色字体的策略去掉,则将立刻无法再连接linux服务器了,因此显然是fwmark没有起作用,正是因为其没有起作用,所以之前红色字体的策略没有删除时,ssh请求的应答没有匹配策略32759,于是按主路由表进行操作,因此保证ssh客户端可以继续访问linux,而一旦去掉红色字体策略,而32759又不匹配,于是就出现了ssh客户端无法再访问linux的现象,为了进一步说明表300没有错误,我故意按如下策略进行了重复设置
[admin@fedora8 ~]$ ip rule list
0:        from all lookup local
32759:        from all fwmark 0x64 lookup 300
32766:        from all lookup 300
32767:        from all lookup default

此时ssh客户端仍然可以正常访问linux,这说明表300的设置是正确的,进一步说明了fwmark没有起作用。为什么会这样呢?一直对fwmark的使用不清晰。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
发表于 2014-08-20 16:20 |显示全部楼层
由于你指定了 端口22, 所以, 我建议你使用 tcp traceroute 看看会不会按你的路由来走.

论坛徽章:
12
技术图书徽章
日期:2014-07-11 16:27:5215-16赛季CBA联赛之山西
日期:2016-01-08 16:10:11操作系统版块每日发帖之星
日期:2015-08-01 06:20:002015亚冠之武里南联
日期:2015-06-11 01:12:162015年亚洲杯之阿联酋
日期:2015-03-20 11:41:462015年亚洲杯纪念徽章
日期:2015-03-18 18:08:422015年辞旧岁徽章
日期:2015-03-03 16:54:15丑牛
日期:2015-01-10 22:23:32天秤座
日期:2014-08-20 15:53:35水瓶座
日期:2014-08-11 12:08:51午马
日期:2014-07-23 23:03:38IT运维版块每日发帖之星
日期:2016-02-18 06:20:00
发表于 2014-08-20 16:27 |显示全部楼层
本帖最后由 phanx 于 2014-08-20 23:52 编辑

回复 4# jiufei19


    你应该在PREROUTING的时候做set-mark。
  1. iptables -t mangle -A PREROUTING -p tcp --sport 22 -j MARK --set-mark 100
复制代码


更正:对于本机发出的报文,PREROUTING没有效果。

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2014-08-20 16:28 |显示全部楼层
q1208c 发表于 2014-08-20 16:20
由于你指定了 端口22, 所以, 我建议你使用 tcp traceroute 看看会不会按你的路由来走.


不好意思,我没有理解q1208c的说明呢,q1208c看了我上面两个说明了吗?

另外,当我按fwmark设置后,在linux主机上面直接执行traceroute 192.168.0.145时,将看到“Network is unreachable”的提示信息

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2014-08-20 16:32 |显示全部楼层
phanx 发表于 2014-08-20 16:27
回复 4# jiufei19


为啥不能在OUTPUT这个chain做?我的本意就是要在linux的ssh服务发回应答的时候被标记为fwmark=100,以便后面路由处理。

此外,我也按phanx说的改在PREROUTING做了,可结果仍然不正确。

论坛徽章:
33
荣誉会员
日期:2011-11-23 16:44:17天秤座
日期:2014-08-26 16:18:20天秤座
日期:2014-08-29 10:12:18丑牛
日期:2014-08-29 16:06:45丑牛
日期:2014-09-03 10:28:58射手座
日期:2014-09-03 16:01:17寅虎
日期:2014-09-11 14:24:21天蝎座
日期:2014-09-17 08:33:55IT运维版块每日发帖之星
日期:2016-04-17 06:23:27操作系统版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-24 06:20:0015-16赛季CBA联赛之天津
日期:2016-05-06 12:46:59
发表于 2014-08-20 17:34 |显示全部楼层
回复 7# jiufei19

我看到你的说明了.

所以, 只有 tcp traceroute 才能触发你的 规则被mark上.

普通的traceroute使用的是 icmp协议, 你那规则用不上的.
   

论坛徽章:
1
IT运维版块每日发帖之星
日期:2015-11-17 06:20:00
发表于 2014-08-20 22:22 |显示全部楼层
回复 9# q1208c


    仔细看了下源码,发现主机的外出报文都是从ip_queue_xmit这个函数发出的,而这个函数中是首先进行路由,然后再调用NF_HOOK(NF_IP_LOCAL_OUT),也就是OUTPUT链,这样的话,之前我的策略配置就永远不会有效果了。所以,对于外出报文,可能fwmark的确无法起作用,而如果是转发报文,那么fwmark就可以起作用了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP