我一直在嘗試使用 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
.
例如,您可以將tap0
和eth0
放入橋中br0
- 然後廣播流量穿過該橋。 (來自的廣播流量tap0
將被轉送到eth0
,反之亦然,而在路由的標準情況下則不會。)tap0
然後,您的 OpenVPN 隧道將被「切換」到其中,eth0
而不是「路由」到其中。整體br0
獲得一個 IP,您可以使用或br0
代替。 eth0
tap0
完全有可能擁有一個只有一個介面的橋接器,並根據brctl
需要新增/刪除其他介面。
因此,要么放入tap0
橋中並處理橋接口,要么使用tun
接口。
規則也可能iptables
會產生幹擾。
更新-看這裡:http://backreference.org/2010/03/26/tuntap-interface-tutorial/- 特別是這段摘錄:
Tap 介面和tun 介面之間的區別在於,tap 介面輸出(並且必須給出)完整的乙太網路幀,而tun 介面輸出(並且必須給出)原始IP 封包(並且內核不會添加任何乙太網路標頭) )。接口的功能是類似於 tun 接口還是類似於 tap 接口,在創建接口時透過標誌指定。
因此,看起來如果您不將完整的乙太網路幀發送到 tap0,由於上述原因,它將無法按您的預期工作。