Запутался с iproute2 (fwmark, table eth0-out, ping...)

Обсуждение настройки и работы сервисов, резервирования, сетевых настроек и вопросов безопасности ОС.

Модераторы: SLEDopit, Модераторы разделов

pelmen
Сообщения: 1268
ОС: debian

Запутался с iproute2

Сообщение pelmen »

Изучаю iproute2 по статье
Решил просто проверить (потренироваться). У меня 2 сетевые карты, на одной внешний ip, на второй внутренний. Во внутренней сетке есть комп, являющийся шлюзом (другой провайдер), вот я и решил проверить, сделать маршрутизацию с моего компа так, чтоб до какого-то (рабочего) ip в Интернете ping шел именно через этот внутренний шлюз. Для этого я сделал в первую очередь:

Код: Выделить всё

# iptables -A POSTROUTING -d 62.5.246.190/32 -o eth1 -p icmp -j DROP (eth1 - это где внешний адрес)
Чтоб если пинг пройдет, то однозначно через eth0 - шлюз в локалке. Далее

Код: Выделить всё

# iptables -A OUTPUT -t mangle -p icmp -d 62.5.246.190 -j MARK --set-mark 2
Далее, как в статье

Код: Выделить всё

# echo 200 eth0-out >> /etc/iproute2/rt_tables
# ip ru add fwmark 2 table eth0-out
# ip ro add 192.168.0.0/24 dev eth0 src 192.168.0.1 table eth0-out (0.1 - мой внутренний ip)
# ip ro add default via 192.168.0.2 table eth0-out (0.2 - внутренний комп с другим провайдером, который тоже может быть шлюзом)
Далее я добавил правило

Код: Выделить всё

# iptables -t nat -A POSTROUTING -p icmp -d 62.5.246.190 -o eth0 -j ACCEPT
чтобы увидеть, идут ли пакеты в правильном направлении (через eth0)

Код: Выделить всё

# ip ro flush cache
# ping 62.5.246.190
. . .
1 packets transmitted, 0 received, 100% packet loss, time 0ms
# iptables -t nat -nvL POSTROUTING
Chain POSTROUTING (policy ACCEPT 361K packets, 31M bytes)
 pkts bytes target     prot opt in     out     source               destination
2569K  212M SNAT       all  --  *      eth1    192.168.0.0/24     0.0.0.0/0           to:213.186.54.30
    4   336 DROP       icmp --  *      eth1    0.0.0.0/0            62.5.246.190
    1    84 ACCEPT     icmp --  *      eth0       0.0.0.0/0            62.5.246.190
ping не прошел, но в postrouting добавился 1 пакет (последняя строчка), значит он пытался пройти правильно.
Проверяем

Код: Выделить всё

# ip ru ls
0:      from all lookup local
32765:  from all fwmark 0x2 lookup eth0-out
32766:  from all lookup main
32767:  from all lookup default
# ip ro ls
213.186.54.30/30 dev eth1  proto kernel  scope link  src 213.186.54.28
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.1
169.254.0.0/16 dev eth0  scope link  metric 1000
default via 213.186.54.28 dev eth1
# ip ro ls table eth0-out
192.168.0.0/24 dev eth0  scope link  src 192.168.0.1
default via 192.168.0.2 dev eth0
Для проверки

Код: Выделить всё

# ip ro ad 62.5.246.190 via 192.168.0.2 dev eth0
# ping 62.5.246.190
1 packets transmitted, 1 received, 0% packet loss, time 0ms
Проверяем iptables - пакет добавился в nat postrouting - стало 2.
Отсюда вопрос: Что я делаю не так? :)

Возникла мысль сделать iptables -j LOG. Удалил маршрут

Код: Выделить всё

# ip ro del 62.5.246.190 via 192.168.0.2 dev eth0
# ping 62.5.246.190
. . .
1 packets transmitted, 0 received, 100% packet loss, time 0ms
увидел в syslog запись вида
kernel: [9478512.287710] IN= OUT=eth0 SRC=213.186.54.30 DST=62.5.246.190 LEN=84 TOS=0x00 PREC=0x00 TTL=64 ID=0 DF PROTO=ICMP TYPE=8 CODE=0 ID=53370 SEQ=1 MARK=0x2
Решил, что не проходит пинг из-за адреса отправителя, ведь когда я задаю маршрутизацию относительно fwmark, то комп её не понимает, пока не пошлет пакет, т.е. ip ro get 62.5.246.190 все равно показывает маршрут по-умолчанию через внешний интерфейс (т.е. он не моделирует, куда пойдет пакет и что с ним сделает iptables), таким образом он и отправляет его от имени своего внешнего ip. Сделал так

Код: Выделить всё

iptables -t nat -I POSTROUTING 1 -m mark --mark 2 -j SNAT --to-source 192.168.0.1
Пинганул - опять не прошло, хотя пакеты попали под это правило. Ну что-ж такое-то!? :)
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Запутался с iproute2

Сообщение IMB »

Попробуте свой опыт с указанием интерфейса - ping -I <интерфейс для другой сети> destination
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

IMB писал(а):
07.11.2009 13:36
Попробуте свой опыт с указанием интерфейса - ping -I <интерфейс для другой сети> destination
Не получилось

Код: Выделить всё

# ping -I eth0 62.5.246.190
PING 62.5.246.190 (62.5.246.190) from 192.168.0.1 eth0: 56(84) bytes of data.
^C
--- 62.5.246.190 ping statistics ---
23 packets transmitted, 0 received, 100% packet loss, time 22175ms
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Запутался с iproute2

Сообщение IMB »

Для экспериментального интерфейса добавьте:
ip rule add from <ваш второй интерфейс> table <таблица для этого интерфейса>
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

не помогло :(
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Запутался с iproute2

Сообщение IMB »

Я надеюсь, что пинговали Вы с указанием интерфейса?
P.S. Если желаете и думаете что это может помочь, могу на следующей неделе выложить настройки офисного шлюза для работы с двумя провайдерами.
Спасибо сказали:
ALexhha
Сообщения: 109

Re: Запутался с iproute2

Сообщение ALexhha »

Пинганул - опять не прошло, хотя пакеты попали под это правило. Ну что-ж такое-то!?

пингуешь с самого шлюза?
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

ALexhha писал(а):
07.11.2009 16:24
Пинганул - опять не прошло, хотя пакеты попали под это правило. Ну что-ж такое-то!?

пингуешь с самого шлюза?
В данном опыте я все делаю исключительно на этом компьютере (который в двух сетях) Больше ни к какому не подхожу.
Спасибо сказали:
ALexhha
Сообщения: 109

Re: Запутался с iproute2

Сообщение ALexhha »

тогда учитывай, что это будут не транзитные пакеты и соответственно набор цепочек будет другой
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

Мы уже выяснили это в предыдущей теме, я использую mangle output, если бы это не срабатывало, опакеты не попадали бы в nat postrouting под мое правило, а они подпадают, но почему-то не уходят. На удаленном компе (который пытаюсь пинговать) tcpdump-ом слушаю, ничего нет. А когда делаю

Код: Выделить всё

# ip ro ad 62.5.246.190 via 192.168.0.2 dev eth0
# ping 62.5.246.190
1 packets transmitted, 1 received, 0% packet loss, time 0ms
все нормально
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

Код: Выделить всё

root@server:~# ip ru ls
0:      from all lookup local
32764:  from 192.168.113.250 lookup eth0-out
32766:  from all lookup main
32767:  from all lookup default
root@server:~# ping ip.ip.ip.ip
PING ip.ip.ip.ip (ip.ip.ip.ip) 56(84) bytes of data.
^C
--- ip.ip.ip.ip ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

root@server:~# ip ro ls
211.132.214.44/30 dev eth1  proto kernel  scope link  src 211.132.214.46
192.168.113.0/24 dev eth0  proto kernel  scope link  src 192.168.113.250
169.254.0.0/16 dev eth0  scope link  metric 1000
default via 211.132.214.46 dev eth1
root@orbitaserver:~# ip ro ls table eth0-out
192.168.113.0/24 dev eth0  scope link  src 192.168.113.250
default via 192.168.113.1 dev eth0
root@server:~#  ping ip.ip.ip.ip
PING ip.ip.ip.ip (ip.ip.ip.ip) 56(84) bytes of data.
^C
--- ip.ip.ip.ip ping statistics ---
1 packets transmitted, 0 received, 100% packet loss, time 0ms

root@server:~# ping -I eth0 ip.ip.ip.ip
PING ip.ip.ip.ip (ip.ip.ip.ip) from 192.168.113.250 eth0: 56(84) bytes of data.
64 bytes from ip.ip.ip.ip: icmp_seq=1 ttl=52 time=57.7 ms
^C
--- 85.141.9.19 ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 57.791/57.791/57.791/0.000 ms
root@server:~#
Спасибо сказали:
ALexhha
Сообщения: 109

Re: Запутался с iproute2

Сообщение ALexhha »

Так я не пойму, а что не работает?
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

У меня 2 сети, в каждой из них есть шлюз. Один из них - шлюз по-умолчанию. Хочу для тренеровки сделать так, чтоб только пинг и только на определенный адрес шел через шлюз №2, если менять шлюз по-умолчанию, или если менять шлюз для этого адреса, или если пинговать, указав интерфейс напрямую - все получается. Но для того, чтобы все было именно так, как поставил я перед собой в этом примере (только пинг и только на этот адрес), т.е. с использованием меток, то почему-то не работает :(
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Запутался с iproute2

Сообщение IMB »

Приведите вывод ip rule/route list для всех таблиц.
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

Спасибо сказали:
ALexhha
Сообщения: 109

Re: Запутался с iproute2

Сообщение ALexhha »

А если просто весь icmp трафик маркировать?

# iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 2
# iptables -t mangle -A PREROUTING -j MARK --set-mark 1

# ip rule add fwmark 1 table isp1
# ip rule add fwmark 2 table isp2

# ip rule add from $IP1 table isp1
# ip rule add from $IP2 table isp2

# ip route add default via gw1 dev eth1 table isp1
# ip route add default via gw2 dev eth2 table isp2

# iptables -t nat -A POSTROUTING -s source -o eth1 --to-source ip1
# iptables -t nat -A POSTROUTING -s source -o eth2 --to-source ip2

Т.е. по дефолту все идет через isp1 и gw1. Весь icmp трафик через isp2 и gw2.
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

добился результата:
ping -I eth0 62.5.246.190
работает, в отличие от ping 62.5.346.190. Может быть я чего-то не понимаю?
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Запутался с iproute2

Сообщение IMB »

Да нет, это скорее я чего-то не понимаю. Почему у Вас указаны разные адреса и почему эти адреса вообще должны отвечать на ping?
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

Я сдаюсь. Может быть "ЭТО" не действует при траффике от локального процесса, а только из локальной сети?
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Запутался с iproute2

Сообщение IMB »

Ну это Вы зря. Для начала упростите себя задачу - пустите весь траффик куда-то через другой канал.
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

IMB писал(а):
16.11.2009 22:05
Ну это Вы зря. Для начала упростите себя задачу - пустите весь траффик куда-то через другой канал.

ip ru
32763: from all to 188.40.74.9 lookup eth0-out
ping 188.40.74.9
идет через eth0, а если делать на основании меток, то не идет.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Запутался с iproute2

Сообщение IMB »

Позволю себе поделиться своим небольшим опытом, надеюсь он Вам поможет.
Исходные данные - на сервер заходят линки от двух провайдеров, ОРЦ и Корбина.

user@localhost

$ ip route show table orc default via ORC_GW dev vlan144 $ ip route show table corbina default via CORBINA_GW dev eth2 $ ip rule 0: from all lookup 255 32764: from ORC_IP lookup orc 32765: from CORBINA_IP lookup corbina 32766: from all lookup main 32767: from all lookup default $ip route 212.48.128.131 via ORC_GW dev vlan144 212.48.128.130 via ORC_GW dev vlan144 ORC_NET dev vlan144 proto kernel scope link src ORC_IP CORBINA_NET dev eth2 proto kernel scope link src CORBINA_IP default nexthop via CORBINA_GW dev eth2 weight 1 nexthop via ORC_GW dev vlan144 weight 3 # tail /etc/network/if-pre-up.d/firewall iptables --table nat --append POSTROUTING --out-interface $WAN --jump SNAT \ --to $CORBINA_IP iptables --table nat --append POSTROUTING --out-interface $ORC --jump SNAT \ --to $ORC_IP

Действие правил:

user@localhost

$ sudo tcpdump -n -i eth2 > /tmp/dump & $ dig @212.48.128.131 google.ru +short 216.239.59.104 74.125.77.104 209.85.229.104 $ grep -A1 google.ru /tmp/dump 22:46:28.254771 vlan 144, p 0, IP ORC_IP.32782 > 212.48.128.131.53: 41940+ A? google.ru. (27) 22:46:28.269920 vlan 144, p 0, IP 212.48.128.131.53 > ORC_IP.32782: 41940 3/4/4 A 216.239.59.104,[|domain]

Как видно, запрос пошёл именно через указанный интерфейс.
Конфигурирование сети:

user@localhost

$ cat /etc/network/interfaces auto eth2 iface eth2 inet static post-up /bin/ip route flush table corbina post-up /bin/ip route add default via CORBINA_GW table corbina post-up /bin/ip rule add from CORBINA_IP table corbina post-up /bin/ip route flush cache post-down /bin/ip rule delete from CORBINA_IP auto vlan144 iface vlan144 inet static vlan_raw_device eth2 post-up /bin/ip route flush table orc post-up /bin/ip route add default via ORC_GW table orc post-up /bin/ip route add 212.48.128.130 via ORC_GW post-up /bin/ip route add 212.48.128.131 via ORC_GW post-up /bin/ip rule add from ORC_IP table orc post-up /bin/ip route add default scope global \ nexthop via CORBINA_GW dev eth2 weight 1 \ nexthop via ORC_GW dev vlan144 weight 3 post-up /bin/ip route flush cache post-up /etc/network/change_route.sh post-down /bin/ip rule delete from ORC_IP

В кроне стоит скрипт , /etc/network/change_route.sh, проверяющий пингом доступность канала, в случае недоступности одного из каналов происходит переключение на другой.
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

Ну так и у меня работает. Не работает именно когда я на основании меток делаю.
Спасибо сказали:
ALexhha
Сообщения: 109

Re: Запутался с iproute2

Сообщение ALexhha »

ip route add default scope global nexthop via CORBINA_GW dev eth2 weight 1 nexthop via ORC_GW dev vlan144 weight 3

читал, что без параметра equalize эта команда не будет корректно работать, т.е. надо так

# ip route add equalize default scope global nexthop via CORBINA_GW dev eth2 weight 1 nexthop via ORC_GW dev vlan144 weight 3
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: Запутался с iproute2

Сообщение IMB »

ALexhha писал(а):
17.11.2009 12:38
ip route add default scope global nexthop via CORBINA_GW dev eth2 weight 1 nexthop via ORC_GW dev vlan144 weight 3

читал, что без параметра equalize эта команда не будет корректно работать, т.е. надо так

# ip route add equalize default scope global nexthop via CORBINA_GW dev eth2 weight 1 nexthop via ORC_GW dev vlan144 weight 3

Насколько я помню данный параметр доступен только в "патченной" версии. Да и отчёты по траффику показывает, что всё работает и без него, по Lighsquid компания за этот месяц потребила 20 ГБ, в отчёте Корбины фигурирует цифра в 5 ГБ.
Спасибо сказали:
ALexhha
Сообщения: 109

Re: Запутался с iproute2

Сообщение ALexhha »

Насколько я помню данный параметр доступен только в "патченной" версии.


# ip ro sh
192.168.127.2 dev tun1 proto kernel scope link src 192.168.127.1
10.1.1.2 dev tun0 proto kernel scope link src 10.1.1.1
192.168.4.0/24 dev eth0 proto kernel scope link src 192.168.4.1
10.0.0.0/24 dev eth3 proto kernel scope link src 10.0.0.190
172.16.1.0/24 dev eth1 proto kernel scope link src 172.16.1.1
169.254.0.0/16 dev eth3 scope link
default equalize
nexthop via 192.168.4.1 dev eth0 weight 1
nexthop via 172.16.1.1 dev eth1 weight 2

# uname -a
Linux router1.vmware.local 2.6.18-164.6.1.el5 #1 SMP Tue Nov 3 16:55:59 EST 2009 i686 i686 i386 GNU/Linux

# cat /etc/redhat-release
CentOS release 5.4 (Final)

Только не смог нигде найти описания, что именно делает параметр equalize
Спасибо сказали:
pelmen
Сообщения: 1268
ОС: debian

Re: Запутался с iproute2

Сообщение pelmen »

а что делает параметр preference? Вот пример:
# ip rule add fwmark 10 preference 200 nat 191.216.121.2 table Manager
Спасибо сказали:
ALexhha
Сообщения: 109

Re: Запутался с iproute2

Сообщение ALexhha »

Приоритет, если у тебя есть такие правила

# ip rule add fwmark 10 preference 100 nat 191.216.121.1 table Manager
# ip rule add fwmark 10 preference 200 nat 191.216.121.2 table Manager

то первым всегда будет срабатывать то, у которого приоритет меньше

http://linux-ip.net/gl/ip-cref/node110.html
Спасибо сказали: