Недавно на существующий сервер, где уже был укртелековский adsl со статическим IP, добавили оптический канал прямо в оптокарточку и при этом нужно было зарулить одну из подсетей именно в новый линк.

Решение данной задачи осуществленно с помощью IPFW NATD FWD:

Итак, я опущу весь конфиг фаера и опишу только самое нужное.

На имеющемся adslе все время меняется адрес шлюза и он стоит по умолчанию, в новом — выдан жестко ip с 30й маской и шлюзом.

С учетом того, что все пакеты по умолчанию ходят через телеком, то новые правила диверта должны располагаться перед теми что уже существуют.

# cat /usr/local/etc/natd_tun0.conf
###interface tun0
#switch interface vlan15
#port 8669
use_sockets yes
same_ports yes
unregistered_only yes
verbose                 no
log                     no
# cat /usr/local/etc/natd_bge2.conf
###interface bge2
#port 8670
use_sockets yes
same_ports yes
unregistered_only yes
verbose                 no
log                     no

PS. Коменты в конфигах natа коменты сделаны для удобства расширения сети.

# cat /usr/local/etc/rc.d/natd.sh
#!/bin/sh
###starting_natd_scripts
/sbin/natd -p 8669 -f /usr/local/etc/natd_tun0.conf -dynamic -n tun0
/sbin/natd -p 8670 -f /usr/local/etc/natd_bge2.conf -n bge2

Далее, привожу правила фаервола. Для примера делаю их отличными от оригинала и указываю только необходимые для заворачивания нужных пакетов. Для примера пусть адрес нужной нам локалким будет 10.10.10.0/24, всех остальных 10.10.1.0/24-10.10.3.0/24. Правила фильтрующие ненужные (запрещённые) пакеты — в данном примере не рассматриваются.

# cat /usr/local/etc/firewall.sh
ipfw="/sbin/ipfw -q"
ReIP="196.17.22.22"
ReGw="196.17.22.21"
Servers="10.10.10.0/24"
All="10.10.1.0/24,10.10.2.0/24,10.10.3.0/24"
${ipfw} -f flush;
###New_Link###Подсчет трафика для mrtg
${ipfw} add 10 count ip from any to any in via tun0
${ipfw} add 11 count ip from any to any out via tun0
###Inet_real_IP
${ipfw} add 12 count ip from any to any in via bge2
${ipfw} add 13 count ip from any to any out via bge2
.......................сдесь необходимые правила deny....................
#####New_Opto-link
${ipfw} add 511 divert 8670 log ip from ${Servers} to any not dst-ip ${All},${Servers}
${ipfw} add 512 divert 8670 log ip from ${All} to any out via bge2 not dst-ip ${All}, ${Servers}
${ipfw} add 513 fwd ${ReGw} ip from ${ReIP} to any not dst-ip ${All},${Servers}
${ipfw} add 514 divert 8670 log ip from any to me in via bge2 not src-ip ${All},${Servers}
####End_Opto_Link
####ADSL_Link
${ipfw} add 521 divert 8669 ip from ${All} to any out via tun0 not dst-ip ${All}, ${Servers}
${ipfw} add 522 divert 8669 ip from ${Servers} to any out via tun0 not dst-ip ${All},${Servers}
${ipfw} add 523 divert 8669 ip from any to me in via tun0 not src-ip ${All}, ${Servers}
...............С дивертами закончили.. Дальше как обычно, лишнее - закрыть, недостающее - открыть......

В примере выше, указаны в правилах «not dst-ip ${All}, ${Servers}» — это на всякий случай, что бы не бегали локальные пакеты через интерфейс интернета ;). В вашем случае они могут не понадобится.

Теперь небольшой скриптик, который поможет автоматически перекинуть на adsl подсеть серверов, в случае падения и вернуть обратно при её поднятии:

# cat /usr/local/etc/if_ping.sh
#!/bin/sh
ReIP="196.17.22.22"
ReGw="196.17.22.21"
ipfw="/sbin/ipfw -q"
Servers="10.10.10.0/24"
All="10.10.1.0/24,10.10.2.0/24,10.10.3.0/24"
 
if ping -S${ReIP} -c 3 ${ReGw} >> /dev/null ; then
if ${ipfw} list 511 >> /dev/null ; then
exit 0
else
${ipfw} add 511 divert 8670 log ip from ${Servers} to any not dst-ip ${All},${Servers}
${ipfw} add 512 divert 8670 log ip from ${All} to any out via bge2 not dst-ip ${All}, ${Servers}
${ipfw} add 513 fwd ${ReGw} ip from ${ReIP} to any not dst-ip ${All},${Servers}
${ipfw} add 514 divert 8670 log ip from any to me in via bge2 not src-ip ${All},${Servers}
fi
else
${ipfw} delete 511
${ipfw} delete 512
${ipfw} delete 513
${ipfw} delete 514
fi

Данный скрипт проверяет наличие связи по оптическому каналу и при его отсуствии удаляет правила диверта, тем самым направляя все пакеты по умолчанию, а при его появлении или наличии сверяет — имеется ли правило 511 в фаерволе. Если правио имеется, то скрипт заканчивает свою работу, а при отсуствии, добавляет все необходимые правила.

Надеюсь эта статья будет кому-то полезна.

Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:

http://noted.org.ua/?p=1814


Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)

Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455

На данной странице нет комментариев, возможно они закрыты. Если Вы хотите оставить свой комментарий, перейдите на специально созданный раздел

Add your comment now

You must be logged in to post a comment.