2012-01-30 113 views
20

爲了理解TCP是如何工作的,我嘗試僞造我自己的TCP SYN/SYN-ACK/ACK(基於教程:http://www.thice.nl/creating-ack-get-packets-with-scapy/)。scapy不需要的RST TCP數據包

問題是,無論我的計算機何時從服務器收到SYN-ACK,它都會生成一個RST數據包,用於停止連接過程。

我嘗試在OS X Lion和Ubuntu 10.10 Maverick Meerkat上重置連接。我發現這個:http://lkml.indiana.edu/hypermail/linux/net/0404.2/0021.html,我不知道是不是原因。

有沒有人可以告訴我可能是什麼原因?以及如何避免這個問題?

謝謝。

+0

我認爲這個代碼片段使這個問題更明顯:'ans = scapy.all。SR1(generate_tcp_syn_pkt()); ack_pkt = generate_tcp_ack_pkt(ans); scapy.all.send(ack_pkt)' – diabloneo 2013-09-26 17:12:28

+0

您是如何解決OS X的這個問題的? – user1505986 2015-11-08 11:10:11

回答

22

你所引用的文章,使這很清楚......

既然你沒有完成完整的TCP握手您的操作系統可能會試圖採取控制,並可以開始發送RST(復位)數據包,以避免這一點,我們可以用iptables:

iptables -A OUTPUT -p tcp --tcp-flags RST RST -s 192.168.1.20 -j DROP 

本質上說,問題是,scapy在用戶空間,而Linux內核運行將首先收到SYN-ACK。內核將發送一個RST,因爲在您有機會對scapy執行任何操作之前,它將不會在端口號上打開一個套接字。

該解決方案(如博客提到的)是防止您的內核發送RST數據包。

+0

感謝您提供這些有用的附加信息。 – user1177093 2012-02-09 12:55:48

+0

非常歡迎 – 2012-02-09 13:04:40

+4

有沒有沒有IPTables的解決方案?我真的不能更改我的機器上的iptables配置。除此之外,我還想從我的實現中發出RST(也爲測試目的創建自己的TCP流) – KillianDS 2012-12-10 11:21:47

3

我沒有非iptables的答案,但可以解決重置問題。而不是試圖篩選過濾表中的傳出重置,而是過濾來自原始表中目標的所有傳入數據包。這可以防止來自目標的返回數據包甚至被內核處理,儘管scapy仍然會看到它們。我使用的語法如下:

iptables -t raw -A PREROUTING -p tcp --dport <source port I use for scapy traffic> -j DROP 

該解決方案確實強迫我使用我的業務相同的源端口;隨意使用你自己的iptables-fu來識別你的目標的返回數據包。

1

其他答案中引用的博客文章並不完全正確。這不僅是因爲你沒有完成三次握手,而是因爲內核的IP棧並不知道發生了連接。當它收到SYN-ACK時,它發送一個RST-ACK,因爲它是意外的。第一次或最後一次接收真的沒有進入它。該堆棧收到SYN-ACK是問題所在。

使用IPTables丟棄出站RST數據包是一種常見且有效的方法,但有時需要從Scapy發送RST。一個更多參與但非常可行的方法是降低,使用與主機不同的MAC生成並響應ARP。這使您可以在不受主機干擾的情況下發送和接收任何內容。

顯然這是更多的努力。就我個人而言,當我真的需要自己發送一個RST時,我只採取這種方法(而不是RST丟棄方法)。