среда, 2 апреля 2014 г.

Linux routing маршрутизация, PBR (policy based routing)

Выдержки для себя из статьи с Хабра, статьи.
Еще полезная ссылка на LARTC (Linux Advanced Routing and Traffic Control)

route

Добавление маршрута через шлюз:
route add -net 192.168.0.0/16 gw 10.0.0.1 

Добавление маршрута через интерфейс: 
route add -net 192.168.0.0/16 dev eth1 

Маршрут до отдельного хоста: 
route add -host 192.168.0.1 gw 172.16.0.1 



ip

Отправлять пакеты для адреса 1.2.3.4 на интерфейс brLAN
ip route add 1.2.3.4 dev brLAN

Весь внешний трафик отправлять через 192.168.0.1
ip route add default via 192.168.0.1

Добавление маршрута через шлюз: 
ip route add 172.16.10.0/24 via 192.168.1.1 

Добавление маршрута через интерфейс: 
ip route add 172.16.10.0/24 dev eth0 

Маршрут с метрикой: 
ip route add 172.16.10.0/24 dev eth0 metric 100

Просмотр таблицы маршрутизации:
ip route 
192.168.12.0/24 dev eth0 proto kernel scope link src 192.168.12.101 
default via 192.168.12.1 dev eth0

proto kernel означает, что роутинг был задан ядром автоматически при задании IP интерфейса. 
scope link означает, что эта запись является действительной только для этого интерфейса (eth0). 
src 192.168.12.101 задает IP-адрес отправителя для пакетов, попадающих под это правило роутинга.
default via 192.168.12.1 dev eth0 Трафик на любые другие хосты, не попадающие в подсеть 192.168.12.0/24 будет уходить на шлюз 192.168.12.1 через интерфейс eth0.

Пример:
как увидеть с локальной сети 192.168.0.0 комп с адресом из другой сети 192.168.151.0 (подключены к одному свичу)
На компе Ubuntu с адресом 192.168.0.10 выполнить:
sudo ip route add 192.168.151.0/24 dev eth0

На компе Windows с адресом 192.168.151.10 выполнить:
route add 192.168.0.0 mask 255.255.255.0 192.168.151.10

Причем пинг будет проходить только между этими двумя компьютерами. Поэтому можно переписать правила еще как для только одного компа:
sudo ip route add 192.168.151.10/32 dev eth0
route add 192.168.0.10 mask 255.255.255.255 192.168.151.10

policy-routing, он же PBR (policy based routing). 

Пример:
У нас есть некий шлюз, на него приходят пакеты с IP 192.168.1.20. Пакеты с этого IP нужно отправлять на шлюз 10.1.0.1.
Чтобы это реализовать делаем следующее:
Создаем таблицу с единственным правилом:
# ip route add default via 10.1.0.1 table 120

Создаем правило, отправляющее нужные пакеты в нужную таблицу:
# ip rule add from 192.168.1.20 table 120


ip rule

Как же ядро выбирает, в какую таблицу отправлять пакеты?
Все логично – для этого есть правила. В нашем случае:
# ip rule 
0: from all lookup local 
32766: from all lookup main 
32767: from all lookup default
Число в начале строки – идентификатор правила, from all – условие, означает пакеты с любых адресов, lookup указывает в какую таблицу направлять пакет. Если пакет подпадает под несколько правил, то он проходит их все по порядку возрастания идентификатора. Конечно, если пакет подпадет под какую-либо запись маршрутизации, то последующие записи маршрутизации и последующие правила он уже проходить не будет.
Возможные условия:
from – мы уже рассматривали выше, это проверка отправителя пакета.
to – получатель пакета.
iif – имя интерфейса, на который пришел пакет.
oif – имя интерфейса, с которого уходит пакет. Это условие действует только для пакетов, исходящих из локальных сокетов, привязанных к конкретному интерфейсу.
tos – значение поля TOS IP-пакета.
fwmark – проверка значения FWMARK пакета. Это условие дает потрясающую гибкость правил. При помощи правил iptables можно отфильтровать пакеты по огромному количеству признаков и установить определенные значения FWMARK. А затем эти значения учитывать при роутинге.
Пример с применением ip rule.

Комментариев нет:

Отправить комментарий