FreeBSD два провайдера. setfib

Имеем два провайдера:

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 можно продолжать усложнять правила.

Leave a Reply