基于某些原因,需要保证网络的icmp(internet control management protocol)的ping响应时延非常短,低丢包率,所以想到了一种通过linux的iptables的nat链表解决的方法;
1、保证ping的报文网络层面经过我们需要做策略的服务器;
这个方法可以对linux服务器配置两个网卡,一个网卡用于将数据包指向过来,一个网卡用于将数据包转发出去(实际上我们在进行策略的时候,就不转发出去了,但是为了保证我们对一些特殊的ip地址我们不进行策略,那么还是按照能转发出去算);
也可以就一个网卡,数据包先指向到这台设备(比如相邻设备先将网关设置为这台设备,然后这台设备设置网关为接入交换机);不过这种方式需要注意网关纠正,调整如下参数保证不进行网关纠正【注意,以下设置均为在客户端进行设置,而不是策略路由器,所以建议使用第一种方法】:
accept_redirects:该参数位于/proc/sys/net/ipv4/conf/DEV/accept_redirects(DEV表
示具体的网络接口),如果你的主机所在的网段中有两个路由器,你将其中一个设置成了缺省网关,但是该网关在收到你的ip包时发现该ip包必须经过另外一个路由器,这时这个路由器就会给你发一个所谓的“重定向”icmp包,告诉将ip包转发到另外一个路由器。参数值为布尔值,1表示接收这类重定向icmp 信息,0表示忽略。在充当路由器的linux主机上缺省值为0,在一般的linux主机上缺省值为1。
或者使用如下方式调整如下参数:
secure_redirects:前面我们已经提到过“安全重定向”的概念,其实所谓的“安全
重定向”就是只接受来自网关的“重定向”icmp包。该参数就是用来设置“安全重定向”功能的。参数值为布尔值,1表示启用,0表示禁止,缺省值为启用。
2、开启ip_forward转发[为了保证在不启用策略的ip地址可以正常通过];
sysctl -w net.ipv4.ip_forward=1
ipv6的转发sysctl -w net.ipv6.conf.all.forwarding=0
3、在策略设备上开启icmp转发:
iptables -t nat -A PREROUTING -p icmp -j REDIRECT
其实更精确的策略应该直接写成如下【只把ping的请求响应报文重定向到本地】:
iptables -t nat -A PREROUTING -p icmp –icmp-type 8/0 -j REDIRECT
4、如果需要只去往某ip地址的icmp进行响应,或者去往某ip的icmp不进行策略的话,如下设置:
只设置去往某些ip的icmp的ping进行重定向(只需要加-d参数加上ip地址或者ip地址段即可,多个ip或ip地址段则写多行):iptables -t nat -A PREROUTING -p icmp –icmp-type 8/0 -d 114.114.114.114 -j REDIRECT
设置去往某ip或者ip地址段的不进行icmp的重定向,则如下方法:
iptables -t nat -A PREROUTING -p icmp –icmp-type 8/0 -d 114.114.114.114 -j ACCEPT
做完如上设置之后,我们的策略设备就伪造源站进行icmp响应了;
如下为114.114.114.114的ping效果:
做策略之前[ping的时间延迟相对较长]:
[root@Tyumen]# ping 114.114.114.114
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=1 ttl=60 time=27.1 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=71 time=27.0 ms
64 bytes from 114.114.114.114: icmp_seq=3 ttl=89 time=27.0 ms
64 bytes from 114.114.114.114: icmp_seq=4 ttl=90 time=27.0 ms
64 bytes from 114.114.114.114: icmp_seq=5 ttl=86 time=27.0 ms
64 bytes from 114.114.114.114: icmp_seq=6 ttl=77 time=27.0 ms
64 bytes from 114.114.114.114: icmp_seq=7 ttl=68 time=27.1 ms
64 bytes from 114.114.114.114: icmp_seq=8 ttl=76 time=27.0 ms
做策略之后[ping的时间延迟相对较短]:
[root@Tyumen]# ping 114.114.114.114
PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data.
64 bytes from 114.114.114.114: icmp_seq=1 ttl=62 time=0.323 ms
64 bytes from 114.114.114.114: icmp_seq=2 ttl=62 time=0.330 ms
64 bytes from 114.114.114.114: icmp_seq=3 ttl=62 time=0.313 ms
64 bytes from 114.114.114.114: icmp_seq=4 ttl=62 time=0.274 ms
如下为23.236.117.4的ping效果:
做策略之前:
[root@Tyumen]# ping 23.236.117.4
PING 23.236.117.4 (23.236.117.4) 56(84) bytes of data.
64 bytes from 23.236.117.4: icmp_seq=1 ttl=61 time=234 ms
64 bytes from 23.236.117.4: icmp_seq=2 ttl=61 time=227 ms
64 bytes from 23.236.117.4: icmp_seq=3 ttl=61 time=240 ms
64 bytes from 23.236.117.4: icmp_seq=4 ttl=61 time=235 ms
64 bytes from 23.236.117.4: icmp_seq=5 ttl=61 time=240 ms
64 bytes from 23.236.117.4: icmp_seq=6 ttl=61 time=240 ms
64 bytes from 23.236.117.4: icmp_seq=7 ttl=61 time=241 ms
64 bytes from 23.236.117.4: icmp_seq=8 ttl=61 time=241 ms
做优化之后:
[root@Tyumen]# ping 23.236.117.4
PING 23.236.117.4 (23.236.117.4) 56(84) bytes of data.
64 bytes from 23.236.117.4: icmp_seq=1 ttl=62 time=0.328 ms
64 bytes from 23.236.117.4: icmp_seq=2 ttl=62 time=0.301 ms
64 bytes from 23.236.117.4: icmp_seq=3 ttl=62 time=0.300 ms
64 bytes from 23.236.117.4: icmp_seq=4 ttl=62 time=0.302 ms
64 bytes from 23.236.117.4: icmp_seq=5 ttl=62 time=0.273 ms
64 bytes from 23.236.117.4: icmp_seq=6 ttl=62 time=0.232 ms
64 bytes from 23.236.117.4: icmp_seq=7 ttl=62 time=0.228 ms
64 bytes from 23.236.117.4: icmp_seq=8 ttl=62 time=0.315 ms
64 bytes from 23.236.117.4: icmp_seq=9 ttl=62 time=0.307 ms
如果大家对自己的ttl时间不满意,可以在中间加几个网络设备和链路,然后调整一下中间策略设备的默认ttl值:
sysctl -w net.ipv4.ip_default_ttl=69
文章参考:
http://linux.ximizi.com/linux/linux2997.htm
http://blog.csdn.net/macrossdzh/article/details/5720135
https://en.wikipedia.org/wiki/Internet_Control_Message_Protocol