Как передать пакеты между двумя сетевыми интерфейсами через вручную написанный фильтр? - PullRequest
0 голосов
/ 04 февраля 2020

У меня на компьютере Linux есть два физических сетевых адаптера: eth0 и eth1. eth0 предназначен для пользователей, а eth1 имеет доступ к внешней сети. Затем я могу сделать iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE, и пользователи могут подключаться к сети за NAT.

Что я хочу сделать: вручную захватывать пакеты из eth0, проверять его (возможно, вносить некоторые изменения, dump et c. ) и напишите обратно в eth1. Примерно так:

         +-------------------------------------+
         |            / my program \           |
user --- |eth0 ----- |tap0 --- tap1| ----- eth1| --- Network
         +-------------------------------------+

Я написал программу, которая открывает tap0 и tap1, просто читает из tap0 и пишет в tap1 и наоборот (пока нет изменений пакета):

tap0 192.168.100.1
tap1 192.168.200.1

Тогда:

ip route add <outer network IP> via 192.168.100.1
iptables -t nat -A POSTROUTING -o tap0 -j MASQUERADE

Я тоже пытался;

iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE`)

Я вижу ARP-запросы, поступающие на tap0 и исходящие от tap1 (повторяется моей программой), но не более того.

Как сделать эти пакеты на go к eth1? Как сделать все входящие пакеты на eth0 до go через мой фильтр и во внешнюю сеть (не только указав c адрес)?

1 Ответ

0 голосов
/ 10 февраля 2020

Есть лучшее решение для моей проблемы: использование NFQUEUE!

iptables -t mangle -A PREROUTING -i eth0 -j NFQUEUE --queue-num 0
iptables -t mangle -A POSTROUTING -o eth0 -j NFQUEUE --queue-num 0

Пример работы с очередью из приложения здесь

...