Инструменты пользователя

Инструменты сайта


freebsd:pf

Работа с фильтром pf

Схема такая.

Есть роутер на FreeBSD, с внешним аплинком к провайдеру по трафику. Надо завернуть все трафикопожирающие сервисы на Yota. Так же в случае падения основного канала, осуществлялось бы автоматическое переключение всего трафика на Yota и обратно, в случае, когда бы основной канал поднимался бы.

pf.conf

ext_if="re0" # внешний аплинк провайдера
ext_addr="x.x.x.x" # IP-адрес, который выдал провайдер
int_if="em0" # внутренний интерфейс
wlan_if="wlan0" # wi-fi интерфейс
yota_addr="10.8.0.2" # адрес роутера Yota Drytek Vigor Fly 200
svn_srv="10.8.0.230" # адрес сервера разработчиков

table <localnet> { 10.8/16 }
table <yota> persist file "/etc/pf.yota.conf" # файл со списком адресов, которые будут выходить через Yota

scrub in all # собираем проходящие пакеты
nat on $ext_if inet from $int_if:network to any -> ($ext_if) # НАТ для пользователей сети
nat on $ext_if inet from $wlan_if:network to any -> ($ext_if) # НАТ для пользователей сети Wi-Fi

rdr on $ext_if proto tcp from any to $ext_if port 444 -> $svn_srv port 443 # проброс порта на сервер разработчиков снаружи
pass in on $int_if from $int_if:network to any keep state # разрешающие правила на выход внутренней сети в интернет
pass in on $wlan_if from $wlan_if:network to any keep state # разрешающие правила на выход Wi-Fi сети в интернет

pass in on $int_if route-to ($int_if $yota_addr) from $int_if:network to <yota> keep state # заворачивание адресов на Yota из внутренней сети
pass in on $wlan_if route-to ($wlan_if $yota_addr) from $wlan_if:network to <yota> keep state # заворачивание адресов на Yota из Wi-Fi сети

pass in on $int_if route-to ($int_if $yota_addr) proto { udp, icmp } from $int_if:network to <yota> keep state # заворачивание остальных пакетов на Yota из внутренней сети
pass in on $wlan_if route-to ($wlan_if $yota_addr) proto { udp, icmp } from $wlan_if:network to <yota> keep state # заворачивание остальных пакетов на Yota из Wi-Fi сети

pass in on $int_if reply-to ($int_if $yota_addr) proto tcp from ! $int_if:network to self port 222 flags S/SA keep state # обратный проброс порта ssh из Yota во вне, сделано, что бы в случае пропажи основного линка можно было зайти на роутер

pf.yota-gw

Это файл таблиц адресов, которые надо посылать через Yota. Используется в случае падения основного канала.

!194.87.0.50 # этот адрес мы исключаем, что бы пинговать его, проверяя доступность канала провайдера (www.ru)
!10.8/16 # исключаем всю свою внутреннюю сеть
0/0 # Все адреса

pf.yota-table.conf

В этом файле таблиц прописываются те адреса или подсети, которые используются для заворачивания на Yota в обычном режиме работы.

pf.yota.conf

Файл, который считывается непосредственно при загрузке pf.conf

Переключалка каналов

Скрипт переключения

Скрипт на bash, полный путь к нему /home/scripts/sw-isp.sh

#!/usr/local/bin/bash

ping -q -c 5 -W 60 194.87.0.50                          # пингуем 5 раз адрес (с первого раза бывает, хоть и очень редко, пинг не идет и это принимается за падение канала)
if [ $? -ne  "0" ] ; then                               # если пинг не проходит и возвращаемое значение не 0 тогда
    pfctl -t yota -T show | grep "194.87.0.50"          # смотрим, есть ли адрес для пинга в таблице, т.е. переключение на Yota уже произошло
    if [ $? -ne "0" ] ; then                            # если нет, это первое падение канала
        cp /etc/pf.yota-gw.conf /etc/pf.yota.conf       # меняем файл таблицы адресов
        pfctl -f /etc/pf.conf                           # перезагружаем правила
    fi
else                                                    # пинг есть
    pfctl -t yota -T show | grep "194.87.0.50"          # смотрим, какая таблица активна
    if [ $? -eq "0" ] ; then                            # если таблица Yota в качестве шлюза
        cp /etc/pf.yota-table.conf /etc/pf.yota.conf    # тогда меняем файл таблицы на часть адресов через Yota
        pfctl -f /etc/pf.conf                           # применяем правила
    fi
fi

Запись в /etc/crontab

* * * * * root /home/scripts/sw-isp.sh

freebsd/pf.txt · Последнее изменение: 2010/08/30 21:08 — linko22@gmail.com