linux ping廣播地址無迴應

看《TCP/IP詳解 卷1:協議》第12章 廣播和多播 時,說ping可以直接ping廣播地址。

局域網發現功能。
具體就是:發現所有連接到路由器的設備。就是發現所有局域網主機。並列出主機名,mac,ip等。
當時網上搜了好長時間,最後發現,這不就是arp局域網內所有ip麼,有迴應的就用dns得一下域名(當時認爲dns也得自己弄)。所以網上搜源碼搜到了這個牛逼東西:arp-scan 在這裏mark一下。
結果發現,編譯時要使用libpcap庫,運行需要管理員權限。
方案被否了,得自己用C/C++實現。心中一萬個草泥馬飛過。。。
之後又搜源碼,結果發現,linux的socket函數要想發arp包就得要root權限。(socket函數,第二個參數如果是SOCK_RAW或SOCK_PACKET都需要root權限)
經討論說不能給root權限,C使用arp行不通,還是java自己ping所有ip。(心裏那個暗爽啊。哈哈哈)
剩下的任務就是怎麼用dns查主機名了。
又經過一頓搜啊搜,發現Unix有個庫函數gethostbyaddr就是根據跟定ip地址,返回對應的主機域名。它其實就是實現了dns解析器功能。(哎,基本常識都得搜半天,沒文化真可怕啊)
後來又想了下,這種通用函數android能沒有封裝??結果查了下發現android確實有對應java類InetAddress的getByAddress函數。
最後。。。
最後,這個需求就跟自己沒啥事了。。。

所以從上面的ping局域網內所有ip(根據子網掩碼算出),是否可以ping廣播地址??
linux運行如下命令:

$ ping 192.168.1.255
Do you want to ping broadcast? Then -b
$ ping 192.168.1.255 -b -c 1
WARNING: pinging broadcast address
PING 1192.168.1.255 (192.168.1.255) 56(84) bytes of data.

— 192.168.1.255 ping statistics —
1 packets transmitted, 0 received, 100% packet loss, time 10000ms

沒有任何迴應。
從baidu搜了半天,也沒找出個所以然來。再次鄙視baidu和我天朝最牛B的牆。
還是自己找方法解決吧。
在該子網內的另一臺機器運行tcpdump,然後再ping:

$ tcpdump -n icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:30:21.300465 IP 192.168.1.89 > 192.168.1.255: ICMP echo request, id 41295, seq 1, length 64

發現tcpdump機器確實收到了ping,但是沒reply。
最後幾經挫折,發現linux有個配置項控制是否要回應icmp的廣播。

$ echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

在使用ping就收到了該主機的回覆了

$ ping 192.168.1.255 -b -c 1
WARNING: pinging broadcast address
PING 192.168.1.255 (192.168.1.255) 56(84) bytes of data.
64 bytes from 192.168.1.121: icmp_seq=1 ttl=64 time=2.11 ms

— 192.168.1.255 ping statistics —
1 packets transmitted, 1 received, 0% packet loss, time 2ms
rtt min/avg/max/mdev = 2.117/2.117/2.117/0.000 ms

最後mark一個文章:Linux網絡服務參數配置說明及實戰

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章