2011-10-17 41 views
3

我想創建一個測試環境來測試客戶端和服務器之間的網絡錯誤處理。我無法改變軟件。這兩個設備將通過Linux網橋連接,我將使用各種帶寬整形工具來限制帶寬或完全阻止流量以模擬各種錯誤情況。如何在網橋上生成套接字錯誤

我需要做的另一件事,我不知道如何實現,是在現有連接上生成套接字錯誤。我更願意使用現有的Linux工具/實用程序,但可以在寫足夠的指導下編寫自己的工具/實用程序。我對基礎網絡,TCP和UDP以及所有這些都非常熟悉,但對橋接沒有。

任何人都可以提出一種方法,我可以產生套接字錯誤,例如通過觸發意外的FIN數據包,連接到橋接器的兩端?

在此先感謝。

回答

4

您可以使用scapy FIN或RST包輕鬆地在網橋(通常是br0)中嗅探並製作合適的RST或FIN數據包。

這裏舉一個例子,其中RST在與數據的分組相同的方向上發送。嗅的

#!/usr/bin/python 
from scapy.all import * 
import random 

def sendRST(p): 
    flags = p.sprintf("%TCP.flags%") 
    if flags != "S": 
     ip = p[IP]  # Received IP Packet 
     tcp = p[TCP] # Received TCP Segment 
     if ip.len <= 40: 
      return 
     i = IP()  # Outgoing IP Packet 
     i.dst = ip.dst 
     i.src = ip.src 
     t = TCP()  # Outgoing TCP Segment 
     t.flags = "R" 
     t.dport = tcp.dport 
     t.sport = tcp.sport 
     t.seq = tcp.seq 
     new_ack = tcp.seq + 1 
     print "RST sent to ",i.dst,":",t.dport 
     send(i/t) 

while (1): 
PKT = sniff (iface = "br0", filter = "tcp and src host x.x.x.x", count=1, prn=sendRST) 
exit() 

檢查選項,至極極其強大:)

希望能幫助你。

+0

太棒了!這看起來就像我所需要的,因爲我認爲我無法做到這一點和其他的東西。我希望我能多次提出這個答案。非常感謝。一個問題:sniff()是一個Python API還是一個Scapy API?上面的代碼也會替換髮送的數據包還是僅僅由它觸發? – AlastairG

+0

一些答案:sniff是一個scapy API [http://www.secdev.org/projects/scapy/doc/usage.html#sniffing]。數據包沒有被替換,只是一個新的包RST被注入了libnet。如果你想更換數據包,你應該使用另一種技術,比如libnetfilter_queue。感謝您的問候;) –