向tap0介面發送資料包

向tap0介面發送資料包

我一直在嘗試使用 python 將資料包發送到 Tap 介面。我正在使用wireshark 監視tap 接口,但沒有收到任何資料包。我這樣做主要是為了幫助我理解 VPN、乙太網路橋接和 Python 中的套接字程式設計。

我的系統設定如下:

Ubuntu Desktop 11.10
Python 2.7
eth0 ip: 192.168.1.6
tap0 ip: 10.0.0.1

我首先按如下方式設定水龍頭:

sudo openvpn --mktun --dev tap0
sudo ifconfig tap0 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 promisc up

這將啟動tap0介面並透過tap0建立到10.0.0.1/24的核心路由規則。

這是路由表:

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
10.0.0.0        *               255.255.255.0   U     0      0        0 tap0
192.168.1.6     *               255.255.255.0   U     1      0        0 eth0
default         192.168.1.1     0.0.0.0         UG    0      0        0 eth0

接下來,我啟動 python Interactive 並創建一個簡單的 UDP 套接字。

import socket
s = socket.socket(socket.AF_INET,socket.SOCK_DGRAM)
s.sendto('helloworld',('10.0.0.2',12345))

我在 tap0 上運行帶有 Wireshark 監控的 sendto 命令。現在,我的網路上沒有 10.0.0.2 上的主機,但我至少應該在 tap0 介面上看到一些傳出流量。我已經在 Windows 中複製了這個,似乎工作正常。

我只能認為問題出在linux下tap0介面的設定。那或者是我對這個東西的平庸理解。

謝謝

答案1

tap適用於 OpenVPN 下的橋接隧道 - 您應該將其連接到橋接器中,例如br0使用brctl.

例如,您可以將tap0eth0放入橋中br0- 然後廣播流量穿過該橋。 (來自的廣播流量tap0將被轉送到eth0,反之亦然,而在路由的標準情況下則不會。)tap0然後,您的 OpenVPN 隧道將被「切換」到其中,eth0而不是「路由」到其中。整體br0獲得一個 IP,您可以使用或br0代替。 eth0tap0

完全有可能擁有一個只有一個介面的橋接器,並根據brctl需要新增/刪除其他介面。

因此,要么放入tap0橋中並處理橋接口,要么使用tun接口。

規則也可能iptables會產生幹擾。

更新-看這裡:http://backreference.org/2010/03/26/tuntap-interface-tutorial/- 特別是這段摘錄:

Tap 介面和tun 介面之間的區別在於,tap 介面輸出(並且必須給出)完整的乙太網路幀,而tun 介面輸出(並且必須給出)原始IP 封包(並且內核不會添加任何乙太網路標頭) )。接口的功能是類似於 tun 接口還是類似於 tap 接口,在創建接口時透過標誌指定。

因此,看起來如果您不將完整的乙太網路幀發送到 tap0,由於上述原因,它將無法按您的預期工作。

相關內容