LINUX.ORG.RU

Почему iptables все портит???

 , , , ,


0

1

Есть скрипт:

ip netns add pr1;
ip link add pr1if0 type veth peer name pr1if1;
ip link set dev pr1if1 netns pr1;

ip link set pr1if0 up;
ip route add local 172.20.1.0 dev pr1if0;
ip route add 172.20.1.0/31 dev pr1if0 src 172.20.1.0;

ip netns exec pr1 ip link set lo up;
ip netns exec pr1 ip link set dev pr1if1 up;
ip netns exec pr1 ip address add 172.20.1.1/31 dev pr1if1;
ip netns exec pr1 ip route add default via 172.20.1.0 dev pr1if1 src 172.20.1.1;

#test
ping 172.20.1.1 -c1;
ip netns exec pr1 ping 172.20.1.0 -c1;
nc -lp 9040 -v -w 2 &
ip netns exec pr1 nc -v 172.20.1.0 9040 -w 2;

#clear
iptables -tnat -F && iptables -tfilter -F && ip netns del pr1;
exit;
- Все нормально работает, 1.1 пингуется, nc устанавливает соединение.

А теперь добавим правило iptables REDIRECT:

ip netns add pr1;
ip link add pr1if0 type veth peer name pr1if1;
ip link set dev pr1if1 netns pr1;

ip link set pr1if0 up;
ip route add local 172.20.1.0 dev pr1if0;
ip route add 172.20.1.0/31 dev pr1if0 src 172.20.1.0;

ip netns exec pr1 ip link set lo up;
ip netns exec pr1 ip link set dev pr1if1 up;
ip netns exec pr1 ip address add 172.20.1.1/31 dev pr1if1;
ip netns exec pr1 ip route add default via 172.20.1.0 dev pr1if1 src 172.20.1.1;

iptables -t nat -A PREROUTING -p tcp -i pr1if0 -j REDIRECT --to-port 9040; #!!!! То, что добавили !!!!!

#test
ping 172.20.1.1 -c1;
ip netns exec pr1 ping 172.20.1.0 -c1;
nc -lp 9040 -v -w 2 &
ip netns exec pr1 nc -v 172.20.1.0 9040 -w 2;

#clear
iptables -tnat -F && iptables -tfilter -F && ip netns del pr1;
exit;
-Результат - все пингуется, но nc установить соединение не может.

Но если заменить «ip route add» на «ip address»:

ip netns add pr1;
ip link add pr1if0 type veth peer name pr1if1;
ip link set dev pr1if1 netns pr1;

ip link set pr1if0 up;
ip address add 172.20.1.0/31 dev pr1if0; #!!!! ВМЕСТО ip route add !!!!!

ip netns exec pr1 ip link set lo up;
ip netns exec pr1 ip link set dev pr1if1 up;
ip netns exec pr1 ip address add 172.20.1.1/31 dev pr1if1;
ip netns exec pr1 ip route add default via 172.20.1.0 dev pr1if1 src 172.20.1.1;

iptables -t nat -A PREROUTING -p tcp -i pr1if0 -j REDIRECT --to-port 9040;

#test
ping 172.20.1.1 -c1;
ip netns exec pr1 ping 172.20.1.0 -c1;
nc -lp 9040 -v -w 2 &
ip netns exec pr1 nc -v 172.20.1.0 9040 -w 2;

#clear
iptables -tnat -F && iptables -tfilter -F && ip netns del pr1;
exit;
- То все опять работает - пингуется, соединение открывается.

Как так? Что произошло? Что творит ip address???

Совет тебе, о молодой фанбой: современные правила фаерволов в текстовом виде это как ассемблер в 1990-2000. Все делают вид что понимают, но на деле очень трудно вникнуть в связи. Дизассемблирование до сих пор очень трудная задача. Так что не выпендривайся и используй высокоуровневые инструменты. Один из (т.е. не единственный) это опенсорсный fwbuilder. Будь другом нарисуй схему.

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

Тут всего одно правило

iptables -t nat -A PREROUTING -p tcp -i pr1if0 -j REDIRECT --to-port 9040;

Я отправляю на локальный порт 9040 все tcp соединения, которые приходят с интерфейса pr1if0

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


[namespace]---->[veth1]----->[veth0]----->[Redirect to 9040]------->[nc -lp 9040]
cyber_eagle
() автор топика
Ответ на: комментарий от anonymous
ip netns add pr1;
ip link add pr1if0 type veth peer name pr1if1;
ip link set dev pr1if1 netns pr1;

ip link set pr1if0 up;
ip route add local 172.20.1.0 dev pr1if0;
ip route add 172.20.1.0/31 dev pr1if0 src 172.20.1.0;

ip netns exec pr1 ip link set lo up;
ip netns exec pr1 ip link set dev pr1if1 up;
ip netns exec pr1 ip address add 172.20.1.1/31 dev pr1if1;
ip netns exec pr1 ip route add default via 172.20.1.0 dev pr1if1 src 172.20.1.1;

iptables -t nat -A PREROUTING -j LOG --log-prefix "BEFORE "
iptables -t nat -A PREROUTING -p tcp -i pr1if0 -j REDIRECT --to-port 9040;
iptables -t nat -A PREROUTING -j LOG --log-prefix "AFTER "

ping 172.20.1.1 -c1;
ip netns exec pr1 ping 172.20.1.0 -c1;
nc -lp 9040 -v -w 2 &
ip netns exec pr1 nc -v 172.20.1.0 9040 -w 2;

iptables -tnat -F && iptables -tfilter -F && ip netns del pr1;
exit;
[ 1055.115706] BEFORE IN=pr1if0 OUT= MAC=ea:b2:c8:6f:dc:d6:46:99:56:81:38:a7:08:00 SRC=172.20.1.1 DST=172.20.1.0 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=19746 DF PROTO=ICMP TYPE=8 CODE=0 ID=9172 SEQ=1 
[ 1055.115710] AFTER IN=pr1if0 OUT= MAC=ea:b2:c8:6f:dc:d6:46:99:56:81:38:a7:08:00 SRC=172.20.1.1 DST=172.20.1.0 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=19746 DF PROTO=ICMP TYPE=8 CODE=0 ID=9172 SEQ=1 
[ 1055.148049] BEFORE IN=pr1if0 OUT= MAC=ea:b2:c8:6f:dc:d6:46:99:56:81:38:a7:08:00 SRC=172.20.1.1 DST=172.20.1.0 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=7997 DF PROTO=TCP SPT=53512 DPT=9040 WINDOW=29200 RES=0x00 SYN URGP=0 
[ 1056.163164] BEFORE IN=pr1if0 OUT= MAC=ea:b2:c8:6f:dc:d6:46:99:56:81:38:a7:08:00 SRC=172.20.1.1 DST=172.20.1.0 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=7998 DF PROTO=TCP SPT=53512 DPT=9040 WINDOW=29200 RES=0x00 SYN URGP=0 

Получается, что пакет попадает в правило REDIRECT...А что с ним дальше происходит???

--------------

используй высокоуровневые инструменты

Вангую, что тогда найдутся те, кто будет вопить «НЕ ЗНАЕШЬ МАТЧАСТЬ!»)))

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

iptables здесь не виноват.

Сравни

ip address add 172.20.1.0/31 dev pr1if0
и
ip route add local 172.20.1.0 dev pr1if0
ip route add 172.20.1.0/31 dev pr1if0 src 172.20.1.0

по результатам ip a; ip ro

REDIRECT требует корректных настроек, в отличии от DNAT.

vel ★★★★★
()
Ответ на: комментарий от vel
ip netns add pr1;
ip link add pr1if0 type veth peer name pr1if1;
ip link set dev pr1if1 netns pr1;

ip link set pr1if0 up;
ip address add 1.1.1.1/32 dev pr1if0; # !!! add random address !!!
ip route add local 172.20.1.0 dev pr1if0;
ip route add 172.20.1.0/31 dev pr1if0 src 172.20.1.0;

ip netns exec pr1 ip link set lo up;
ip netns exec pr1 ip link set dev pr1if1 up;
ip netns exec pr1 ip address add 172.20.1.1/31 dev pr1if1;
ip netns exec pr1 ip route add default via 172.20.1.0 dev pr1if1 src 172.20.1.1;

iptables -t nat -A PREROUTING -j LOG --log-prefix "BEFORE "
iptables -t nat -A PREROUTING -p tcp -i pr1if0 -j REDIRECT --to-port 9040;
iptables -t nat -A PREROUTING -j LOG --log-prefix "AFTER "

ping 172.20.1.1 -c1;
ip netns exec pr1 ping 172.20.1.0 -c1;
nc -lp 9040 -v -w 2 &
ip netns exec pr1 nc -v 172.20.1.0 9040 -w 2;

iptables -tnat -F && iptables -tfilter -F && ip netns del pr1;
exit;

Так он будет работать. Это разве корректно?

ip address делает много чего. Что именно нужно REDIRECT?

cyber_eagle
() автор топика
Ответ на: комментарий от vel

ip address делает это:

7: veth0@veth1: <BROADCAST,MULTICAST,M-DOWN> mtu 1500 qdisc noop state DOWN group default qlen 1000                                                                                                                                          
    link/ether 2e:b1:3d:98:6b:56 brd ff:ff:ff:ff:ff:ff                                                                                                                                                                                       
    inet 1.1.1.1/32 scope global veth0                                                                                                                                                                                                       
       valid_lft forever preferred_lft forever                                                                                                                                                                                               
    inet 3.1.1.1/32 scope global veth0                                                                                                                                                                                                       
       valid_lft forever preferred_lft forever      
Почему с «ip route» нельзя так сделать? Зачем он тогда вообще нужен, если не позволяет нормально добавить маршрут?

cyber_eagle
() автор топика
Ответ на: комментарий от vel
ip netns add pr1;
ip link add pr1if0 type veth peer name pr1if1;
ip link set dev pr1if1 netns pr1;

ip link set pr1if0 up;
ip address add 1.1.1.0/31 dev pr1if0;
ip route del local 1.1.1.0; # !!! demolish route !!!
ip address show pr1if0;

ip netns exec pr1 ip link set lo up;
ip netns exec pr1 ip link set dev pr1if1 up;
ip netns exec pr1 ip address add 1.1.1.1/31 dev pr1if1;

ping 1.1.1.1 -c1 -W1;
ip netns exec pr1 ping 1.1.1.0 -c1 -W1;
nc -lp 9040 -v -w 2 &
ip netns exec pr1 nc -v 1.1.1.0 9040 -w 2;

iptables -tnat -F && iptables -tfilter -F && ip netns del pr1;
exit;
20: pr1if0@if19: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether 7e:7a:d1:4a:82:61 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 1.1.1.0/31 scope global pr1if0
       valid_lft forever preferred_lft forever
PING 1.1.1.1 (1.1.1.1) 56(84) bytes of data.

--- 1.1.1.1 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

PING 1.1.1.0 (1.1.1.0) 56(84) bytes of data.

--- 1.1.1.0 ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

Listening on [0.0.0.0] (family 0, port 9040)
nc: connect to 1.1.1.0 port 9040 (tcp) timed out: Operation now in progress

Где еще хранится адрес интерфейса кроме таблицы маршрутизации и зачем, если после удаления с таблицы он не работает не смотря на вывод ip address?

cyber_eagle
() автор топика

вот первый вариант с ip route add local :

38: pr1if0@if37: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether 66:07:43:4f:e9:82 brd ff:ff:ff:ff:ff:ff link-netnsid 1
172.20.1.0/31 dev pr1if0 scope link src 172.20.1.0 linkdown 

вот второй c ip address:
40: pr1if0@if39: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state LOWERLAYERDOWN group default qlen 1000
    link/ether 72:c4:39:25:e4:fc brd ff:ff:ff:ff:ff:ff link-netnsid 1
    inet 172.20.1.0/31 scope global pr1if0
       valid_lft forever preferred_lft forever
172.20.1.0/31 dev pr1if0 proto kernel scope link src 172.20.1.0 linkdown 

обрати внимание на наличие ip-адреса и

proto kernel

теперь этот интерфейс будет корректно обрабатываться ядром, и, следовательно его можно отфильтровывать правилами iptables

bass ★★★★★
()
Ответ на: комментарий от bass
ip link set pr1if0 up;
ip address add 1.1.1.1/32 dev pr1if0; # !!! add random address !!!
ip route add local 172.20.1.0 dev pr1if0;
ip route add 172.20.1.0/31 dev pr1if0 src 172.20.1.0;

Но ведь так он тоже отлично работал. Хотя 1,1,1,1/32 при маршрутизации абсолютно никак не используется.

Я даже больше скажу: для bind важно только наличие записи local в таблице маршрутизации.

cyber_eagle
() автор топика
Ответ на: комментарий от vel

Наверно только так... Ушел в исходники...

Здравствуй, Геморой!

cyber_eagle
() автор топика
Ответ на: комментарий от vel

Емнип. Я понял, зачем интерфейсу нужен адрес!

ip netns add pr1;
ip link add pr1if0 type veth peer name pr1if1;
ip link set dev pr1if1 netns pr1;

ip link set pr1if0 up;
ip address add 1.1.1.1 dev pr1if0;
ip route add local 172.20.1.0 dev pr1if0;
ip route add 172.20.1.0/31 dev pr1if0;

ip netns exec pr1 ip link set lo up;
ip netns exec pr1 ip link set dev pr1if1 up;
ip netns exec pr1 ip address add 172.20.1.1/31 dev pr1if1;
ip netns exec pr1 ip route add default via 172.20.1.0 dev pr1if1 src 172.20.1.1;

iptables -t nat -A PREROUTING -j LOG --log-prefix "P_BEFORE "
iptables -t nat -A PREROUTING -p tcp -i pr1if0 -j REDIRECT --to-port 9040;
iptables -t nat -A PREROUTING -j LOG --log-prefix "P_AFTER "

iptables -tmangle -A INPUT -i pr1if0 -j LOG --log-prefix "INPUT_t "

nc -lp 9050 -v -w 2 &
ip netns exec pr1 nc -v 171.20.1.0 9050 -w 2;

iptables -tnat -F && iptables -tfilter -F && iptables -tmangle -F && ip netns del pr1;
exit;

nc: Address already in use
nc: connect to 171.20.1.0 port 9050 (tcp) failed: Connection refused
[22310.547298] P_BEFORE IN=pr1if0 OUT= MAC=c2:19:29:8f:29:95:ba:4a:5f:b6:d8:ca:08:00 SRC=172.20.1.1 DST=171.20.1.0 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=41640 DF PROTO=TCP SPT=43382 DPT=9050 WINDOW=29200 RES=0x00 SYN URGP=0 
[22310.547307] INPUT_t IN=pr1if0 OUT= MAC=c2:19:29:8f:29:95:ba:4a:5f:b6:d8:ca:08:00 SRC=172.20.1.1 DST=1.1.1.1 LEN=60 TOS=0x00 PREC=0x00 TTL=64 ID=41640 DF PROTO=TCP SPT=43382 DPT=9040 WINDOW=29200 RES=0x00 SYN URGP=0 

А теперь удалим локальный маршрут 1.1.1.1:

ip netns add pr1;
ip link add pr1if0 type veth peer name pr1if1;
ip link set dev pr1if1 netns pr1;

ip link set pr1if0 up;
ip address add 1.1.1.1 dev pr1if0;
ip route add local 172.20.1.0 dev pr1if0;
ip route add 172.20.1.0/31 dev pr1if0;

ip netns exec pr1 ip link set lo up;
ip netns exec pr1 ip link set dev pr1if1 up;
ip netns exec pr1 ip address add 172.20.1.1/31 dev pr1if1;
ip netns exec pr1 ip route add default via 172.20.1.0 dev pr1if1 src 172.20.1.1;

iptables -t nat -A PREROUTING -j LOG --log-prefix "P_BEFORE "
iptables -t nat -A PREROUTING -p tcp -i pr1if0 -j REDIRECT --to-port 9040;
iptables -t nat -A PREROUTING -j LOG --log-prefix "P_AFTER "

iptables -tmangle -A INPUT -i pr1if0 -j LOG --log-prefix "INPUT_t "

ip route del local 1.1.1.1; # !!! HERE ITS !!!!
nc -lp 9050 -v -w 2 &
ip netns exec pr1 nc -v 171.20.1.0 9050 -w 2;

iptables -tnat -F && iptables -tfilter -F && iptables -tmangle -F && ip netns del pr1;
exit;
Listening on [0.0.0.0] (family 0, port 9050)
nc: connect to 171.20.1.0 port 9050 (tcp) timed out: Operation now in progress

Все дело в том, что REDIRECT в атрибутах пакета выставляет адрес назначения тот, который в описании интерфейса! «SRC=172.20.1.1 DST=1.1.1.1». Соответственно, если local 1.1.1.1 не будет, то пакет после INPUT уйдет вникуда.

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

Твою бы энергию да в мирных целях...

Наиболее простой способ выяснить где проблема была команда

iptables -t raw -A PREROUTING -i pr1if0 -j TRACE

если на интерфейсе нет адреса, то трассировка обрывается после nat/PREROUTING и продолжается в mangle/INPUT если есть адрес.

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