簡體   English   中英

在linux中處理ping的是什么?

[英]What handles ping in linux?

我想覆蓋/更改linux處理ping icmp echo請求數據包的方式。 意思是我想運行自己的服務器來回復傳入的icmp(echo請求或其他)數據包。

但為了使其正常工作,我想我需要禁用從linux處理的默認ping icmp數據包。 但我無法弄清楚如何做到這一點(我甚至不知道是什么處理icmp請求......內核?一些用戶空間代碼?)...我發現只是用iptables刪除icmp echo請求。

為了幫助理解,讓我解釋一下我的目標:我希望能夠通過ping發送一些數據。 (簡單)但我需要能夠讀取和提取該數據。 另外,我希望能夠回答一個特殊的echo-r​​eply(嵌入了一些數據)

要覆蓋ICMP ECHO請求( ping )的默認內核行為,您可以執行以下操作,而無需戳入內核或編寫過濾器。

  • 第一:指示iptables刪除ICMP ECHO請求。 然而,他們會來到您的主機並輸入您的網卡,但內核無法回答:

    iptables -A INPUT- p icmp --icmp-type 8 -j DROP

  • 第二:使用tcpdump來嗅探ICMP數據包(或者編寫一個使用libcap來自己捕獲的程序)。 tcpdump具有顯示有效負載數據或將dunmped數據包寫入文件的選項。 您可以使用此最后一項功能從程序中打開帶有-w選項的tcpdump,將其輸出連接到管道並讀取管道。 這樣,即使它們將被iptables丟棄,您也可以訪問傳入的ICMP回應請求。 從您的程序中,您將能夠解析有效負載數據。

    tcpdump -p icmp -i eth0 -s 0 -Xnlt

    (這是用於在標准輸出上以可讀的人類十六進制和ASCII顯示數據,根據將原始數據寫入文件/套接字來更改-X -l選項)

  • 第三:使用原始套接字,您的程序可以發送一個自定義數據包,假裝是對先前ICMP回應請求的響應,具有您想要的有效負載。 這個問題可能在這個領域有更多線索: 如何在C中使用原始套接字接收ICMP請求

很抱歉對已經回答的問題發表評論,但我想補充(對於googlers來說)阻止使用iptables的ICMP數據包將不允許您使用RAW IP套接字讀取它們,因為iptables在IP層工作。 您可以使用RAW以太網套接字來實現它,但這是客觀上更糟糕的方法。

禁用內核處理icmp數據包的推薦方法是通過/proc/sys/net/ipv4/icmp_echo_ignore_all接口:

echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all

這將允許ICMP數據包通過並被捕獲,但不會自動應答。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM