LINUX.ORG.RU

Странное поведение iptables в зависимости от маршрутизации


0

0

Не могу разобраться с iptables и правилами маршрутизации. Суть примерно такая : Есть комп подключенный к интернет (по VPN устройство ppp0) имеет внешний IP 217.144.190.144 С другой строны подключен к локальной сети с IP 192.168.18.1 через устройство vmnet1. В этой локальной сети стоит HTTP сервер с адресом 192.168.18.162 Соответственно на настроен DNAT. Правила iptables выглядят следующим образом.

# Generated by iptables-save v1.4.3.1 on Thu Jul 16 02:13:08 2009 *mangle :PREROUTING ACCEPT [12761:1833017] :INPUT ACCEPT [7148:1244232] :FORWARD ACCEPT [146:54997] :OUTPUT ACCEPT [6743:526128] :POSTROUTING ACCEPT [6889:581125] -A FORWARD -j LOG --log-prefix " MANGLE FORWARD " COMMIT # Completed on Thu Jul 16 02:13:08 2009 # Generated by iptables-save v1.4.3.1 on Thu Jul 16 02:13:08 2009 *filter :INPUT ACCEPT [20677:3825546] :FORWARD ACCEPT [146:54997] :OUTPUT ACCEPT [16974:1334126] -A FORWARD -j LOG --log-prefix " FILTER FORWARD " COMMIT # Completed on Thu Jul 16 02:13:08 2009 # Generated by iptables-save v1.4.3.1 on Thu Jul 16 02:13:08 2009 *nat :PREROUTING ACCEPT [19052:1891076] :POSTROUTING ACCEPT [1126:68946] :OUTPUT ACCEPT [1120:68658] -A PREROUTING -i ppp31 -j LOG --log-prefix " NAT PREROUTING " -A PREROUTING -d 217.144.190.130/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.18.162:8080 COMMIT # Completed on Thu Jul 16 02:13:08 2009

Когда пытаешься зайти на сервер все работает отлично! Вот лог от такой сессии.

Jul 16 01:59:22 indigo klogd: NAT PREROUTING IN=ppp0 OUT= MAC= SRC=213.87.76.147 DST=217.144.190.144 LEN=48 TOS=0x00 PREC=0x00 TTL=118 ID=620 DF PROTO=TCP SPT=36521 DPT=80 WINDOW=32768 RES=0x00 SYN URGP=0 Jul 16 01:59:22 indigo klogd: MANGLE FORWARD IN=ppp0 OUT=vmnet1 SRC=213.87.76.147 DST=192.168.18.162 LEN=48 TOS=0x00 PREC=0x00 TTL=117 ID=620 DF PROTO=TCP SPT=36521 DPT=8080 WINDOW=32768 RES=0x00 SYN URGP=0 Jul 16 01:59:22 indigo klogd: MANGLE FORWARD IN=ppp0 OUT=vmnet1 SRC=213.87.76.147 DST=192.168.18.162 LEN=48 TOS=0x00 PREC=0x00 TTL=117 ID=620 DF PROTO=TCP SPT=36521 DPT=8080 WINDOW=32768 RES=0x00 SYN URGP=0 Jul 16 01:59:22 indigo klogd: FILTER FORWARD IN=ppp0 OUT=vmnet1 SRC=213.87.76.147 DST=192.168.18.162 LEN=48 TOS=0x00 PREC=0x00 TTL=117 ID=620 DF PROTO=TCP SPT=36521 DPT=8080 WINDOW=32768 RES=0x00 SYN URGP=0

Входящий пакте как ему и положено проходит NAT.PREROUTING->MANGLE.FORWARD->FILTER.FORWARD Но! Если удаляешь маршрут по умолчанию в инет через ppp0. То лог становить вот таким!

Jul 16 02:04:21 indigo klogd: NAT PREROUTING IN=ppp0 OUT= MAC= SRC=213.87.76.147 DST=217.144.190.144 LEN=48 TOS=0x00 PREC=0x00 TTL=118 ID=646 DF PROTO=TCP SPT=37857 DPT=80 WINDOW=32768 RES=0x00 SYN URGP=0 Jul 16 02:04:21 indigo klogd: martian source 192.168.18.162 from 213.87.76.147, on dev ppp0 Jul 16 02:04:21 indigo klogd: ll header: 45:00:00:30 Jul 16 02:04:24 indigo klogd: NAT PREROUTING IN=ppp0 OUT= MAC= SRC=213.87.76.147 DST=217.144.190.144 LEN=48 TOS=0x00 PREC=0x00 TTL=118 ID=647 DF PROTO=TCP SPT=37857 DPT=80 WINDOW=32768 RES=0x00 SYN URGP=0 Jul 16 02:04:24 indigo klogd: martian source 192.168.18.162 from 213.87.76.147, on dev ppp0 Jul 16 02:04:24 indigo klogd: ll header: 45:00:00:30 Jul 16 02:04:30 indigo klogd: NAT PREROUTING IN=ppp0 OUT= MAC= SRC=213.87.76.147 DST=217.144.190.144 LEN=48 TOS=0x00 PREC=0x00 TTL=118 ID=648 DF PROTO=TCP SPT=37857 DPT=80 WINDOW=32768 RES=0x00 SYN URGP=0 Jul 16 02:04:30 indigo klogd: martian source 192.168.18.162 from 213.87.76.147, on dev ppp0 Jul 16 02:04:30 indigo klogd: ll header: 45:00:00:30

Да, я понимаю, что работать не должно потому что с внутреннего хоста 192.168.18,162 нет маршрута в инет! Но почему входящий пакет. Первый пакет перестал попадать в цепочки FORWARD??? Маршрут в сеть 192.168.18.* определен! Как вообще логика работы iptables связана с маршрутизацией???? И что значить «martian source 192.168.18.162 from 213.87.76.147, on dev ppp0» почему 192.168.18.162 это источник? Это же назначение?

Кто ни будь может объяснить столь странное поведение iptables?


Читать не стал, ибо форматирование...

Morphine
()

Получается, что фильтрация martian-пакетов происходит после того, как пакет проходит -t nat PREROUTING, что подтверждается здесь: http://lists.netfilter.org/pipermail/netfilter-devel/2007-June/028078.html

Вы меняете в PREROUTING адрес и логирует пакет, а дальше ядро его фильрует и он не попадает в -t filter FORWARD. Можно выключть фильтрацию martian-пакетов.

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

Да, действительно! Вот такая штука решила проблему.

echo 0 > /proc/sys/net/ipv4/conf/eth0/rp_filter

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