Fork me on GitHub

The WebDevil

Enjoy development

Для меня давно уже возникала необходимость подружить сервер с двумя провайдерами и локальной сетью. И вот вчера проблема стала весьма актуальной.

Итак, имеем:
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:

request subnet-mask, broadcast-address, time-offset, routers;

Отлично. Теперь мы получим лишь IP и шлюз. Теперь в файле /etc/iproute2/rt_tables добавим таблицу маршрутизации ISP2:

2       ISP2

Теперь надо заносить получаемые значения шлюза в эту таблицу, и определить маршрут, по которому пакеты будут попадать в эту таблицу. Для этого напишем два скрипта:
/etc/dhcp3/dhclient-enter-hooks.d/duallink

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=""

/etc/dhcp3/dhclient-exit-hooks.d/duallink

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

Да, не забудьте установить ipcalc!

Собственно, все. Теперь осталось воткнуть ISP#2 и посмотреть на получившуюся картину командами

ip rule show
ip route show
ip route show table ISP2

статья собрана по материалам
Configuring several Internet connections on the same Computer
Rules – routing policy database
Appendix D. IP Route Management
и других перелистаных в процессе отладки.

На убунтовской вики упоминается /usr/local/sbin/flush_rules.pl, но что внутри этого скрипта – автор умолчал.

Все замечания приветствуются!

Comments are closed.