Networking
如何將流量從 tun 中繼到網際網路?
我正在編寫一個通過
tun
介面發送數據的程序。我正在嘗試向世界發送 IP 數據包。我的所有 TCP/IP 堆棧都在工作:它創建了一個準備好發送的有效 TCP/IP 數據包,我只需要發送它。我知道如何創建一個
tun
介面,但是如何讓這個 tun 介面將 IP 數據包中繼到世界並接收它們呢?我想發送連接到 google.com 的 IP 數據包並接收 HTTP 響應。
更新。在 Hauke Laging 的回答之後,我嘗試了:
user@orwell2:~$ sudo route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 10.137.0.5 0.0.0.0 UG 0 0 0 eth0 10.137.0.5 0.0.0.0 255.255.255.255 UH 0 0 0 eth0 172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0 user@orwell2:~$ sudo nano /etc/sysctl.conf user@orwell2:~$ sudo sysctl -p fs.inotify.max_user_watches = 524288 net.ipv4.ip_forward = 1 user@orwell2:~$ sudo openvpn --mktun --dev tun1 --user $USER Tue May 26 18:45:09 2020 TUN/TAP device tun1 opened Tue May 26 18:45:09 2020 Persist state set to: ON user@orwell2:~$ sudo ip link set tun1 up user@orwell2:~$ sudo ip addr add 192.168.0.2/24 dev tun1 user@orwell2:~$ sudo iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT user@orwell2:~$ sudo iptables -A FORWARD -i tun1 -o eth0 -j ACCEPT user@orwell2:~$ ping -I tun1 google.com PING google.com (172.217.28.238) from 192.168.0.2 tun1: 56(84) bytes of data. ^C --- google.com ping statistics --- 7 packets transmitted, 0 received, 100% packet loss, time 6179ms user@orwell2:~$ sudo iptables -t nat -nvL POSTROUTING Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 MASQUERADE all -- * !docker0 172.17.0.0/16 0.0.0.0/0 0 0 ACCEPT all -- * vif+ 0.0.0.0/0 0.0.0.0/0 6 312 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 102 6268 MASQUERADE all -- * * 0.0.0.0/0 0.0.0.0/0
如您所見,我無法
ping google.com
通過tun1
. 然後我列印了偽裝選項,但我不知道是否需要添加一個tun1
。
我相信您需要在您正在創建的隧道設備上提供正確的本地和遠端地址,以便將您的程序創建的數據包轉發給世界。
根據提供的 PCAP 文件,您的程序會生成來自 address 的 TCP/IP 數據包
192.168.69.1
。那應該是 TUN 設備的遠端地址。我的建議是創建隧道設備並設置 IP 轉發和主機防火牆,如下所示:$ sudo ip tuntap add dev tun1 mode tun user `id -un` $ sudo ip link set dev tun1 up $ sudo ip addr add dev tun1 local 192.168.69.0 remote 192.168.69.1 $ sudo iptables -t filter -I FORWARD -i tun1 -o eth0 -j ACCEPT $ sudo iptables -t filter -I FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT $ sudo iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE $ sudo sysctl net.ipv4.ip_forward=1 $ /path/to/your/packet/generator/program tun1
在古代,當人們將調製解調器設備連接到電話線並撥打網際網路提供商的電話以建立與網際網路的連接時,
pppd
守護程序負責建立與位於的伺服器的點對點隧道在通話的另一端。在這些隧道上,本地地址是分配給在核心網路堆棧中創建的網路介面的地址,遠端地址是接聽電話的另一台電腦的本地地址,也是在預設網關中設置的地址。當地的一面。對於 TUN 虛擬設備,您的使用者空間程序將充當隧道另一端的遠端電腦。因此,為了讓您的程序將 IP 數據包注入核心網路堆棧,程序應該生成源地址設置為隧道遠端地址 (
192.168.69.1
) 的數據包,並接收目標設置為相同地址的數據包。