LINUX.ORG.RU
ФорумAdmin

iptables NAT logging

 , , ,


2

2

Здравствуйте!

Трубуется записать все соединения клиентов на OpenVPN сервере:

iptables -t nat -A PREROUTING -p tcp -s 10.0.0.0/8 --syn -j LOG --log-prefix «TCPLOG » --log-level debug

iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE

При этом в логе остаются записи след вида:

Jul 9 14:22:38 56664 kernel: [1637258.474989] TCPLOG IN=tun0 OUT= MAC= SRC=10.8.0.46 DST=79.183.194.195 LEN=52 TOS=0x00 PREC=0x00 TTL=128 ID=29097 DF PROTO=TCP SPT=14839 DPT=80 WINDOW=8192 RES=0x00 SYN URGP=0

Мне же надо сохранить внешний IP и порт, который использовал сервер для соединения (т.е. то что выбрал NAT при выполнении MASQUERADE).

Следующие правила не помогли:

iptables -t filter -A OUTPUT -p tcp -s 10.0.0.0/8 --syn -j LOG --log-prefix «TCPLO2 » --log-level debug

iptables -t nat -A OUTPUT -p tcp -s 10.0.0.0/8 --syn -j LOG --log-prefix «TCPLO3 » --log-level debug

ОС: Debian 6

Не вникая в проблему, хочу всё же спросить -

внешний IP и порт откуда возьмутся в PREROUTING?

zgen ★★★★★ ()
Ответ на: комментарий от zgen

Да понятно что неоткуда. Текущее содержание лога весьма логично. Но не могу добиться большего - записи внешнего айпи-порта.

Правило «iptables -t filter -A OUTPUT ...» сохраняет всё что надо, но кроме трафика, который прошёл через MASQUERADE.

Вот в чём проблема.

unlimited ()
Ответ на: комментарий от unlimited

Маркируйте трафик на входе и вставляйте -j log по маркеру через весь путь пакета. (можно посмотреть в доке к IPTABLES, через какие таблицы пробежит трафик для роута)

zgen ★★★★★ ()
Ответ на: комментарий от zgen

Следующие сочетания правил ничего не логгируют. Маркировка работает нормально - в других случаях оно пишет лог на маркированный трафик, но только не после MASQUERADE/SNAT.

Т.е. по сути то же самое поведение, что и без маркировки.

Вариант 1:

iptables -t nat -A PREROUTING -p tcp -s 10.0.0.0/8 --syn -j MARK --set-mark 2

iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE

iptables -t nat -A OUTPUT -m mark --mark 2 -j LOG --log-prefix «TCPLOG » --log-level debug

Вариант 2:

iptables -t nat -A POSTROUTING -p tcp -s 10.0.0.0/8 --syn -j MARK --set-mark 2

iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE

iptables -t nat -A OUTPUT -m mark --mark 2 -j LOG --log-prefix «TCPLOG » --log-level debug

(((

unlimited ()
Ответ на: комментарий от anon8

откуда в OUTPUT возьмется трафик после маскарадинга?

Да понятно что неоткуда.

Пр-моему он тупо наобум втыкает, вместо того, чтобы в доке посмотреть.

zgen ★★★★★ ()
Ответ на: комментарий от anon8

да, тупил. И да, наобум пробовал.

Сегодня начитался доков и наэкпериментировался.

Переформулирую суть проблемы:

Маскарадинг при роутинге производится в nat.POSTROUTING. Проблемы две:

  • Это самая последняя цепочка правил при роутинге
  • (И САМОЕ ГЛАВНОЕ) Даже маркированный трафик после команды SNAT тупо исчезает. Т.е. как ни фильтруй следующим правилом - трафика этого уже нет.

А задача - занести в лог внешний айпи-порт, выбранный этим SNAT (либо MASQUERADE).

Поясню «исчезновение трафика»:

-A POSTROUTING -p tcp -s 10.0.0.0/8 --syn -j MARK --set-mark 4
-A POSTROUTING -m mark --mark 4 -j LOG --log-prefix "TCPLO1 " --log-level debug
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j SNAT --to-source 12.23.34.56
-A POSTROUTING -m mark --mark 4 -j LOG --log-prefix "TCPLO2 " --log-level debug
-A POSTROUTING -p tcp --syn -j LOG --log-prefix "TCPLO3 " --log-level debug
В данном случае TCPLO1 будет занесено в лог с локальным айпи (10.*.*.*), а TCPLO2 не запишется никогда. TCPLO3 будет логгировать любой трафик (например исходящий от текущего сервера) КРОМЕ того, что прошёл через SNAT.

unlimited ()
Ответ на: комментарий от mky

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

Только данных будет избыточно много + есть вероятность потерь данных о соединениях если скажем веб запрос был произведён быстро и соединение сразу разорвано.

Или все как раз так кривовато и делают?

unlimited ()
Ответ на: комментарий от unlimited

Повторю проблему ещё раз.

Мне надо вести лог соединений TCP после выполнения команды SNAT/MASQUERADE.

Почему-то эта задача оказалась нетривиальной в iptables.

unlimited ()
Ответ на: комментарий от unlimited

Или суть идеи в том, чтобы написать скрипт, который раз в секунду будет сохранять список всех соединений из conntrack?

Вы вобще пробовали запустить приведённую мною команду? При чём там одна секунда, там идёт непрерывный вывод изменений в таблице conntrack'а, по которой и осуществляется NAT. Можно добавить к команде "-e NEW,DESTROY -p tcp", тогда данных будет меньше. Потом сопоставляйте эти данные и данные от «iptables -j LOG», если нужна информация о пакетах.

Или все как раз так кривовато и делают?

Первый раз слышу подобную задачу, чтобы кому-то было нужно, с какого SNAT-порта кто-то ходил и Инет. Всем хватало, чтобы было залогировано кто и куда ходил и всё.

Почему-то эта задача оказалась нетривиальной в iptables.

Напишите свои модули к iptables, если что-то не устраивает в существующих.

mky ★★★★★ ()
Ответ на: комментарий от mky

Спасибо! Не разобрался сразу что это вывод именно обновлений таблицы.

Попробовал сейчас.

К сожалению те же грабли, что и у iptables:

conntrack -E -o timestamp -p tcp -e NEW

для транзитных соединений пишет: [1342652370.202217] [NEW] tcp 6 120 SYN_SENT src=10.0.1.14 dst=177.40.129.101 sport=4882 dport=11523 [UNREPLIED] ....

Т.е. опять теряется исходящий Айпи-порт. (((

А нужен это грёбаный порт потому, что мне надо обрабатывать DMCA жалобы на локальных пользователей. А в этой жалобе обычно жалуются на P2P попытки скачать «запретный» контент и указывают ТОЛЬКО время, айпи и порт с которого было соединение. Куда было соединение не указывается.

unlimited ()
Ответ на: комментарий от unlimited

Вот формат записи http://www.dqd.com/~mayoff/notes/linux/ip_conntrack.html

Там приводятся данные исходного пакета (от локальной машины) и данные ответного пакета (от машины в Инете). Данные ответного пакета это фактически записанные зеркально данные отправленного в Инет пакета. Вот пример записи, когда с хоста 192.168.100.223 было соединение на ya.ru и "-j SNAT --to-source X.X.X.X".

[NEW] tcp      6 120 SYN_SENT src=192.168.100.223 dst=77.88.21.3 sport=41234 dport=80 packets=1 bytes=60
[UNREPLIED] src=77.88.21.3 dst=X.X.X.X sport=80 dport=41234 packets=0 bytes=0

После [UNREPLIED] идут те ip-адреса, с которыми пакет «ушёл» в Инет. Записаны они для ответного пакета, но означают, что пакет ушёл от адреса X.X.X.X:41234 на адрес 77.88.21.3:80.

Когда Линукс делает SNAT (MASQRADE) sport по возможности не меняется. Только когда порт уже занят, происходит замена src-порта.

Попробуёте с разных машин с одного и того же src-порта установить соединение с одим и тем же адресом в Инете и тогда в выводе conntrack будут разные порты. Например, выполняем одновременно на машинах 192.168.100.223 и 192.168.100.233 команды «nc -p 45001 77.88.21.3 80» и в выводе conntrack будет:

[NEW] tcp      6 120 SYN_SENT src=192.168.100.233 dst=77.88.21.3 sport=45001 dport=80 packets=1 bytes=60
[UNREPLIED] src=77.88.21.3 dst=X.X.X.X sport=80 dport=45001 packets=0 bytes=0

[NEW] tcp      6 120 SYN_SENT src=192.168.100.223 dst=77.88.21.3 sport=45001 dport=80 packets=1 bytes=60
[UNREPLIED] src=77.88.21.3 dst=X.X.X.X sport=80 dport=1024 packets=0 bytes=0

Один пакет ушёл в инет с порта 45001, а другой с порта 1024.

P.S. А p2p по tcp работает, а не по udp?

mky ★★★★★ ()
Ответ на: комментарий от mky

Спасибо большое!

Невнимателен был. Я посмотрел, что порты не меняются и один из айпи тот же самый и не заметил, что другой уже внешний. Даже в тему приводить не стал окончание записи... Плюс сохранение портов меня очень сбило с толку. Был уверен, что должны смениться.

По P2P у меня предстоит отдельная головная боль. Не уверен насколько используется tcp, а насколько - udp.

А в перспективе - ограничить скорость P2P без существенного ограничения обычного интернета. Как вариант - вообще запретить P2P (но чтобы skype со своим p2p всё равно работал).

unlimited ()
Ответ на: комментарий от mky

Ещё раз спасибо!

Получается я вообще выключу логгирование в iptables и запущу команду (+автостарт, +ротация лога):

conntrack -E -o timestamp -p tcp -e NEW >> /var/log/tcp_connections

И в каждой строке у меня будет уникальное соединение (без повторов и пропусков) с полным набором информации о себе.

unlimited ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.