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

Автор: 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

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

Обновлено: 12.03.2015