阿毛
It's me !
想你所想

检查指定网络连通shell

最近一个月一直在处理一个任务,将业务数据,上报至指定政府部门。
整个过程实现如下:
报送的数据以约定的文件格式存储,最终通过ftp上传至指定ip。当然整个链路都是内网交互,通过vpn至政府局域网,这样ftp的ip才可访问。vpn链路是通过起了一个docker完成的。数据产生后实时上报的过程是通过代码和shell完成的。因为偶尔会发现vpn莫名的挂掉,这就导致了后续ftp失败。所以需要在shell脚本ftp上传前进行vpn的连通保证。

日常检测ip可达一般都是通过ping去判断,所以这里也可以利用ping的逻辑去检测vpn,如果ping失败,则重启docker,保证vpn链路(这里我们的vpn docker重启,即可链路连通),ping 成功则可ftp逻辑。

因为一般实用ping,大多数情况都是直接 ping *ip* 这样使用,但这样执行,命令会一直执行,一直重复发包过程,无论成功还是失败,所以此处使用,需要结合 ping 命令的参数项,如下方表格内容(表格内容来自:https://www.jianshu.com/p/0cb93b7b4f64

参数 详解
-a Audible ping.
-A 自适应ping,根据ping包往返时间确定ping的速度;
-b 允许ping一个广播地址;
-B 不允许ping改变包头的源地址;
-c count ping指定次数后停止ping;
-d 使用Socket的SO_DEBUG功能;
-F flow_label 为ping回显请求分配一个20位的“flow label”,如果未设置,内核会为ping随机分配;
-f 极限检测,快速连续ping一台主机,ping的速度达到100次每秒;
-i interval 设定间隔几秒发送一个ping包,默认一秒ping一次;
-I interface 指定网卡接口、或指定的本机地址送出数据包;
-l preload 设置在送出要求信息之前,先行发出的数据包;
-L 抑制组播报文回送,只适用于ping的目标为一个组播地址
-n 不要将ip地址转换成主机名;
-p pattern 指定填充ping数据包的十六进制内容,在诊断与数据有关的网络错误时这个选项就非常有用,如:“-p ff”;
-q 不显示任何传送封包的信息,只显示最后的结果
-Q tos 设置Qos(Quality of Service),它是ICMP数据报相关位;可以是十进制或十六进制数,详见rfc1349和rfc2474文档;
-R 记录ping的路由过程(IPv4 only);
注意:由于IP头的限制,最多只能记录9个路由,其他会被忽略;
-r 忽略正常的路由表,直接将数据包送到远端主机上,通常是查看本机的网络接口是否有问题;如果主机不直接连接的网络上,则返回一个错误。
-S sndbuf Set socket sndbuf. If not specified, it is selected to buffer not more than one packet.
-s packetsize 指定每次ping发送的数据字节数,默认为“56字节”+“28字节”的ICMP头,一共是84字节;
包头+内容不能大于65535,所以最大值为65507(linux:65507, windows:65500);
-t ttl 设置TTL(Time To Live)为指定的值。该字段指定IP包被路由器丢弃之前允许通过的最大网段数;
-T timestamp_option 设置IP timestamp选项,可以是下面的任何一个:’tsonly’ (only timestamps)’tsandaddr’ (timestamps and addresses)’tsprespec host1 [host2 [host3]]’ (timestamp prespecified hops).
-M hint 设置MTU(最大传输单元)分片策略。可设置为:’do’:禁止分片,即使包被丢弃;’want’:当包过大时分片;’dont’:不设置分片标志(DF flag);
-m mark 设置mark;
-v 使ping处于verbose方式,它要ping命令除了打印ECHO-RESPONSE数据包之外,还打印其它所有返回的ICMP数据包;
-U Print full user-to-user latency (the old behaviour).Normally ping prints network round trip time, which can be different f.e. due to DNS failures.
-W timeout 以毫秒为单位设置ping的超时时间;
-w deadline deadline;

一般ip可ping通,结果如下:

https://file.blog.humh.cn/2020/10/d2b5ca33bd970f64a6301fa75ae2eb22.png

ping不通如下:

https://file.blog.humh.cn/2020/10/d2b5ca33bd970f64a6301fa75ae2eb22-1.png

因为默认无限次重试,所以ctrl+c结束,所以shell中我们只需要控制重试次数即可。并且如果ip不可达,会百分百丢包,即“100.0% packet loss”的输出。
最终shell如下:

# 检测vpn
# 通过ping 一次,超时时间限制5秒,如果不通,则会出现"100% packet loss"错误,然后重启vpn对应docker
# 192.168.10.10 为vpn连通后,ftp服务地址。ftp地址处于vpn局域网网段内。
check_vpn(){
    ping_error_count=$(ping -c 1 -w 5 192.168.10.10 | grep '100% packet loss' | wc -l)
    if [ ${ping_error_count} != "0" ]
    then
        docker_id=$(docker ps -a --filter 'name=strongswan' -q)
        # 重启wa vpn docker
        docker restart ${docker_id}
        echo $(date) restart vpn, docker_id ${docker_id}, restart result $? >> /logs/wa_ftp_upload.log
    fi
}

ping “192.168.10.10” 一次,如果超时时间超过5秒,则停止,如果输出信息百分百丢包,即“grep '100% packet loss' | wc -l” 不为0,则说明ip不通。

humh

文章作者

站长本人,一个憨批!

发表评论

textsms
account_circle
email

想你所想

检查指定网络连通shell
最近一个月一直在处理一个任务,将业务数据,上报至指定政府部门。整个过程实现如下:报送的数据以约定的文件格式存储,最终通过ftp上传至指定ip。当然整个链路都是内网交互,通过vpn至政…
扫描二维码继续阅读
2020-10-08