Недавно на существующий сервер, где уже был укртелековский 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/1814


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

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

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

Add your comment now

Please note: JavaScript is required to post comments.