Update.
This commit is contained in:
parent
c28b9029f3
commit
8bb87f51af
113
tun_server_example.md
Normal file
113
tun_server_example.md
Normal file
@ -0,0 +1,113 @@
|
||||
# TUN Server Client Example
|
||||
|
||||
This is an example spat out by an LLM regarding creating a TUN server and a TUN client. I thought it was a very complete example including the linux forwarding terminal commands to be enterered.
|
||||
|
||||
I thought it was worth saving such great example as a gist.
|
||||
|
||||
retoor.
|
||||
|
||||
## TUN Server (tun_server.py):
|
||||
```python
|
||||
import os
|
||||
import struct
|
||||
import socket
|
||||
import select
|
||||
import fcntl
|
||||
import array
|
||||
import threading
|
||||
|
||||
TUNSETIFF = 0x400454ca
|
||||
IFF_TUN = 0x0001
|
||||
IFF_NO_PI = 0x1000
|
||||
|
||||
def create_tun_interface():
|
||||
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)
|
||||
return tun
|
||||
|
||||
def setup_routing(tun_name):
|
||||
os.system(f'ip addr add 10.0.0.1/24 dev {tun_name}')
|
||||
os.system(f'ip link set {tun_name} up')
|
||||
os.system('echo 1 > /proc/sys/net/ipv4/ip_forward')
|
||||
|
||||
def handle_client_traffic(tun, sock):
|
||||
while True:
|
||||
readable, _, _ = select.select([tun, sock], [], [])
|
||||
for fd in readable:
|
||||
if fd is tun:
|
||||
packet = os.read(tun.fileno(), 2048)
|
||||
sock.send(packet)
|
||||
elif fd is sock:
|
||||
packet = sock.recv(2048)
|
||||
os.write(tun.fileno(), packet)
|
||||
|
||||
def main():
|
||||
tun = create_tun_interface()
|
||||
setup_routing('tun0')
|
||||
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.bind(('0.0.0.0', 5000))
|
||||
sock.listen(1)
|
||||
|
||||
print("[*] Waiting for client connection...")
|
||||
client, addr = sock.accept()
|
||||
print(f"[+] Connection from {addr}")
|
||||
|
||||
handle_client_traffic(tun, client)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
```
|
||||
|
||||
|
||||
## TUN Client (tun_client.py):
|
||||
```python
|
||||
import os
|
||||
import struct
|
||||
import socket
|
||||
import select
|
||||
import fcntl
|
||||
import threading
|
||||
|
||||
TUNSETIFF = 0x400454ca
|
||||
IFF_TUN = 0x0001
|
||||
IFF_NO_PI = 0x1000
|
||||
|
||||
def create_tun_interface():
|
||||
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)
|
||||
return tun
|
||||
|
||||
def setup_routing(tun_name, server_ip):
|
||||
os.system(f'ip addr add 10.0.0.2/24 dev {tun_name}')
|
||||
os.system(f'ip link set {tun_name} up')
|
||||
os.system(f'ip route add default via 10.0.0.1 dev {tun_name}')
|
||||
|
||||
def handle_server_traffic(tun, sock):
|
||||
while True:
|
||||
readable, _, _ = select.select([tun, sock], [], [])
|
||||
for fd in readable:
|
||||
if fd is tun:
|
||||
packet = os.read(tun.fileno(), 2048)
|
||||
sock.send(packet)
|
||||
elif fd is sock:
|
||||
packet = sock.recv(2048)
|
||||
os.write(tun.fileno(), packet)
|
||||
|
||||
def main():
|
||||
SERVER_IP = '1.2.3.4' # Replace with your server's IP
|
||||
|
||||
tun = create_tun_interface()
|
||||
|
||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||
sock.connect((SERVER_IP, 5000))
|
||||
|
||||
setup_routing('tun0', SERVER_IP)
|
||||
|
||||
handle_server_traffic(tun, sock)
|
||||
|
||||
if __name__ == '__main__':
|
||||
main()
|
||||
```
|
Loading…
Reference in New Issue
Block a user