好的,我意識到這種情況有點不尋常,但我需要使用原始套接字(在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
我知道這是4年的問題,但你的建議看起來很有趣,所以我決定要求你澄清。問題是:將路由響應數據包發送到具有錯誤設備MAC地址的某臺機器時,路由器是否有問題?數據包是否會被現在的防火牆或防病毒軟件過濾? – 2016-01-10 10:44:58