Как создать два туна для связи? Что значит точка-точка?
Чтобы реализовать стек tcp в пользовательском пространстве, я пытаюсь установить два устройства tun и обмениваться данными между ними для тестирования кода. Однако кажется, что все IP-пакеты, записанные в tun, отбрасываются.
Например:
tun0,ip:172.19.16.1/20.
tun1, IP: 172.19.32.1/20.
когда я использую ping 172.19.16.2, tun 0 может получать ICMP-пакеты (от 172.19.16.1 до 172.19.16.2) и записывать данные в tun0 для ответа. Но когда я пытаюсь отправить ICMP с tun0 на tun1 (с 172.19.16.1 на 172.19.32.1 или наоборот), это не удается. tun1 не может получить данные! Почему? Я пытаюсь отправить TCP-пакет с tun1 на tun0, тоже не получается.
Из документа ядра я знаю, что tun является двухточечным устройством и не имеет mac-адреса и arp. Что значит точка-точка? Может создать два или три tun устройства для общения между собой?
import fcntl
import os
import if_tun
import ctypes
import struct
from scapy.all import *
from if_tun import IfReq, TUNSETIFF, IFF_TUN
def register_tun(name: str):
fd = os.open("/dev/net/tun",os.O_RDWR)
if fd < 0:
return fd
r = IfReq()
ctypes.memset(ctypes.byref(r), 0, ctypes.sizeof(r))
r.ifr_ifru.ifru_flags = IFF_TUN | 0x1000
r.ifr_ifrn.ifrn_name = name.encode("utf-8")
fcntl.ioctl(fd, TUNSETIFF,r)
return fd
if __name__ == "__main__":
fd = register_tun("tun2")
if fd < 0:
print("error")
while True:
type = input()
a = IP(dst="172.19.16.1",src="172.19.32.1")/TCP()
a = IP(raw(a))
a.show()
print("write:")
print(os.write(fd, raw(a)))
buf = os.read(fd,1024)
print("receive data")
IP(raw(buf)).show()
1 ответ
Два TUN с одной машины? Если да, вам нужно установить sysctlnet.ipv4.conf.tun0.accept_local=1
на обоих TUN. В противном случае ядро не будет принимать пакеты с IP-адресом локального источника.