Я пытаюсь написать правило iptables
, которое перенаправляет все исходящие UDP-пакеты в локальный сокет, но мне также нужна информация о назначении. Я начал с
sudo iptables -t nat -A sshuttle-12300 -j RETURN --dest 127.0.0.0/8 -p udp
sudo iptables -t nat -A sshuttle-12300 -j REDIRECT --dest 0.0.0.0/0 -p udp --to-ports 15000
И это здорово, теперь я могу получить все исходящие UDP-пакеты, используя сокет на порту 15000.
Теперь мне нужна информация о назначении (целевой хост и номер порта), поэтому достаточно простого сокета UDP; нужен сырой сокет, чтобы он получил полный IP-заголовок.
Однако, как оказалось, полученные пакеты, кажется, адресованы для localhost:15000
. Это имеет смысл, потому что там, где есть сокет, но это не то, что я хочу; Я хочу, чтобы хост/порт перед тем, как пакет был перенаправлен на iptables
.
Googling привел к этому вопросу, с ответом, предлагающим два подхода: TPROXY
и SO_ORIGINAL_DST
, рекомендуя первое, чтобы я попытался пойти с.
Добавлено правило iptables
для TPROXY
:
sudo iptables -t mangle -A PREROUTING -j TPROXY --dest 0.0.0.0/0 -p udp --on-port 15000
Чтение из tproxy.txt, нам нужно создать прослушивающий сокет с опцией IP_TRANSPARENT
(это делается как root):
from socket import *
s = socket(AF_INET, SOCK_RAW, IPPROTO_UDP)
# The IP_TRANSPARENT option isn't defined in the socket module.
# Took the value (19) from the patch in http://bugs.python.org/issue12809
s.setsockopt(SOL_IP, 19, 1)
s.bind(('0.0.0.0', 15000))
s.recv(4096) # Will hang until it receives a packet
Хорошо, теперь давайте напишем еще один script, чтобы создать тестовый пакет, чтобы узнать, что произойдет:
from socket import *
s = socket(AF_INET, SOCK_DGRAM)
s.connect(('192.168.1.1', 9001))
s.send('hello')
Но на принимающей стороне ничего не происходит. Похоже, что вызов recv
зависает, не получая никаких данных.
Итак, общий вопрос заключается в следующем:
- Что-то не так в коде для получения данных из правила
TPROXY
?
или
- Есть ли другой способ достичь этого (перенаправить все исходящие UDP-пакеты в локальный сокет с целью получения информации о назначении)?
Изменить. Я должен настаивать на том, чтобы я хотел перенаправить (следовательно, перехватить) пакеты, а не просто проверять их по мере их прохождения.