|
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
|
|
Комментарии пользователей [13 шт.]