iptables port-mirroring

8

Мне нужно иметь возможность получить копию пакетов, полученных через порт 8001 на порт 8002. Я пробовал следующее, но я получаю сообщение об ошибке --tee не определено.

sudo iptables -t nat -A PREROUTING -p TCP -s 127.0.0.1 --sport 8001 -j DNAT --to-destination 127.0.0.1:8002 --tee
Парикшит
источник
Ваше ядро ​​или iptablesможет быть слишком старым; см. Отправка дублированных пакетов через два интернет-соединения.
Жиль "ТАК - перестань быть злым"
На этот вопрос можно ответить здесь: superuser.com/questions/753294/mirror-port-via-iptables/…
Пэт

Ответы:

6

--teeФлаг не является частью DNAT цепи, она является частью ROUTE. Вы можете использовать его только после декларации -j ROUTE. Вы можете получить конкретную помощь от iptables по этому вопросу:

 $ iptables -j ROUTE help

Я смотрел на вашу команду iptables, и она не имеет никакого смысла для меня. Почему вы пытаетесь соответствовать против порта источника и источника пакета , когда в вашем вопросе вы сказали «packegs получил на порт»? Вы пытаетесь разделить входящий трафик на два порта или взять выход одного порта и связать его с входом другого?

Если первое, то здесь действительно два шага. Вы не можете использовать tee, чтобы получить копию пакета И манипулировать пакетом, чтобы изменить номера портов одновременно. Вы можете попробовать это в два этапа, сначала отправив себе дубликат копии пакета, затем сопоставив только копию и искажая порт назначения. ВНИМАНИЕ: не проверено, рассмотрите этот псевдокод:

$ sudo iptables -A PREROUTING -t mangle -p tcp -s !127.0.0.1/32 --dport 8001 -j ROUTE --gw 127.0.0.1 --tee
$ sudo iptables -A POSTROUTING -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002
Калеб
источник
1
Внимание ... другой посетитель сайта отметил, что подобная версия фактически приводит к бесконечному циклу! Возможно, вам необходимо выяснить, как пометить дублированный пакет в том же действии, а затем сопоставить его с тегом.
Калеб
МАРШРУТ кажется устаревшим, верно?
маргаритка
Это просто опечатка, 172.0.0.1 -> 127.0.0.1.
Аки
1
Примечание для читателей SE: ROUTEцель, использованная в ответе выше, на момент написания статьи устарела и недоступна в iptables на самых последних дистрибутивах. См. Serverfault.com/questions/333155/…
Джонатан Бен-Авраам
6

В дополнение к ответу Caleb , если вы работаете с более новой iptablesверсией (v1.4.14), у которой больше нет ROUTEцели, вам понадобится что-то вроде следующего, протестированное на Debian Wheezy *:

iptables -A PREROUTING -t mangle -p tcp ! -s 127.0.0.1 --dport 8001 -j TEE --gateway 127.0.0.1
iptables -A OUTPUT -t nat -p tcp -s 127.0.0.1/32 --dport 8001 -j DNAT --to 127.0.0.1:8002

Протестируйте с помощью netcat ( man nc). В окне терминала введите следующее и нажмите Enterклавишу:

nc -l 8002

Команда будет ожидать ввода, который вы наберете во втором окне терминала.

Во втором окне терминала введите следующее и нажмите Enterклавишу:

nc 127.0.0.1 8001

Команда будет ждать дальнейшего ввода. Введите что-нибудь и нажмите Enterклавишу. После того, как вы нажмете Enterклавишу во втором окне терминала, текст, который вы набрали во втором окне терминала, должен появиться в первом окне терминала. Нажмите Ctrl-c во втором окне, чтобы завершить сеанс.


* Этот синтаксис не поддерживается в RHEL / Centos (6.5 или более ранней версии) :-(, поэтому вам нужно использовать socatдля передачи и пересылки входящих пакетов на исходном порту на два новых порта. Если у вас были процессы, прослушивающие исходный порт приема, то вы необходимо перенастроить их для прослушивания на одном из портов tee'd, как socatсейчас слушатель на исходном порте. См. этот пост SE для примера socatсинтаксиса клонирования портов.

Джонатан Бен-Авраам
источник
По какой-то причине в Debian вам нужно явно указать порт с помощью netcatnc -l -p 8002
Marcelo Lacerda
Я пытался повторить это решение на моем Mint 19 Tessa безрезультатно. Я обнаружил, что некоторые пакеты просто подпрыгивают внутри, и только один из двух портов получает пакет. Если я делаю ошибку, добавляя ведение журнала, чтобы попытаться устранить неисправность в правиле, журналы (ядро, системный журнал, журнал) быстро пожирают мое хранилище.
Hanzo2001
Я также не понимаю, почему DNAT установлен в цепочке OUTPUT. Разве пакет уже не оставляет мой процесс для внешнего мира? или петлевые адреса ведут себя иначе?
Hanzo2001