#iptables实践# 之 MSS Clamping

  •     背景

    如果你还不知道何为MSS Clamping,网上很容易搜索,或者你可以直接google "Cisco TCP MSS Adjustment", 第一个结果就能满足你的需求(baidu我就不清楚了:))。
    之所以我会推荐你搜索Cisco的资料,并不是因为我旁征博引,博览群书,而是因为我最早也是通过Cisco的文档涨了这个姿势的,也算是饮水思源吧。


  •     正题

    iptables很强大,能够提供各种你想得到或者想不到的功能,我们的iptables实践之旅就从MSS Clamping开始吧。

    如果你已经阅读了背景资料,知道了为什么需要MSS Clamping, 下面就来看看具体的实现。

    实验环境如下:

                                   (10.237.101.93)
Client ---------------- Router ---------------- Server
(192.168.28.162)                                    (10.237.10.81)

    其中Client处于路由器的内网中,在访问Server时会经过SNAT将源ip地址转换为Router的外部地址10.237.101.93
    为了方便测试,分别将ClientServer上的接口MTU改为15011502,如下图:

Client:

#iptables实践# 之 MSS Clamping_第1张图片

Server:

#iptables实践# 之 MSS Clamping_第2张图片

Router上添加配置如下:

iptables -t mangle -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 576

    好了,准备工作完成了,下面开始实际的测试。

    在Server上随便找一个开放的端口,并在Client上使用telnet发起连接,同时在两边分别抓包如下:

Client

Server

    可以看到,tcp握手包中的MSS值在经过Router后被修改为我们指定的值(576)了。


  •     后续

    以上就讲完了在路由器或防火墙上实现MSS Clamping的方法,通过man iptables可以学习更多的细节,相关的内容在TCPMSS一节,其中还描述了几个问题场景便于理解。除了上面演示中使用的--set-mss选项手工指定mss值之外,还可以使用--clamp-mss-to-pmtu选项,该选项会根据path mtu的值自动进行MSS调整。在2.6.25内核之前,该选项只考虑去往目的地址方向的path mtu,在之后的内核中,去往源地址方向的path mtu也被考虑进来了,也就是说,在上面的测试环境下(路径上只有一台Router,不用考虑其他RouterMTU影响),如果路由器两个接口上的MTU不同,则MSS调整值将以较小的MTU为准。


哦,对了,TCP Clamping的功能是在mangle表的forward链上实现的,你应该已经知道了吧:)



你可能感兴趣的:(iptables,TCPMSS)