2015-04-07 73 views
2

我想重寫/更改linux如何處理ping icmp迴應請求數據包。 含義我想運行自己的服務器來回復傳入的icmp(迴應請求或其他)數據包。在linux中處理ping的是什麼?

但爲了這個工作正常,我想我需要禁用從Linux處理默認的ping icmp數據包。 但我不知道如何做到這一點(我甚至不知道什麼處理ICMP請求...內核?一些用戶空間代碼?)...我找到的所有是關於用iptables放棄icmp echo請求。

爲了幫助理解,讓我解釋我的目標: 我希望能夠通過ping發送一些數據。 (簡單) 但我需要能夠讀取和提取數據。另外,我希望能夠用特殊的回覆答覆(有一些嵌入數據)來回答

+0

這應該在你的'/ bin'文件夾中找到。但是,這可能取決於你的Linux類型 – ryekayo

+0

嗨,我不是在尋找ping程序。但對於處理傳入icmp迴應請求數據包的代碼 –

+1

不....我不是在尋找語言,而是處理icmp迴應請求數據包的東西。我不能比這更清楚,對不起。 PS:linux內核是用C編寫的,而gnu ping也是用C編寫的。 –

回答

5

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

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

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

  • 二:使用tcpdump嗅出了ICMP數據包(或寫一個使用程序libcap做你自己的捕獲)。 tcpdump有選項可以顯示有效載荷數據,或者將已包裝的數據包寫入文件。你可以使用這個最後的功能在程序中用-w選項打開tcpdump,將其輸出連接到管道並讀取管道。這樣,即使將被iptables丟棄,也可以訪問傳入的ICMP回顯請求。從你的程序中,你將能夠解析有效載荷數據。

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

    (這是在標準輸出顯示在可讀人類十六進制和ASCII數據,更改-X-l選項,根據原始數據寫入到一個文件/插座)

  • 第三:使用原始套接字,您的程序可以發送一個自定義的數據包,假裝是對之前的ICMP迴應請求的迴應,以及您希望的有效載荷。這太問題可能對你有更多的線索在這一領域:How to receive ICMP request in C with raw sockets

+1

我不知道有可能通過原始插座接收數據包......但這很有道理!謝謝 ! –

1

對不起,評論一個已經回答的問題,但我想補充(讓Google也許),阻斷ICMP數據包使用iptables贏得不允許你用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報文通過和被捕獲,但不會自動應答。