Posterous theme by Cory Watilo

Two ISP and LAN using iproute2

Для меня давно уже возникала необходимость подружить сервер с двумя провайдерами и локальной сетью. И вот вчера проблема стала весьма актуальной. Итак, имеем: eth0 - 192.168.0.0/24 - LAN eth1 - 13.13.13.13/24 - ISP#1 eth2 - 6.6.6.6/24 - ISP#2 ISP#2 отдает IP через DHCP ISP#1 - статика (на самом деле DHCP но удалось договориться на статику) LAN - его надо NAT'ить в мир через ISP#1 (кое-что можно отправлять и через ISP#2, это будет показано). Так как при использовании dhclient сетевые настройки не заменялись получеными мы это запретим в файле /etc/dhcp3/dhclient.conf: [cc lang="text"] request subnet-mask, broadcast-address, time-offset, routers; [/cc] Отлично. Теперь мы получим лишь IP и шлюз. Теперь в файле /etc/iproute2/rt_tables добавим таблицу маршрутизации ISP2: [cc lang="text"] 2 ISP2 [/cc] Теперь надо заносить получаемые значения шлюза в эту таблицу, и определить маршрут, по которому пакеты будут попадать в эту таблицу. Для этого напишем два скрипта: /etc/dhcp3/dhclient-enter-hooks.d/duallink [cc lang="bash"] if [ x$reason == 'xBOUND' ]; then /sbin/ip route flush table ISP2 /sbin/iptables -F PREROUTING -t mangle /sbin/ip route flush cache ip rule show | grep ISP2 | while read -r line ; do ip rule del `echo $line | cut -d ':' -f2` done prefix=`echo $new_ip_address | cut -d . -f 1-2` if [ x$prefix == 'x192.168' ]; then exit fi #ISP1 /sbin/ip route add 13.13.13.13/24 dev eth1 table ISP2 /sbin/ip route add 172.16.0.0/16 dev eth1 table ISP2 #LAN /sbin/ip route add 192.168.0.0/24 dev eth0 table ISP2 #ISP2 /sbin/ip rule add from $new_ip_address table ISP2 /sbin/ip rule add fwmark 0x2 table ISP2 #А тут можно пометить пакеты, которые уйдут через ISP2 /sbin/iptables -I PREROUTING -t mangle -i eth0 -p tcp --dport 443 -j MARK --set-mark 2 /sbin/iptables -I PREROUTING -t mangle -i eth0 -p tcp --dport 80 -j MARK --set-mark 2 fi isp2_gateway=$new_routers new_routers="" [/cc] /etc/dhcp3/dhclient-exit-hooks.d/duallink [cc lang="bash"] if [ x$reason == 'xBOUND' ]; then my_new_network=`ipcalc -n $new_ip_address/$new_subnet_mask | grep Network | cut -b 12-32` /sbin/ip route add $my_new_network dev $interface table ISP2 /sbin/ip route add default via $isp2_gateway table ISP2 fi [/cc] Да, не забудьте установить ipcalc! Собственно, все. Теперь осталось воткнуть ISP#2 и посмотреть на получившуюся картину командами [cc lang="text"] ip rule show ip route show ip route show table ISP2 [/cc] статья собрана по материалам Configuring several Internet connections on the same Computer Rules - routing policy database Appendix D. IP Route Management и других перелистаных в процессе отладки. На убунтовской вики упоминается /usr/local/sbin/flush_rules.pl, но что внутри этого скрипта - автор умолчал. Все замечания приветствуются!