2008-09-21 83 views
15

好的,我意識到這種情況有點不尋常,但我需要使用原始套接字(在C中,在Linux中)建立TCP連接(三次握手) - 即我需要自己構建IP頭和TCP頭。我正在寫一個服務器(所以我必須首先響應傳入的SYN數據包),並且出於某種原因,我似乎無法做到正確。是的,我意識到一個SOCK_STREAM將爲我處理這個問題,但出於我不想考慮的原因,這不是一個選項。使用SOCK_RAW套接字的TCP握手

我在網上找到的關於使用原始套接字的教程都描述瞭如何構建SYN flooder,但這比實際建立TCP連接要容易一些,因爲您不必根據原始數據構建響應包。我已經獲得了SYN flooder示例,並且我可以從原始套接字讀取傳入的SYN包,但我仍然無法從客戶端創建對傳入SYN的有效SYN/ACK響應。

那麼,有沒有人知道使用原始套接字的一個很好的教程,超越了創建一個SYN flooder,或者沒有人有一些代碼可以做到這一點(使用SOCK_RAW,而不是SOCK_STREAM)?我會很感激。


MarkR是絕對正確的 - 問題是,內核響應初始數據包發送,因爲它認爲該端口是關閉復位包。內核擊敗我,並且連接消失。我正在使用tcpdump來監視連接 - 我應該更加註意並注意到有兩個回覆,其中一個是重置,這個回覆是我的程序創建的。 D'OH!

似乎最有效的解決方案是使用MarkR建議的iptables規則來阻止出站數據包。但是,如建議的那樣,使用標記選項比使用標記選項更容易。我只是匹配是否重置TCP標誌設置。在正常連接過程中,這不太可能是需要的,如果我阻止來自正在使用的端口的所有出站重置數據包,則對我的應用程序無關緊要。這有效地阻止了內核的不需要的響應,但不是我自己的數據包。如果我的計劃是在監聽的端口是9999,然後iptables的規則是這樣的:

iptables -t filter -I OUTPUT -p tcp --sport 9999 --tcp-flags RST RST -j DROP 

回答

1

我沒有教程,但我最近使用Wireshark效果良好調試某些原始套接字編程我做。如果您捕獲了您要發送的數據包,wireshark會很好地向您顯示它們是否格式錯誤。這對於比較正常的連接也很有用。

2

我無法幫你解決任何教程。

但我可以給你一些關於你可以用來協助調試的工具的建議。

首先,如bmdhacks建議,讓自己的副本wireshark(或tcpdump - 但wireshark更容易使用)。捕捉到一個很好的握手。確保你保存了這個。

捕獲一個失敗的握手。 Wireshark具有相當好的數據包解析和錯誤檢查功能,所以如果有一個簡單的錯誤,它可能會告訴你。

接下來,給自己一份tcpreplay的副本。這應該還包括一個名爲「tcprewrite」的工具。 tcprewrite將允許您將以前保存的捕獲文件分爲兩部分,每部分用於握手。 然後,您可以使用tcpreplay回放握手的一側,以便您擁有一組一致的數據包進行播放。

然後你使用wireshark(再次)來檢查你的迴應。

9

你想要在用戶空間中實現TCP協議棧的一部分......這是可以的,其他一些應用程序可以做到這一點。

你會遇到的一個問題是內核將發送(通常是負面的,無益的)回覆傳入的數據包。這將破壞您嘗試啓動的任何通信。

避免這種情況的一種方法是使用內核沒有自己的IP堆棧的IP地址和接口 - 這很好,但你需要自己處理鏈路層的東西(特別是arp)。這將需要一個比IPPROTO_IP,SOCK_RAW更低的套接字 - 你需要一個數據包套接字(我認爲)。

也可以使用iptables規則阻止內核的響應 - 但我寧願懷疑這些規則也適用於您自己的數據包,除非您可以設法讓它們以不同的方式處理(也許應用netfilter 「標記」,以自己的包?)

閱讀手冊頁

插座(7) IP(7) 包(7)

其中約適用於各類不同的選擇和讀寫控制解釋的插座。

當然,你需要像Wireshark這樣的工具來檢查發生了什麼。您將需要幾臺機器來測試這個,我推薦使用vmware(或類似的)來減少所需的硬件數量。

對不起,我不能推薦一個特定的教程。

祝你好運。

0

在netinet/ip.h中分別聲明瞭IP和TCP頭文件的結構,分別是netinet/tcp.h中的&。您可能需要查看此目錄中的其他頭文件以獲得額外的宏&可能有用的東西。

您發送一個包含SYN標誌和隨機序列號(x)的包。您應該從另一端收到SYN + ACK。這個數據包將有一個確認號碼(y),表示對方希望接收的下一個序號以及另一個序號(z)。您發回一個序列號爲x + 1和ack編號爲z + 1的ACK數據包以完成連接。

您還需要確保您計算適當的TCP/IP校驗和&填寫您發送的數據包的標頭的其餘部分。另外,不要忘記主機&網絡字節順序。

TCP在RFC 793中定義,這裏可供選擇:http://www.faqs.org/rfcs/rfc793.html

0

取決於你正在試圖做的,可能會更容易得到現有的軟件來處理TCP握手爲你做什麼。

一個開源IP協議棧是lwIP(http://savannah.nongnu.org/projects/lwip/),它提供了一個完整的tcp/ip協議棧。它很可能使用SOCK_RAW或pcap在用戶模式下運行。

0

如果您使用原始套接字,如果您使用不同的源MAC地址發送到實際的套接字,linux將忽略該響應數據包並且不會發送第一個數據包。

+0

我知道這是4年的問題,但你的建議看起來很有趣,所以我決定要求你澄清。問題是:將路由響應數據包發送到具有錯誤設備MAC地址的某臺機器時,路由器是否有問題?數據包是否會被現在的防火牆或防病毒軟件過濾? – 2016-01-10 10:44:58