Networking

如何將流量從 tun 中繼到網際網路?

  • May 29, 2020

我正在編寫一個通過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) 的數據包,並接收目標設置為相同地址的數據包。

引用自:https://unix.stackexchange.com/questions/588938