среда, 30 января 2013 г.

Маршрутизация на два провайдера по портам в Linux (iptables+iproute2)

Писать полноценную статью мне лень. Поэтому это будет скорее заметка, в большей степени для себя, чтобы не забыть.
Так уж сложились звезды, что схема не совсем простая и не ограничится одним шлюзом на linux. Помимо шлюза на linux имеются еще два шлюза в виде Cisco 2801 и Cisco 851. На цисках крутятся VPN соединения различного назначения и переносить их не вижу особого смысла, а на linux маршрутизаторе так же стоит прокси.
Схема такая:
Cisco 2851 - prov_1 (LAN 192.168.1.1) NAT 
Cisco 851 - prov_2 (LAN 192.168.16.1) NAT 
Linux(ALT) :
Небольшой комментарий. На linux маршрутизаторе стоит два физических интерфейса. Больше поставить не было возможности, поэтому пришлось использовать то что есть, был создан alias (eth1:1) на интерфейсе (eth1) который смотрит на маршрутизаторы Cisco и подключен коммутатор. Адресация такая:

 eth1 192.168.1.2 255.255.255.0 GW 192.168.1.1 
eth1:1 192.168.16.2 255.255.255.0 GW 192.168.16.1 
eth0 192.168.0.1 255.255.255.0 (LAN)

На linux маршрутизаторе не используется NAT, поэтому пакеты проходят через него насквозь без подмены адреса.
Начнем с создания алиаса (RHEL и подобные):

cd /etc/sysconfig/network-scripts
cp ifcfg-eth1 ifcfg-eth1:1
vi ifcfg-eth1:1

Убираем строку HWADDR="XX:XX:XX:XX:XX:XX", убираем строку GATEWAY="XX.XX.XX.XX", строку DEVICE="eth1" меняем на DEVICE="eth1:1".
Файл должен выглядеть так:

 DEVICE="eth1:1" 
NM_CONTROLLED="yes" 
ONBOOT="yes" 
IPADDR=192.168.16.2 
NETMASK=255.255.255.0 
NETWORK=192.168.16.0

Далее будем делать саму маршрутизацию:
Создадим конфигурационные файлы для скриптов запуска сетевых интерфейсов

touch route-eth1
touch route-eth1:1
touch rule-eth1
touch rule-eth1:1

Пишем в созданных нами файлах следующие:

Файл route-eth1  
default via 192.168.1.1 table prov_1
Файл route-eth1:1  
default via 192.168.16.1 table prov_2
Файл rule-eth1  
from 192.168.1.2 table prov_1
Файл rule-eth1:1  
fwmark 3 table prov_2 
from 192.168.16.2 table prov_2

Теперь необходимо добавить эти таблицы в iproute2:

cd /etc/iproute2/
echo "201 prov_1" >> rt_tables
echo "202 prov_2" >> rt_tables

Перезапускаем сетевые интерфейсы:

service network restart

Проверяем правила (у меня это выглядит так) :

# ip rule list
0: from all lookup local
32760: from all fwmark 0x3 lookup prov_2
32761: from 192.168.16.2 lookup prov_2
32762: from 192.168.1.2 lookup prov_1
32766: from all lookup main
32767: from all lookup default

В файле rule-eth1:1 мы делали запись fwmark 3 table prov_2. При помощи iptables делаем маркировку определенных пакетов. В данном случае мне нужно исходящие запросы на 80 направить на второй провайдер:

iptables -A PREROUTING -t mangle -i eth0 -p tcp -m tcp --dport 80 -j MARK --set-mark 3
service iptables save

Теперь исходящие запросы на 80 порт будут уходить на prov_2. Рассказывать про настройку Cisco я не стану, ибо сам делал по мануалам. Поэтому скажу главное что в данной схеме будет необходимо.

Т.к. маршрутизатор linux без NAT необходимо сделать маршрут на цисках, чтобы получить ответ на запрос. Приведу кусок моего конфига:

ip forward-protocol nd
ip route 0.0.0.0 0.0.0.0 внешний_IP_prov_2
ip route 192.168.0.0 255.255.255.0 192.168.16.2


Доступ сетей к NATу:

ip access-list extended NAT
permit ip 192.168.16.0 0.0.0.255 any
permit ip 192.168.0.0 0.0.0.255 any


Вот собственно и все. Надею кому-нибудь пригодится =)