Имеем два провайдера:
IP1: 1.2.3.4 GW1: 1.2.3.1 сетевая карта bce0
IP2: 5.6.7.8 GW2: 5.6.7.1 сетевая карта bce1
Желание:
пользователей squid выводить в интернет через второго провайдера.
Решение:
Будем использовать setfib (работает с FreeBSD 7).
Пересобираем ядро с опцией ROUTETABLES, остальное читаем тут.
#Мое ядро с поддержкой FWD и двух провайдеров include GENERIC ident MYKERNEL options IPFIREWALL #firewall options IPFIREWALL_VERBOSE #enable logging to syslogd(8) options IPFIREWALL_VERBOSE_LIMIT=100 #limit verbosity options IPFIREWALL_DEFAULT_TO_ACCEPT #allow everything by default options IPFIREWALL_FORWARD #packet destination changes options DUMMYNET options IPDIVERT #Для работы с несколькими провайдерами (setfib) options ROUTETABLES=2 # max 16. 1 is back compatible.
Добавляем в /etc/rc.conf
setfib1_enable="YES" setfib1_defaultroute="5.6.7.1"
И создаем скрипт /usr/local/etc/rc.d/setfib1 (взял тут):
#!/bin/sh # PROVIDE: SETFIB1 # REQUIRE: NETWORKING # BEFORE: DAEMON # # Add the following lines to /etc/rc.conf to enable setfib -1 at startup # setfib1 (bool): Set to "NO" by default. # Set it to "YES" to enable setfib1 # setfib1_defaultroute (str): Set to "" by default # Set it to ip address of default gateway for use in fib 1 . /etc/rc.subr name="setfib1" rcvar=`set_rcvar` load_rc_config $name [ -z "$setfib1_enable" ] && setfib1_enable="NO" [ -z "$setfib1_defaultroute" ] && setfib1_defaultroute="" start_cmd="${name}_start" stop_cmd="${name}_stop" setfib1_start() { if [ ${setfib1_defaultroute} ] then setfib 1 route add -net default ${setfib1_defaultroute} else echo "Can not set default route for fib 1 - setfib1_defaultroute is not assigned in rc.conf!" fi } setfib1_stop() { setfib 1 route del -net default } run_rc_command "$1"
Проверяем, маршрут по умолчанию:
# netstat -rn | grep default default 1.2.3.1 UGS 0 101366643 bce0
Маршрут второго провайдера:
# setfib 1 netstat -rn | grep default default 5.6.7.1 UGS 0 0 bce1
Убедимся, что:
# cat /etc/sysctl.conf | grep net.inet.ip.fw.one_pass net.inet.ip.fw.one_pass=0
В ipfw прописываем:
setfib 0 ip from any to any via bce0 setfib 0 ip from 1.2.3.4 to any setfib 0 ip from any to 1.2.3.4 setfib 1 ip from any to any via bce1 setfib 1 ip from 5.6.7.8 to any setfib 1 ip from any to 5.6.7.8 allow tcp from 5.6.7.8 to any established out via bce1 allow tcp from any to 5.6.7.8 established in via bce1 allow ip from any to any frag via bce1 allow tcp from 5.6.7.8 to any setup allow udp from 5.6.7.8 to any keep-state allow udp from 5.6.7.8 to any dst-port 53 keep-state allow udp from 5.6.7.8 to any dst-port 123 keep-state allow icmp from 5.6.7.8 to any out via bce1 allow icmp from any to 5.6.7.8 in via bce1
Теперь перекидываем squid на второго провайдера, для этого в /etc/rc.conf прописываем:
squid_enable="YES" squid_fib="1"
Для того чтобы процесс использовал второго провайдера запускаем так (например ping):
setfib -F 1 ping rrv.nsk.ru
Используя ipfw можно продолжать усложнять правила.