Я хочу создать несколько интерфейсов TUN. Через эти интерфейсы я хочу отправить пакет с нескольких клиентов на сервер. В моем коде я мог бы создать туннель и может отправить пакет на сервер. Но как я могу создать несколько туннелей и создать несколько клиентов для отправки пакетов через эти туннели на этот сервер? Я создал интерфейс TUN с помощью этого скрипта:
#!/bin/bash
ip tuntap add dev tun0 mode tun
ip link set tun0 up
ip addr add 192.168.0.1/24 dev tun0
Код сервера:
import fcntl
import struct
import socket
import os
from scapy.all import *
TUNSETIFF = 0x400454ca
TUNSETOWNER = TUNSETIFF + 2
IFF_TUN = 0x0001
IFF_TAP = 0x0002
IFF_NO_PI = 0x1000
iface = "tun0"
print("Working on {} interface".format(iface))
tun = open('/dev/net/tun', 'r+b', buffering=0)
ifr = struct.pack('16sH', b'tun0', IFF_TUN | IFF_NO_PI)
fcntl.ioctl(tun, TUNSETIFF, ifr)
fcntl.ioctl(tun, TUNSETOWNER, 1000)
ss = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
ss.bind(("0.0.0.0", 40000))
try:
while True:
data, addr = ss.recvfrom(2048)
print("recv from {} data = {}".format(addr, data))
pkt_rcv = IP(data)
pkt_rcv.show2()
except KeyboardInterrupt:
print("Terminating ...")
ss.close()
exit(0)
Код отправителя:
import fcntl
import struct
import socket
from time import sleep
from scapy.all import *
import numpy as np
# TUNSETIFF = 0x400454ca
# TUNSETOWNER = TUNSETIFF + 2
# IFF_TUN = 0x0001
# IFF_TAP = 0x0002
# IFF_NO_PI = 0x1000
iface = "tun0"
dst = "192.168.0.1"
print("Working on {} inteface, destination address {}:40000 udp".format(iface, dst))
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # UDP
packet = IP(src="192.168.0.2", dst=dst)/"Hello"
packet.show2()
bb = bytes(packet)
padding_size = 64-len(bb)
if padding_size > 0:
print("Padding size ", padding_size)
bb += bytes(np.full(padding_size, 0xFF, dtype=np.uint8))
try:
while True:
sleep(1)
sock.sendto(bb, (dst, 40000))
print("Sent 1 pkt")
except KeyboardInterrupt:
print("Terminating ...")
exit(0)