Есть ли функция python для перехвата UDP-трафика, который машина пересылает - PullRequest
0 голосов
/ 03 ноября 2019

Я использую систему со следующей конфигурацией:

NODE A <-> PROXY <-> PROXY <-> PROXY <-> NODE B

Где узел A и его проксисовместно использовать общую частную сеть, узел b и его прокси совместно используют общую частную сеть, и прокси-серверы подключены к коммутатору.

Я настроил каждый из них следующим образом:

#nodeA     
#!/bin/sh
#Aliases
alias ip='sudo ip'
alias iptables='sudo iptables'


#interfaceconfiguration
ip link set enp0s8 up
ip addr add 192.168.0.1/29 dev enp0s8

iptables -t nat --flush

sudo route add default gw 192.168.0.2 enp0s8


iptables --policy INPUT ACCEPT
iptables --policy FORWARD ACCEPT
iptables --policy OUTPUT ACCEPT

#proxy a
#!/bin/sh
#Aliases
alias ip='sudo ip'
alias iptables='sudo iptables'

#interfaceconfiguration
ip link set enp0s8 up
ip link set enp0s9 up
ip addr add 192.167.0.1/26 dev enp0s9
ip addr add 192.168.0.2/29 dev enp0s8

sudo sysctl net.ipv4.ip_forward=1

iptables -t nat --flush

sudo route add default gw 192.167.0.2 enp0s9
sudo ip route add 192.168.0.0/29 via 192.168.0.2 dev enp0s8

iptables --policy INPUT ACCEPT
iptables --policy FORWARD ACCEPT
iptables --policy OUTPUT ACCEPT

#proxy B
#!/bin/sh
#Aliases
alias ip='sudo ip'
alias iptables='sudo iptables'

#interfaceconfiguration
ip link set enp0s8 up
ip link set enp0s9 up
ip addr add 192.167.0.2/26 dev enp0s9
ip addr add 192.168.0.10/29 dev enp0s8

sudo sysctl net.ipv4.ip_forward=1

iptables -t nat --flush

sudo route add default gw 192.167.0.1 enp0s9
sudo ip route add 192.168.0.8/29 via 192.168.0.10 dev enp0s8

iptables --policy INPUT ACCEPT
iptables --policy FORWARD ACCEPT

#node B
#!/bin/sh
#Aliases
alias ip='sudo ip'
alias iptables='sudo iptables'

#interfaceconfiguration
ip link set enp0s8 up
ip addr add 192.168.0.9/29 dev enp0s8

iptables -t nat --flush

sudo route add default gw 192.168.0.10 enp0s8

iptables --policy INPUT ACCEPT
iptables --policy FORWARD ACCEPT
iptables --policy OUTPUT ACCEPT

iptables --policy OUTPUT ACCEPT

Затем у меня есть этот простой клиентский код сервера, работающий на узлах A и N, только для того, чтобы трафик проходил через сеть:

import socket
import sys
#NODE A - SERVER
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('192.168.0.1', 10000)
sock.bind(server_address)

while True:
    data, address = sock.recvfrom(4096)
    print(data.decode())

import socket
import sys
#NODE B - CLIENT
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
server_address = ('192.168.0.1', 10000)


while True:
    sock.sendto(input("Message to send:").encode(), server_address)

Мой вопрос: как я могу на уровне прокси перехватывать эти сообщения, чтобы довести их до уровня приложения, чтобы я мог работать с ними, например, добавить слой шифрования, а затем отправить их обратно? к месту назначения, чтобы прокси-сервер на другой стороне мог расшифровать сообщение.

Спасибо

Ответы [ 2 ]

0 голосов
/ 04 ноября 2019

Я думаю, что вы подходите к этому неправильно. А именно, если вы хотите «работать» с пакетами на прокси, то вам не нужно указывать ядру делать переадресацию любого IP-уровня

, и интерфейс Linux tun / tap позволит вам это сделать,см. здесь для примера того, как это используется с VPN. хотя есть пакеты Python , которые помогают, если вы действительно хотите, чтобы код Python выполнял работу

как второстепенное примечание, я обычно считаю, что это не является паттерном для добавления sudo в основном на каждую строку скрипта, как у вас есть. Я бы просто запустил весь сценарий через sudo и просто включил в него код, предположив, что это так.

0 голосов
/ 03 ноября 2019

Это очень хороший цикл отладки:

while True:
    data, address = sock.recvfrom(4096)
    print(data.decode())

Как только вы увидите, что поступают правильные дейтаграммы, этот цикл станет естественным местом для передачи дейтаграмм в ваш любимый пункт назначения.

Убедиться в том, что ваш прослушивающий сокет был правильно привязан, может быть непросто, учитывая, что у вас есть несколько адресов и интерфейсов для беспокойства. Попробуйте использовать $ sudo tcpdump -i en0 udp port 10000 для проверки дейтаграмм в полете, прежде чем вы даже запустите этот цикл отладки. Вы можете использовать команду на отправляющем хосте, промежуточном транзитном хосте и на хосте назначения. Просматривая $ ifconfig -a, вы можете обнаружить, что интерфейс помимо en0, возможно, туннельный интерфейс, важен для чтения интересующих вас пакетов. Как только вы знаете, определенные пакеты передаются, это имеет тенденцию купростить правильное указание параметров bind().

...