LINUX.ORG.RU

Отладка iptables REDIRECT, который ведет себя нехорошо

 , , ,


0

1

Здрасте! Пытаюсь сделать вот, что: (цель: прокси для приложения с поощью namespace)

iptables -tnat -F && iptables -tfilter -F;

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

ip route add local 172.20.1.1 dev pr1if0;
ifconfig pr1if0 up;
ip route add 172.20.1.0/24 dev pr1if0 src 172.20.1.1;

ip netns exec pr1 ifconfig lo up;
ip netns exec pr1 ip route add local 172.20.1.2 dev pr1if1;
ip netns exec pr1 ifconfig pr1if1 up;
ip netns exec pr1 ip route add 172.20.1.0/24 dev pr1if1 src 172.20.1.2;
ip netns exec pr1 ip route add default via 172.20.1.1 src 172.20.1.2;

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

#test
nc -lp 9040 -v &
ip netns exec pr1 nc 172.20.1.1 789;

Проблема в том, что на 9040 соединения не приходят. Причем «ip netns exec pr1 ping 172.20.1.1» пингуется.

Проверял счетчик iptables - при попытках соединится пакеты проходят через правило redirect, но дальше пропадают непонятно куда... Думал, чтото не то с iptables, но на физическом интефрейсе -j REDIRECT работает нормально...

Может кто нибудь отлаживал такие вещи? Буду благодарен за подсказку)

IMHO много левых действий, смысл которых отсутствует.

ip route add local 172.20.1.1 dev pr1if0;
ifconfig pr1if0 up;
ip route add 172.20.1.0/24 dev pr1if0 src 172.20.1.1;
Откуда такой «рецепт» ?

т.е. сказать ifconfig pr1if0 172.20.1.1/24 или в старом варианте ifconfig pr1if0 172.20.1.1 netmask 255.255.255.0 нельзя ?

Если ты такой фанат iproute2, то и «ifconfig dev up» замени на «ip li dev XXX up»

Тоже самое в pr1

Все работает.

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

ifconfig pr1if0 172.20.1.1/24
ip li set pr1if0 upiptables -t nat -A PREROUTING -p tcp -i pr1if0 -j REDIRECT --to-port 9040
nc -l -p 9040

ip netns exec pr1 ifconfig lo 127.0.0.1/8
ip netns exec pr1 ifconfig pr1if1 172.20.1.2/24
ip netns exec pr1 wget -Y off -d http://172.20.1.1/

Если что-то не работает, то tcpdump в помощь или в тяжелых случаях «iptables -j TRACE»

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 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 -p tcp -i pr1if0 -j REDIRECT --to-port 9040;

nc -lp 9040 -v -w 2 &
ip netns exec pr1 nc -v 45.45.45.45 45 -w 2;

iptables -tnat -F && iptables -tfilter -F && ip netns del pr1;
exit;
-Работает

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;

nc -lp 9040 -v -w 2 &
ip netns exec pr1 nc -v 45.45.45.45 45 -w 2;

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

-Не работает (но 172.20.1.0 пингуется с namespace; в wireshark видно, что SYN приходит; счетчик iptables правила увеличивается)

Почему это происходит? Может я чтото упустил? «ip address» делает магию?

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

REDIRECT ничего не знает про сокет. Он тупо меняет порт и определяет адрес интерфейса.

за /31 для локальной сети нужно больно бить по рукам.

Нифиг выёживаться с «ip route add local» если не знаешь всех тонкостей ip-шного роутинга в онтопике :)

Сравни результаты нормального назначения адрес через «ip addr add» и твоего изобретения.

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

REDIRECT ничего не знает про сокет. Он тупо меняет порт и определяет адрес интерфейса.

Мне всегда казалось, что он ищет именно сокет, и сразу ему передает соединение. А адрес/порт назначения оставляет. Именно благодаря этому в приложении можно воспользоваться getpeername(), и получить реальный адресс назначения.

Это просто паника)

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/32 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 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;

nc -lp 9040 -v -w 2 &
ip netns exec pr1 nc -v 45.45.45.45 45 -w 2;

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

И так работает...

Выходит, что ip address делает чтото еще, кроме заполнения таблицы, хотя судя по strace, выполняют действия с тем же сокетом

«ip address add 172.16.20.20/24 dev veth0»:

sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"(\0\0\0\24\0\5\6\376\311\366Z\0\0\0\0\2\30\0\0\3\0\0\0\10\0\2\0\254\20\24\24"..., 40}], msg_controllen=0, msg_flags=0}, 0) = 40
 * 40 bytes in buffer 0
 | 00000  28 00 00 00 14 00 05 06  fe c9 f6 5a 00 00 00 00  (..........Z.... |
 | 00010  02 18 00 00 03 00 00 00  08 00 02 00 ac 10 14 14  ................ |
 | 00020  08 00 01 00 ac 10 14 14                           ........         |

«ip route add local 172.16.20.16 dev veth1»:
sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{",\0\0\0\30\0\5\6t\315\366Z\0\0\0\0\2 \0\0\377\3\376\2\0\0\0\0\10\0\1\0"..., 44}], msg_controllen=0, msg_flags=0}, 0) = 44
 * 44 bytes in buffer 0
 | 00000  2c 00 00 00 18 00 05 06  74 cd f6 5a 00 00 00 00  ,.......t..Z.... |
 | 00010  02 20 00 00 ff 03 fe 02  00 00 00 00 08 00 01 00  . .............. |
 | 00020  ac 10 14 10 08 00 04 00  04 00 00 00              ............     |

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