回答
解決方法是查看讀取的數據包,如果它是PACKET_OUTGOING。使用此選項,您可以區分放入以太網tx線的數據包和從rx線讀取的數據包。
打開混雜模式的Socket:
char* i = "eth0";
int fd;
struct ifreq ifr;
struct sockaddr_ll interfaceAddr;
struct packet_mreq mreq;
if ((fd = socket(PF_PACKET,SOCK_RAW,htons(ETH_P_ALL))) < 0)
return -1;
memset(&interfaceAddr,0,sizeof(interfaceAddr));
memset(&ifr,0,sizeof(ifr));
memset(&mreq,0,sizeof(mreq));
memcpy(&ifr.ifr_name,i,IFNAMSIZ);
ioctl(fd,SIOCGIFINDEX,&ifr);
interfaceAddr.sll_ifindex = ifr.ifr_ifindex;
interfaceAddr.sll_family = AF_PACKET;
if (bind(fd, (struct sockaddr *)&interfaceAddr,sizeof(interfaceAddr)) < 0)
return -2;
mreq.mr_ifindex = ifr.ifr_ifindex;
mreq.mr_type = PACKET_MR_PROMISC;
mreq.mr_alen = 6;
if (setsockopt(fd,SOL_PACKET,PACKET_ADD_MEMBERSHIP,
(void*)&mreq,(socklen_t)sizeof(mreq)) < 0)
return -3;
//...
和閱讀。現在,我們可以區分Rx和Tx以太網線:
unsigned char buf[1500];
struct sockaddr_ll addr;
socklen_t addr_len = sizeof(addr);
n = recvfrom(fd, buf, 2000, 0, (struct sockaddr*)&addr, &addr_len);
if (n <= 0)
{
//Error reading
}
else if (addr.sll_pkttype == PACKET_OUTGOING)
{
//The read data are not writing by me.
//Use only this data to copy in the other network.
}
就這些了。使用它我不會讀取我寫的數據。當我將網絡1幀複製到網絡2並將網絡2幀複製到網絡1時,我避免了循環。
您可以輕鬆篩選來自您的IP地址的內容,並將它們從您的列表中排除。
我們有兩個網絡和一臺帶有兩個以太網設備(eth0和eth1)的PC。第一個連接到第一個網絡,第二個連接到第二個網絡。我們喜歡在2級建立軟件橋;在混雜模式下使用原始套接字,我們讀取網絡1的所有流量並將其複製到網絡2中,反之亦然。所有它完成無限循環,因爲我們複製到網絡1的幀複製到網絡2並複製到網絡1 ...我們不需要嗅探我們寫入的幀,並且這些幀在第2層(帶有mac)和來自任何機器都是完整的聯繫。 –
難道你不能簡單地在MAC層做你的過濾嗎?查看MAC地址並跳過您發送的那些MAC地址並不難。我錯過了什麼? – kmort
該軟件用於通過無線鏈接在網絡和網絡之間建立橋樑。我在網絡1中讀取的數據包通過無線電鏈接發送到其他計算機(UDP連接中的數據包),解包並寫入網絡2(反之亦然)。因此,我不能使用linux橋接功能:-(我相信... ... –
你需要創建一個對應於傳入數據包的BPF
(BSD分組過濾器)過濾器:
/* To obtain the BPF filter corresponding to incoming traffic:
* sudo tcpdump -dd -i eth0 dst host YOUR_IP_ADDRESS and not src host YOUR_IP_ADDRESS
* The filter given below is what i get on my local machine (192.168.1.7):
* sudo tcpdump -dd -i eth0 dst host 192.168.1.7 and not src host 192.168.1.7
*/
struct sock_filter incoming_filter[] = {
{ 0x28, 0, 0, 0x0000000c },
{ 0x15, 0, 4, 0x00000800 },
{ 0x20, 0, 0, 0x0000001e },
{ 0x15, 0, 9, 0xc0a80107 },
{ 0x20, 0, 0, 0x0000001a },
{ 0x15, 7, 6, 0xc0a80107 },
{ 0x15, 1, 0, 0x00000806 },
{ 0x15, 0, 5, 0x00008035 },
{ 0x20, 0, 0, 0x00000026 },
{ 0x15, 0, 3, 0xc0a80107 },
{ 0x20, 0, 0, 0x0000001c },
{ 0x15, 1, 0, 0xc0a80107 },
{ 0x6, 0, 0, 0x0000ffff },
{ 0x6, 0, 0, 0x00000000 },
};
int s;
struct sockaddr_ll sock_address;
struct sock_fprog prog;
/* Init the program filter */
prog.len = 14;
prog.filter = incoming_filter;
然後你的原始套接字,並綁定與...:
/* Create the raw socket */
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
if (s < 0)
{
/* Error handling */
}
/* Build our socket */
sock_address.sll_family = AF_PACKET;
sock_address.sll_protocol = htons(ETH_P_IP);
sock_address.sll_ifindex = if_nametoindex(your_interface_name);
/* Bind */
if (bind(s, (struct sockaddr*)&sock_address, sizeof(sock_address)) < 0)
{
/* Error handling */
}
/* Apply the filter */
if (setsockopt(s, SOL_SOCKET, SO_ATTACH_FILTER, &prog, sizeof(prog)) < 0)
{
/* Error handling */
}
/* Infinite listen loop */
while (1)
{
/* Handle received packet */
}
編輯:如果你想過濾MAC地址,很簡單,像這樣生成你的過濾器(我在這裏使用我的Mac地址):
sudo tcpdump -dd -i eth0 ether dst 00:0f:b0:68:0f:92 and not ether src 00:0f:b0:68:0f:92
{ 0x20, 0, 0, 0x00000002 },
{ 0x15, 0, 7, 0xb0680f92 },
{ 0x28, 0, 0, 0x00000000 },
{ 0x15, 0, 5, 0x0000000f },
{ 0x20, 0, 0, 0x00000008 },
{ 0x15, 0, 2, 0xb0680f92 },
{ 0x28, 0, 0, 0x00000006 },
{ 0x15, 1, 0, 0x0000000f },
{ 0x6, 0, 0, 0x0000ffff },
{ 0x6, 0, 0, 0x00000000 },
我們正在使用MAC地址在第2層工作,我們沒有IP地址。 –
@JoséMaríaB:好吧,這不會改變任何事情!只需按照您的主機Mac地址進行過濾,看看我的編輯 – TOC
非常感謝。在這種情況下使用PACKET_OUTGOING解決方案更爲容易(Merci beaucoup。Je pense que c'est plus facileàutiliser la solution PACKET_OUTGOING pour ce cas :-)) –
不幸的是,Linux不提供任何選項來指定未接收原始套接字的傳出數據包。
如果允許重建Linux內核,我建議只用packet_socket_type.patch修補內核。
並且在用戶程序中,您可以指定想要接收哪種類型的數據包。
int mask=0;
mask = PACKET_MASK_ANY & ~(1<<PACKET_OUTGOING) & ~(1 << PACKET_LOOPBACK);
setsockopt(raw_sock, SOL_PACKET, PACKET_RECV_TYPE, &mask, sizeof(mask));
IMO,這是真正解決問題的解決方案。
- 1. 如何爲VLAN嗅探初始化原始套接字
- 2. Python原始套接字(Windows)中:嗅探以太網幀
- 3. 嗅探原始套接字的802.3 eth數據包
- 4. 在Linux中使用原始套接字進行數據包嗅探C
- 5. 藍牙「嗅探模式」
- 6. 我可以使用原始套接字攔截網絡數據包嗎(不僅是嗅探)?
- 7. strncmp()和if()不同意...我在想什麼? (原始套接字)
- 8. 爲什麼我的原始套接字未被創建?
- 9. 如何在混雜模式下創建一個tcp套接字?
- 10. 如何使用RAW套接字嗅探所有ICMP數據包
- 11. 混雜模式
- 12. recv與原始套接字
- 13. 使用原始套接字
- 14. UDP - 原始套接字 - C#
- 15. Lua:原始套接字
- 16. 原始套接字不發送
- 17. 我的scapy嗅探器不工作?
- 18. Scapy嗅探SSL
- 19. HTTPS/SSL嗅探
- 20. 嗅探檢測
- 21. C原始套接字發送地址的目的是什麼?
- 22. 參數嗅探不工作
- 23. 寫一個http嗅探器(或任何其他應用程序級嗅探器)
- 24. Python原始套接字接收問題
- 25. 撰寫電子郵件嗅探器
- 26. 爲什麼原始套接字更改了我的tcp校驗和
- 27. 一個很好的鏈接,解釋爲什麼瀏覽器嗅探不好
- 28. 數據包嗅探
- 29. Cookie嗅探器 - PHP
- 30. 在嗅探交通
你在使用什麼操作系統? – Eloff
我正在使用linux。 –
你是否在同一臺機器上發送和嗅探?這是一個問題。你需要2臺機器。 – Matt