Как создать два туна для связи? Что значит точка-точка?

Чтобы реализовать стек 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-адресом локального источника.

Источник: https://unix.stackexchange.com/questions/597213/routing-all-packets-trough-tun-device-before-forwarding .

Другие вопросы по тегам