tunトラフィックをインターネットに転送する方法は?

tunトラフィックをインターネットに転送する方法は?

インターフェースを介してデータを送信するプログラムを作成していますtun。 IPパケットを世界中に送信しようとしています。私のすべてのTCP / IPスタックが動作しています。送信する準備が整った有効なTCP / IPパケットを生成するので、送信するだけです。

インターフェイスを作成する方法を知っていますが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

答え1

私はあなたのプログラムが生成したパケットを世界に中継するために、生成されたトンネルデバイスに正しいローカルアドレスとリモートアドレスを設定する必要があると思います。

提供されたPCAPファイルに基づいて、プログラムはアドレスから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トンネルリモートアドレス()に設定されたパケットを生成し、宛先が同じアドレスに設定されているパケットを受信する必要があります。

答え2

システムでルーティングおよび(おそらく)パケットフィルタ(ファイアウォール)を設定する必要があります。

  1. net.ipv4.ip_forward1に設定(sysctl永続構成の場合)
  2. ファイアウォールがまだ配信を許可していない場合は、次のものが必要です。

    iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
    iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
    
  3. ゲートウェイがこのシステムからのパケットを知るためにMASQUERADING / SNATが必要になる場合があります(参考資料を参照iptables -t nat -nvL POSTROUTING)。

関連情報