对于 Linux 下 ping 命令的随笔
我们知道, Linux 下有很多命令, 大体上可以分为如下几类:
文件管理
文档编辑
文件传输
磁盘管理
磁盘维护
网络通讯
系统管理
系统设置
备份压缩
设备管理
我们现在具体分析一下网络通讯里头的一个命令: ping.
1.ping 命令有什么作用
Ping 是潜水艇人员的专用术语, 表示回应的声纳脉冲, 在网络中 Ping 是一个十分好用的 TCP/IP 工具. 它主要的功能是用来检测网络的连通情况和分析网络速度.
2.ping 命令背后的 ICMP 协议
Linux ping 命令用于检测主机. 执行 ping 指令会使用 ICMP 传输协议, 发出要求回应的信息, 若远端主机的网络功能没有问题, 就会回应该信息, 因而得知该主机运作正常. 所以, 在进一步说明 ping 命令之前, 我们不妨先了解下 ICMP 协议.
2.1 为什么会有 ICMP 协议?
在 IP 通信中, 经常有数据包到达不了对方的情况. 原因是, 在通信途中的某处的一个路由器由于不能处理所有的数据包, 就将数据包一个一个丢弃了. 或者, 虽然到达了对方, 但是由于搞错了端口号, 服务器软件可能不能接受它. 这时, 在错误发生的现场, 为了联络而飞过来的信鸽就是 ICMP 报文. 在 IP 网络上, 由于数据包被丢弃等原因, 为了控制将必要的信息传递给发信方. ICMP 协议是为了辅助 IP 协议, 交换各种各样的控制信息而被制造出来的. 可以说, 它分担了 IP 协议的一部分功能.
2.2ICMP 协议有何功能?
1. 确认 IP 包是否成功到达目标地址 , 如果没有告知原因 -- 差错报文
2. 向对方计算机询问一些问题, 比如调查自己网络的子网掩码, 取得对方机器的时间信息等 -- 这其实就是后面要说到的 ping 命令 -- 请求与响应.
2.3ICMP 协议报文的结构:
根据报文结构, 我们来说说两种报文, 先说说差错报文.
举一个例子, 最近我们正好过双十一, 现在我们好比是给另外一个城市送快递. 现在快递服务顾客不满意, 顾客就用 ICMP 来反映投诉. 常见情况如下:
1. 终点不可达: 比如我们主机的运输层写了个错误的端口号, 结果 ip 包送过去, 到了对方的主机上, 对方没有对应的端口接受, 被退回来了. 就相当于发快递的地址, 可能是门牌号, 可能是小区号, 可能干脆省份都写错了, 查无此人, 只能被退回来, 那么 ICMP 就会汇报为什么送不到, 用字段表示: 网络不可达代码为 0, 主机不可达代码为 1, 协议不可达代码为 2, 端口不可达代码为 3, 需要进行分片但设置了不分片位代码为 4, 等等.
2. 源点抑制: 这个就是说, 快递送的太多了, 拆快递都来不及了, 叫我们这里送慢点, 别一次性送这么多过来.
3. 时间超时: 快递在路上耽搁太久, 时间超时了, 快递员直接偷了快递跑路了. 也就是 ip 包超过时间 (TTL) 还没到达, 为了不让它继续在网络中游荡堵塞网络, 所以它就自行销毁了.
4. 路由重定向: 是发给另外一个路由器的. 也就是相当于, 上次快递交给一个中转站, 那个中转站的人莫名其妙去绕了远路(路由算法有问题), 导致东西送到顾客手上很晚了, 顾客投诉了, 这次特地来告诉那个中转站的负责人, 下次要找一条好走的路(重新更新路由表).
说完了差错报文, 现在来说说另外一个, 也就是请求与响应报文. 这就进入了我们今天的主题 --ping 命令.
3.ping 命令的原理
ping 命令用来在 IP 层次上调查与指定机器是否连通, 调查数据包往复需要多少时间. 为了实现这个功能, ping 命令使用了两个 ICMP 报文. 我们主机的 ping 发送一个 ICMP, 对方主机收到之后, 也用 ICMP 发送一个报文, 这样就能检测网络是否畅通, 或者连接发送的速度怎么样. 就像我往山那头的人家喊一句, 看什么时候有回声. 如果始终没回声, 那就是不在家. 如果过了一会儿有回声, 那么我们就可以根据回声的快慢来推断我们两人之间距离有多少.
1. 我们主机先发送一个改造过的, 为 ping 量身打造的 ICMP 报文 -- 增加了标识符和序号字段. 这两个新增加的字段, 是用来标识各个不同的 ICMP 包. 标识符是表示某一批送出的 ICMP 报文, 同一批送出的都是一样的标识符. 序号字段则是表示这是送出的第几个包, 每送出一个就增加 1.
2. 对方主机收到之后, 就做了一点小小的工作: 把源地址和目标地址交换了一下, 然后再把类型字段改成 0, 表示这个是回送的, 然后就原封不动地送回来了. 这就好像是我送了个快递到别人家, 别人把地址交换了下, 改成我是收件人, 就直接叫送快递的原封不动地退回来了. 那么我收到了之后, 一看标识符, 就知道, 哦, 这是我刚才给张三送的快递(因为我同时还给其他人也寄了快递, 标识符就是用来区分的, 相当于收件人姓名), 说明张三这会儿在家. 好了, 这会儿我看看当时的邮戳, 再看看墙上的钟, 就知道这个快递送了一个来回要多久了, 也就可以估计我和张三家距离多远了.
4. 用 ping 命令来干坏事
正所谓每个硬币都有两面, ping 命令也能做些坏事, 比如 ping 洪水:
它利用 ping 的原理, 向目标服务器发送大量的 ICMP 回送请求. 这是黑客向特定的机器连续发送大量的 ICMP 回送请求报文. 目标机器回答到达的 ICMP 回送请求已经用尽全力了, 原来的通信处理就变得很不稳定了. 进一步, 目标机器连接的网络也可能由于大量的 ICMP 数据包而陷入不可使用的状态.
如果你觉得这招数还不厉害, 还有更厉害的一招叫做 smurf:
黑客恶意的使用 ICMP 回送请求报文. 这一点同 ping 洪水是相同的. 不过在 smurf, 对 ICMP 回送请求实施了一些加工. 源 IP 地址被伪装成攻击对象服务器的地址, 目标地址也不是攻击对象服务器的地址, 而是成为中转台的网络的广播地址.
黑客发送伪装了的 ICMP 回送请求后, 到达在作为踏板的网络的入口处的路由器. 这样, 路由器将回送请求转发给网内所有的计算机. 假如有 100 台计算机, 回送请求将到达 100 台所有的计算机. 收到回送请求的计算机对此作出反应, 送出回送回答报文. 这样, 黑客送出的一个 ICMP 回送请求报文, 一下子增加到了 100 倍. 黑客利用这个路由器作为跳板, 让它去联系了自己辖区内的所有计算机, 都成为了黑客的帮凶, 一起向目标发起攻击. 还记得之前我们讲过吗, 对方主机收到之后要交换地址, 那么也就是把现在的目标地址改成了黑客之前填的源地址, 然后一起给他发送报文.
看到这个我就想起来以前电话不发达时候, 大家还在用信件通信的时代, 有一种免费寄信的办法, 那就是故意把寄件人写成收件人, 收件人写个空地址, 然后邮局一看没贴邮票, 就把信件退给了寄件人 (其实是收件人), 这个原理和刚才的 smurf 有点像, 也是故意在目标地址和源地址上面做文章, 可怜的邮局(路由器辖下的计算机们) 就白白做了助纣为虐者.
来源: http://www.bubuko.com/infodetail-3304110.html