인터페이스를 통해 데이터를 보내는 프로그램을 작성 중입니다 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
.
답변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
).