Недавно на существующий сервер, где уже был укртелековский 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 в фаерволе. Если правио имеется, то скрипт заканчивает свою работу, а при отсуствии, добавляет все необходимые правила.
Надеюсь эта статья будет кому-то полезна.
Напоминаю всем копирующим мой контент о существовании закона "Об авторском праве".
В связи с этим, прошу во избежании конфликтов при копировании данного материала, ставить на него ссылку:
Также, вы можете отблагодарить меня переслав любую сумму на любой кошелек WebMoney, для поддержания данного ресурса. Или просто админу на пиво ;)
Кошельки для получения благодарности:
R386985788805
U234140473141
Z147712360455
На данной странице нет комментариев, возможно они закрыты. Если Вы хотите оставить свой комментарий, перейдите на специально созданный раздел