インターフェースを介してデータを送信するプログラムを作成しています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
システムでルーティングおよび(おそらく)パケットフィルタ(ファイアウォール)を設定する必要があります。
net.ipv4.ip_forward
1に設定(sysctl
永続構成の場合)ファイアウォールがまだ配信を許可していない場合は、次のものが必要です。
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
ゲートウェイがこのシステムからのパケットを知るためにMASQUERADING / SNATが必要になる場合があります(参考資料を参照
iptables -t nat -nvL POSTROUTING
)。