Создать несколько интерфейсов TUN - PullRequest
0 голосов
/ 30 октября 2018

Я хочу создать несколько интерфейсов 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)
...