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???

Ответ на: комментарий от 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 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.