Настройка 2-х каналов в Интернет
Друган подключился к Интернету. Подключение через 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
На этом всё, пользуйтесь.