Мы — долго запрягаем, быстро ездим, и сильно тормозим.
www.lissyara.su —> статьи —> FreeBSD —> настройка —> PBR & IPFW

Настройка 2-х каналов в Интернет.

Автор: dikens3.


Друган подключился к Интернету. Подключение через PPPoE со статическим внешним IP-Адресом. Настроил ему сервак, Samb’у, apache, ssh и прочие сервисы ему прикрутил. Всё отлично работало. Но время идёт, мир меняется, и вот подключил он себе ещё один Интернет канал c безлимитным трафиком и скоростью 300kbit/s. Вот и попросил меня перенастроить полностью сервак, установить FreeBSD 6 попутно (ранее было ещё 5.3).

Что имеем:
FreeBSD 6.2
Два Интернет канала:
1. Через PPPoE с внешним IP-Адресом. (195.28.84.160) Трафик платный.
2. Через обычный LAN, выдан внутренний адрес 10.17.2.30 (Шлюз 10.17.127.254) Безлимитка.
На безлимитке нет входящих соединений, и какие-либо сервисы предоставлять бессмысленно. Зато ослик рулит в ней с low ID.

Что нужно:
Через PPPoE:
1. Сделать доступ к www страничкам.
2. Сделать удалённое управление сервером через ssh.
3. Сделать проброс порта на домашний компьютер (На домашнем компе стоит Radmin). Соединение входящее, и только через PPPoE.
Остальное по безлимитке.

Приступаем…
В ядро докинул и пересобрал:
 # Мои настройки
options         IPSTEALTH
options         IPFIREWALL
options         IPFIREWALL_VERBOSE
options         IPFIREWALL_VERBOSE_LIMIT=300
options         IPDIVERT
options         TCP_DROP_SYNFIN
options         IPFIREWALL_FORWARD
options         DUMMYNET

options         DEVICE_POLLING
options         HZ=1000

/etc/rc.conf
# Сеть
defaultrouter="10.11.12.254"
# ed0 - Безлимитка
ifconfig_ed0="inet 10.17.2.30  netmask 255.255.128.0"
# rl0 – внутренняя сеть
ifconfig_rl0="inet 192.168.1.100  netmask 255.255.255.0"
# rl1 подключена к ADSL-Модему, который настроен bridge’м.
ifconfig_rl1="inet 10.11.12.249  netmask 255.255.255.248 -arp"

# Samba
samba_enable="yes"

# Monit (порт 2812)
monit_enable="YES"

# SSH (22 порт)
sshd_enable="YES"

# PPPoE
ppp_enable="YES"
ppp_profile="Internet"
ppp_mode="ddial"
ppp_user="root"
ppp_nat="YES"

# Наш файрвол
firewall_enable="YES"
firewall_script="/etc/myfirewall"

# Nat
natd_enable="YES"
natd_flags="-f /etc/natd.cf"

# NTP
ntpd_enable="YES"

# Apache (80 порт)
apache_enable="YES"

Опишу основное:
 defaultrouter="10.11.12.254"
# rl1 подключена к ADSL-Модему, который настроен bridge’м.
ifconfig_rl1="inet 10.11.12.249  netmask 255.255.255.248 -arp"

-arp (Отключаем ARP протокол, у прова своя сеть с IP-Адресами 10.x.x.x, 192.168.x.x и т.п.)
1. Нельзя сделать соединение через PPPoE Default’овым маршрутом, т.к. после его смерти в таблице маршрутизации нет никакого default’ового маршрута. И инета нет совсем.
2. Почему выбран именно через rl1? Непомню, что-то у меня не получилось через ed0.

/etc/natd.cf
#unregistered_only      yes
use_sockets             yes
deny_incoming           yes
same_ports              yes
interface               ed0
verbose                 no
log                     no
port                    8668

Закомментированную строку можно удалить, но никак не включать.

/etc/ppp/ppp.conf
default:

Internet:
    set log Phase tun command
    set device PPPoE:rl1
    set authname login
    set authkey password
    set mru 1492
    set mtu 1492
    enable lqr
    set lqrperiod 10
    enable lqr echo
    enable echo
    set dial
    set login
    set timeout 0
    set redial 0 0

# NAT
   nat enable yes
# Тут порт Radmin прокидываем
   nat port tcp 192.168.1.1:6666        6666
   nat log no
   nat same_ports yes
   nat unregistered_only yes
   nat deny_incoming no

/etc/myfirewall
#!/bin/sh -

testgwvt=$(/sbin/ifconfig | grep "inet 195.28.84.160" | awk '{print $4}')

if (test $testgwvt)
    then
#       Есть соединение с Волга-Телеком, выдираем Gateway
    gwvt=$testgwvt
    else
#       Нет соединения с Волга-Телеком, присваиваем какой-нибудь IP-Адрес
    gwvt="213.177.127.16"
fi

# Интерфейс нашей лок.сети
iflan="rl0"
# Интерфейс подключённый к Sandy
ifsandy="ed0"
# Интерфейс(ы), подключенный к Волга-Телеком
mytun="tun*"

# Все IP-Адреса нашей лок.сети
mylan="192.168.1.0/24"
# Пользователи, которым разрешен доступ в инет
users="192.168.1.0{1-254}"

# IP-Адреса DNS серверов Волга-Телеком (PPPoE)
dnsvt="213.177.96.1, 213.177.97.1"
# IP-Адреса DNS серверов Sandy
dnssandy="195.122.226.2, 10.240.240.240"
# Шлюз Sandy
gwsandy="10.17.127.254"

# Пользователи, которым можно подключаться по SSH,
# пинговать наш сервер и доступ к monit
ssh_ip_users="IP1,IP2 и т.д."
# Порт на котором висит Radmin в нашей лок. сети
radminport="6666"

# NTP СЕРВЕРА
ntp="62.117.76.139,195.230.70.112,194.149.67.130,\
        131.216.22.17,216.32.94.18,216.204.156.2"

###########################################################################
# 1 таблица, куда нельзя ходить через Волга-Телеком (Приватные сети и т.п.)
fwtable="/sbin/ipfw table"
${fwtable} 1 flush
NETS=" 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 172.16.0.0/12 192.168.0.0/16 169.254.0.0/16\
 192.0.2.0/24 204.152.64.0/23 224.0.0.0/3 "

for lan in ${NETS}
    do
        ${fwtable} 1 add $lan
    done

###########################################################################
fwcmd="/sbin/ipfw -q"
${fwcmd} -f flush
${fwcmd} pipe flush
${fwcmd} queue flush

###########################################################################

# Пускаем lo
        ${fwcmd} add pass all from any to any via lo0
# Входящий траффик из нашей сети на шлюз
        ${fwcmd} add skipto 5000 all from any to me in via ${iflan}
# Netbios из нашей сети на шлюз (Для работы Samb'ы)
    ${fwcmd} add pass udp from ${mylan} 137,138 to 192.168.1.255 in via ${iflan}
# Исходящий траффик от шлюза в нашу сеть
        ${fwcmd} add skipto 6000 all from me to any out via ${iflan}
# Входящий траффик из Интернета через Sandy, применяется NAT
# и адрес назначения всегда наш (Пользователям и шлюзу)
        ${fwcmd} add skipto 7000 all from any to me in via ${ifsandy}
# Исходящий траффик в интернет от шлюза, через PPPoE и Sandy
# Т.к. маршрутов несколько, придётся перехватывать нужный траффик
# и отправлять нужным маршрутом
        ${fwcmd} add skipto 8000 all from me to any out
# Входящий траффик из Интернета на шлюз, через PPPoE
# tun*, т.к. иногда туннель умирает напрочь и приходится его киллять(kill),после 
# перезапуска туннель может измениться tun1,tun2,tun3.
# default gateway тоже изменяется.
        ${fwcmd} add skipto 10000 all from any to me in via ${mytun}
# Входящий траффик из нашей сети в интернет
        ${fwcmd} add skipto 11000 all from any to any in via ${iflan}
# Разрешаем отправку пришедшего интернет трафика через iflan
        ${fwcmd} add pass all from any to any out recv ${ifsandy} xmit ${iflan}
        ${fwcmd} add pass all from any to any out recv ${mytun} xmit ${iflan}
# Исходящий траффик из нашей сети в интернет, через PPPoE и Sandy
# Т.к. маршрутов несколько, придётся перехватывать нужный траффик 
# и отправлять нужным маршрутом
        ${fwcmd} add skipto 12000 all from any to any out
# Т.к. Nat есть ещё и на PPPoE, адрес назначения может быть не нашего сервера 
# (т.е. не me)
# Входящий траффик из Интернета в нашу сеть, через PPPoE
        ${fwcmd} add skipto 13000 all from any to any in via ${mytun}
# Всё остальное убиваем и пишем в log
        ${fwcmd} add deny log all from any to any

###########################################################################

# Входящий траффик из нашей сети на шлюз
# Пропускаем траффик, с уже установленным соединением
        ${fwcmd} add 5000 pass tcp from ${mylan} to me in via ${iflan} established
# Разрешаем подключаться к след.TCP портам из нашей сети (ssh,www,smbd)
        ${fwcmd} add pass tcp from ${mylan} to me 22,80,139,445 \
                    in via ${iflan} setup
# Разрешаем след.UDP порты из нашей сети (ntp,nmbd)
        ${fwcmd} add pass udp from ${mylan} to me 123,137,138 in via ${iflan}
# Пропускаем ICMP, только нужные (ping)
        ${fwcmd} add pass icmp from ${mylan} to me in via ${iflan} icmptype 8,0
# Всё остальное убиваем и пишем в log
        ${fwcmd} add deny log all from any to any

###########################################################################

# Исходящий траффик со шлюза в нашу сеть
# Пропускаем траффик, с уже установленным соединением
        ${fwcmd} add 6000 pass tcp from me to ${mylan} out via ${iflan} established
# Разрешаем след.UDP порты в нашу сеть (ntp,nmbd)
        ${fwcmd} add pass udp from me 123,137,138 to any out via ${iflan}
# Пропускаем ICMP, только нужные (ping)
        ${fwcmd} add pass icmp from me to ${mylan} out via ${iflan} icmptype 0,8,11
# Всё остальное убиваем и пишем в log
        ${fwcmd} add deny log all from any to any

###########################################################################

# Входящий траффик из Интернета через Sandy (Пользователи и шлюз)
# NAT in
        ${fwcmd} add 7000 divert natd all from any to any in via ${ifsandy}
# Пропускаем траффик, с уже установленным соединением
        ${fwcmd} add pass tcp from any to any in via ${ifsandy} established
# Пропускаем ICMP-только нужные
        ${fwcmd} add pass icmp from any to any in via ${ifsandy} icmptype 0,3,11
# Разрешённые UDP
        ${fwcmd} add pass udp from any 4000 to ${users} in via ${ifsandy}
# DNS
        ${fwcmd} add pass udp from ${dnssandy} 53 to any in via ${ifsandy}
# NTP (123 port)
        ${fwcmd} add pass udp from ${ntp} 123 to me 123 in via ${ifsandy}
# Всё остальное убиваем и пишем в log
        ${fwcmd} add deny log all from any to any

###########################################################################

# Исходящий траффик в интернет от шлюза, через PPPoE и Sandy.
# Волга-Телеком (PPPoE)
# Пропускаем траффик, с уже установленным соединением с определённых портов 80
        ${fwcmd} add 8000 fwd ${gwvt} tcp from me 80,2812 to any out established
# SSH для нужных IP (Разрешаем работать по SSH)
        ${fwcmd} add fwd ${gwvt} tcp from me 22 to ${ssh_ip_users} out established
# SSH для нужных IP (Разрешаем шлюзу подключение по SSH к другим серверам)
        ${fwcmd} add fwd ${gwvt} tcp from me to any 22 out
# Пропускаем ICMP, только нужные коды и необходимые IP(ответы на ping)
        ${fwcmd} add fwd ${gwvt} icmp from me to ${ssh_ip_users} out icmptype 0
# DNS Волга-Телеком
        ${fwcmd} add fwd ${gwvt} udp from me to ${dnsvt} 53 out
# DNS Волга-Телеком (Будем пингом проверять связь)
        ${fwcmd} add fwd ${gwvt} icmp from me to ${dnsvt} out icmptype 8

# Sandy
# NAT out
        ${fwcmd} add divert natd all from any to any out
# Пропускаем TCP
        ${fwcmd} add fwd ${gwsandy} tcp from me to any out
# Пропускаем ICMP
        ${fwcmd} add fwd ${gwsandy} icmp from me to any out
# Traceroute
        ${fwcmd} add fwd ${gwsandy} udp from me to any 33435-33524 out
# NTP (123 port)
        ${fwcmd} add fwd ${gwsandy} udp from me 123 to ${ntp} 123 out
# DNS Sandy
        ${fwcmd} add fwd ${gwsandy} udp from me to ${dnssandy} 53 out
# Всё остальное убиваем и пишем в log
        ${fwcmd} add deny log all from any to any

###########################################################################

# Входящий траффик из Интернета на шлюз, через PPPoE
# Пропускаем траффик, с уже установленным соединением
        ${fwcmd} add 10000 pass tcp from any to me in via ${mytun} established
# Разрешаем подключаться к след.TCP портам с определённых IP (ssh)
        ${fwcmd} add pass tcp from ${ssh_ip_users} to me 22,2812 \
                     in via ${mytun} setup
# Пропускаем ICMP, только нужные коды и необходимые IP(ping)
        ${fwcmd} add pass icmp from ${ssh_ip_users} to me \
                      in via ${mytun} icmptype 8
        ${fwcmd} add pass icmp from ${dnsvt} to me in via ${mytun} icmptype 0
# Разрешаем след.UDP порты
        ${fwcmd} add pass udp from ${dnsvt} 53 to me in via ${mytun}
# Прибиваем левый трафик
        ${fwcmd} add deny log all from table\(1\) to me in via ${mytun}
# Разрешаем подключаться к след.TCP портам всем
        ${fwcmd} add pass tcp from any to me 80 in via ${mytun} setup
# Всё остальное убиваем и пишем в log
        ${fwcmd} add deny log all from any to any

###########################################################################

# Входящий траффик из нашей сети в интернет.
# Прибиваем левых пользователей
        ${fwcmd} add 11000 deny log all from not ${users} to any in via ${iflan}
# Разрешаем всё для пользователей
        ${fwcmd} add pass all from ${mylan} to any in via ${iflan}
# Всё остальное убиваем и пишем в log
        ${fwcmd} add deny log all from any to any

###########################################################################

# Исходящий траффик из нашей сети в интернет, через PPPoE и Sandy
# Прибиваем левых пользователей
        ${fwcmd} add 12000 deny log all from not ${users} to any out
# Разрешаем Radmin для Radmin пользователей
        ${fwcmd} add fwd ${gwvt} tcp from ${mylan} ${radminport} \
                     to any out established
# Разрешаем DNS Волга-Телеком
        ${fwcmd} add fwd ${gwvt} udp from ${mylan} to ${dnsvt} 53 out
# Разрешаем PING DNS Волга-Телеком
        ${fwcmd} add fwd ${gwvt} icmp from ${mylan} to ${dnsvt} out icmptype 8
# NAT out
        ${fwcmd} add divert natd all from any to any out recv ${iflan}
# Пропускаем уже принятые на интерфейсе iflan и обработанные файрволом
        ${fwcmd} add fwd ${gwsandy} all from me to any out recv ${iflan}
# Всё остальное убиваем и пишем в log
        ${fwcmd} add deny log all from any to any

###########################################################################

# Входящий траффик из Интернета в нашу сеть, через PPPoE
# Разрешаем Radmin (setup и established пакеты)
        ${fwcmd} add 13000 pass tcp from any to ${mylan} ${radminport} \
                 in via ${mytun}
# Разрешаем DNS Волга-Телеком
        ${fwcmd} add pass udp from ${dnsvt} 53 to ${mylan} in via ${mytun}
# Разрешаем DNS Волга-Телеком (ответы на PING)
        ${fwcmd} add pass icmp from ${dnsvt} to ${mylan} in via ${mytun} icmptype 0
# Всё остальное убиваем и пишем в log
        ${fwcmd} add deny log all from any to any

Смотрим как всё взлетело:
#ifconfig
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=48<VLAN_MTU,POLLING>
        inet 192.168.1.100 netmask 0xffffff00 broadcast 192.168.1.255
        ether 00:50:22:95:d7:0f
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        inet 10.17.2.30 netmask 0xffff8000 broadcast 10.17.127.255
        ether 00:e0:7d:84:64:88
        media: Ethernet autoselect (10baseT/UTP)
rl1: flags=88c3<UP,BROADCAST,RUNNING,NOARP,SIMPLEX,MULTICAST> mtu 1500
        options=48<VLAN_MTU,POLLING>
        inet 10.11.12.249 netmask 0xfffffff8 broadcast 10.11.12.255
        ether 00:e0:4c:77:07:f9
        media: Ethernet autoselect (100baseTX <full-duplex>)
        status: active
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1492
        inet 195.28.84.160 --> 213.177.127.118 netmask 0xffffffff
        Opened by PID 404

для полноты картины на форуме приведён ipfw -ad list и его обсуждение.

Если PPPoE соединение отвалится и восстановится, простым перезапуском фаера нужно будет изменить gateway для PPPoE. Для этого создадим файл /etc/ppp/ppp.linkup следующего содержания:
MYADDR:
 !bg /etc/myfirewall
 !bg /usr/bin/logger -t LINKUP "Перезапускаем /etc/myfirewall"

Теперь, как только создаётся PPPoE соединение, перезапускается файрвол(В нём новый маршрут выдирается с помощью ifconfig)
В логах будет присутствовать запись:
Mar 26 17:44:01 server LINKUP: Перезапускаем /etc/myfirewall

Иногда приходится править /etc/ppp/ppp.conf и обычным kill прибить PPPoE соединение, для этого я написал скрипт и закинул в крон:
#!/bin/sh

# Определяем IP-Адрес шлюза PPPoE соединения
gatewayip=$(/sbin/ifconfig | grep "inet 195.28.84.160" | awk '{print $4}')

# Определяем IP-Адрес шлюза в конфиге ipfw
gatewayipfw=$(ipfw -ad list | grep "from me 22 to" | awk '{print $5}')

# Сравниваем оба шлюза
if (test $gatewayip)
    then
        # Сравниваем с Gateways
        if (test "$gatewayip" = "$gatewayipfw")
            then
            # Шлюзы равны, выходим
            exit 0
            else
            # Не равны, перезапускаем myfirewall
            echo "Перезапускаем myfirewall" | logger -t TESTPPPOE
            /etc/./myfirewall
        fi
    else
        # PPPoE соединения нет совсем, проверяем наличия
        # pppoe скрипта с автомат. переподключением
        nal=$(ps -ax | grep "Internet" | grep -v grep)
        if (test $nal)
            then
                # Есть скрипт, ничего не делаем
                exit 0
            else
                # Нет скрипта, запускаем заново PPPoE
                echo "Запускаем PPPoE соединение." | logger -t TESTPPPOE
                /usr/sbin/ppp -quiet -ddial -nat Internet
        fi
fi

На этом всё, пользуйтесь.



размещено: 2007-03-21,
последнее обновление: 2007-03-26,
автор: dikens3


lissyara, 2007-03-22 в 14:50:42

*/10   *     *     *     *     root  /etc/myfirewall 1>/dev/null 2>/dev/null
Это наверно в /etc/cronab.
Тем не менее не надо учить плохому, лучше пусть добавляют в рутовый крон, вызываемый как
crontab -e
Ибо не надо в системном мусорить...

VPupkin, 2007-03-27 в 12:04:12

Про порты для traceroute спасибо,диапазон не знал :)
ipfw на мой взгляд слишком перегружен.Но если работает,фиг с ним..

Gering, 2008-02-26 в 15:17:12

Блин. Извращенец. Всю проделанную работу нужно разделить на 100 и всё сделать гораздо проще. Нафига всё усложнять.

245, 2008-03-19 в 12:46:22

Gering, -Покажи как?!

dikens3 - Спасибо - я  в ВОСТОРГЕ :)

akumu, 2009-02-26 в 7:54:37

Автор нуб и опозорился. Слишком все сложно, описания недостаточные.

FireWall, 2009-04-14 в 5:28:54

Для автоматического изменения default gw можно использовать ospfd :)

фтвк, 2009-08-04 в 18:54:33

яд. На ПФ решается 2-мя правила.

little4est, 2009-08-31 в 12:54:15

Хотелось бы увидеть красивое и несложное решение задачи. Старейшины, снизойдите до нас, смертных! %)

cat_ua, 2009-10-05 в 5:22:12

2. Через обычный LAN, выдан внутренний адрес 10.17.2.30 (Шлюз 10.17.127.254) Безлимитка. Ошибка: Шлюз 10.17.127.254 исправить на 10.17.12.254

receptor, 2010-05-05 в 6:42:12

На PF всё тоже самое в несколько строк

Russell, 2010-05-12 в 0:52:32

receptor, - пример в студию пожалуйста.

Oleg, 2010-08-24 в 14:31:27

Пере собрал ядро с опциями указанными выше, комп затупил, винт бес приравно работает, потом ребут кампа. Ко может напишите инструкцию про PF

SkiNNi, 2011-12-22 в 17:09:12

помоемому всё прекрастно, может и можно проще, но походу не для тех: receptor, фтвк, Gering. За статью спасибо, беру за основу.



 

  Этот информационный блок появился по той простой причине, что многие считают нормальным, брать чужую информацию не уведомляя автора (что не так страшно), и не оставляя линк на оригинал и автора — что более существенно. Я не против распространения информации — только за. Только условие простое — извольте подписывать автора, и оставлять линк на оригинальную страницу в виде прямой, активной, нескриптовой, незакрытой от индексирования, и не запрещенной для следования роботов ссылки.
  Если соизволите поставить автора в известность — то вообще почёт вам и уважение.

© lissyara 2006-10-24 08:47 MSK

Время генерации страницы 0.0843 секунд
Из них PHP: 47%; SQL: 53%; Число SQL-запросов: 86 шт.
Исходный размер: 73465; Сжатая: 12263