Добавлено: Пт 29 Мар, 2013 12:58 pm Заголовок сообщения: freebsd 2 провайдера и одна локальная сеть
В офисе 2 провайдера. Есть сервер на FreeBSD 8.2
3 сет. карты - 2 для пров. и 1 на локалку. От провайдеров статические ipЗапущены bind, mail server, mpd, httpd и т.д.
Нужно чтоб до сервера извне по ssh можно было достучаться по двум внешним ip , и чтоб сервисы тоже были доступны с 2 адресов
В офисе пользователи получали инет от 1 провайдера, но в случае отключения 1, сменой шлюза по умолчанию можно было переключить всех на 2 провайдераНашел на Хабре статью http://habrahabr.ru/post/124447/ и сделал все так же как и там
# /etc/ipfw.script
ipfw="/sbin/ipfw -q "local="re0"
ISP1="rl0"
ISP2="rl1"localnet="192.168.0.0/24"
ISP1_ip="123.45.67.89"
ISP2_ip="234.56.78.9"ISP1_gw="123.45.67.1"
ISP2_gw="234.56.78.1"nat_ISP1="8668"
nat_ISP2="8669"
nat_global="8670"${ipfw} -f flush
${ipfw} add 10 check-state
${ipfw} add 11 allow ip from any to any via lo0
${ipfw} add 12 deny ip from any to 127.0.0.0/8
${ipfw} add 13 deny ip from 127.0.0.0/8 to any#Пример сервисов которые необходимо вывесить на оба внешних интерфейса.
# sshd
${ipfw} add 20 allow tcp from any to me 14441# Web Server
${ipfw} add 25 allow tcp from any to me 80# MailServer
${ipfw} add 26 allow tcp from any to me 25
${ipfw} add 27 allow tcp from any to me 110# Other
${ipfw} add 28 allow tcp from any to me 1723 setup
${ipfw} add 29 allow tcp from any to any via ng*
${ipfw} add 30 allow udp from any to any via ng*
${ipfw} add 31 allow tcp from any to me 53
${ipfw} add 32 allow udp from any to me 53
${ipfw} add 33 allow tcp from any to me dst-port 21,30000-50000 setup
# Здесь самая соль.
# Следующие две строки нужны чтобы сам шлюз был доступен по обоим адресам, то есть с какого адреса идет пакет от шлюза, в тот интерфейс и уходил.${ipfw} add 100 fwd ${ISP1_gw} ip from ${ISP1_ip} to not ${localnet}
${ipfw} add 200 fwd ${ISP2_gw} ip from ${ISP2_ip} to not ${localnet}# Далее разделяем весь трафик по интерфейсам и направлениям, для удобства
# Локальный интерфейс
${ipfw} add 400 skipto 1000 all from any to any in recv ${local}
${ipfw} add 410 skipto 2000 all from any to any out xmit ${local}# Внешние интерфейсы
${ipfw} add 500 skipto 3000 all from any to any in recv ${ISP1}
${ipfw} add 550 skipto 4000 all from any to any out xmit ${ISP1}
${ipfw} add 600 skipto 5000 all from any to any in recv ${ISP2}
${ipfw} add 650 skipto 6000 all from any to any out xmit ${ISP2}# Если вдруг объявятся еще интерфейсы то рубим их. Все интерфейсы мы должны разрулить сами, иначе все пакеты с этих новых интерфейсов попадут под следующее разрешающее правило
${ipfw} add 900 deny all from any to any
# Локальный входящий
${ipfw} add 1000 allow all from any to any# Локальный исходящий
${ipfw} add 2000 allow all from any to any# ISP1 входящий (входящий трафик заворачиваем в нужный порт natd)
${ipfw} add 3000 divert ${nat_ISP1} ip from any to ${ISP1_ip}
${ipfw} add 3010 allow all from any to any# ISP1 исходящий (аналогично для обоих провайдеров)
# Заворачиваем пакет в natd по порту globalport
${ipfw} add 4000 divert ${nat_global} ip from ${localnet} to any
# Если есть запись трянсляции подключения снаружи вовнутрь, то natd модифицирует пакет и ставит адресом источника тот внешний адрес, на который производилось подключение
# Если это адрес первого провайдера, то далее просто разрешаем пакет и на этом обработка заканчивается
${ipfw} add 4010 allow all from ${ISP1_ip} to any
# Если это адрес второго провайдера, то мы форвардим пакет на шлюз второго провайдера.
${ipfw} add 4020 fwd ${ISP2_gw} ip from ${ISP2_ip} to any
# Если же natd вернул неизмененный пакет, значит данный пакет не относится к подключению извне, тогда заворачиваем его в соответствующий порт natd
${ipfw} add 4030 divert ${nat_ISP1} ip from ${localnet} to any
# Разрешаем прохождение пакета.
${ipfw} add 4040 allow all from any to any# Для второго провайдера все аналогично
# ISP2 входящий
${ipfw} add 5000 divert ${nat_ISP2} ip from any to ${ISP2_ip}
${ipfw} add 5010 allow all from any to any# ISP2 исходящий
${ipfw} add 6000 divert ${nat_global} ip from ${localnet} to any
${ipfw} add 6010 allow all from ${ISP2_ip} to any
${ipfw} add 6020 fwd ${ISP1_gw} ip from ${ISP1_ip} to any
${ipfw} add 6030 divert ${nat_ISP2} ip from ${localnet} to any
${ipfw} add 6040 allow all from any to anyПри таком конфиге все вроде работает, но Postfix не может отправить почту на внешние адреса (внутренняя ходит) - почему?
И еще обратил внимание на правила 1000 и 2000 - они одинаковые, это так и должно быть?
Немного перефразирую вопросИмеем в офисе шлюз на FreeBSD 8.2
Три сетевых интерфейса
re0 - локалка (192.168.0.0/24)
rl0 - 1 провайдер
rl1 - 2 провайдерIP 1 провайдера 111.111.111.22
GW 1 провайдера 111.111.111.1IP 2 провайдера 222.222.222.33
GW 2 провайдера 222.222.222.1В файле /etc/rc.cong
defaultrouter=" 111.111.111.1"Нужно чтоб сервисы на маршрутизаторе были доступными по обоим внешним адресам одновременно
Сделано средствами IPFW и natd
Содержимое файла /etc/natd.conf
log
instance default
interface rl0
port 8668
use_sockets yes
same_ports yes
redirect_port tcp 192.168.0.105:4899 9800instance rl1
interface rl1
port 8669
use_sockets yes
same_ports yesglobalport 8670
Содержимое файла /etc/ipfw (правила фаервола)
add 1000 allow tcp from any to me 14441
add 2000 allow tcp from any to me 80
add 3000 allow tcp from any to me 25
add 4000 allow tcp from any to me 110
add 5000 allow tcp from any to me 1723 setup
add 6000 allow tcp from any to any via ng*
add 7000 allow udp from any to any via ng*
add 8000 allow tcp from any to me 53
add 9000 allow udp from any to me 53
add 10000 allow tcp from any to me dst-port 21,30000-50000 setupadd 11000 fwd 111.111.111.1 ip from 111.111.111.22 to not 192.168.0.0/24
add 12000 fwd 222.222.222.1 ip from 222.222.222.33 to not 192.168.0.0/24add 13000 skipto 20000 all from any to any in recv re0
add 14000 skipto 21000 all from any to any out xmit re0add 15000 skipto 22000 all from any to any in recv rl0
add 16000 skipto 24000 all from any to any out xmit rl0
add 17000 skipto 29000 all from any to any in recv rl1
add 18000 skipto 31000 all from any to any out xmit rl1add 19000 deny all from any to any
add 20000 allow all from any to any
add 21000 allow all from any to any
add 22000 divert 8668 ip from any to 111.111.111.22
add 23000 allow all from any to anyadd 24000 divert 8670 ip from 192.168.0.0/24 to any
add 25000 allow all from 111.111.111.22 to any
add 26000 fwd 222.222.222.1 ip from 222.222.222.33 to any
add 27000 divert 8668 ip from 192.168.0.0/24 to any
add 28000 allow all from any to any
add 29000 divert 8669 ip from any to 222.222.222.33
add 30000 allow all from any to anyadd 31000 divert 8670 ip from 192.168.0.0/24 to any
add 32000 allow all from 222.222.222.33 to any
add 33000 fwd 111.111.111.1 ip from 111.111.111.22 to any
add 34000 divert 8669 ip from 192.168.0.0/24 to any
add 35000 allow all from any to anyВсе правила написаны одинаково для двух провайдеров, поэтому смена канала осуществляется просто заменой основного шлюза на роутере. Правила модифицировать нет необходимости.
Но, если в rc.conf дефолтроут - шлюз первого провайдера, команда telnet mx.yandex.ru 25 проходит нормально, но если сменить на шлюз второго провайдера (чтоб перевести локалку на использование инета от второго провайдера) telnet по 25 порту не проходит ни на один сервер.
Помогите, что не так?
>[оверквотинг удален]
> add 34000 divert 8669 ip from 192.168.0.0/24 to any
> add 35000 allow all from any to any
сверьте список правил с выводом ipfw show
чтобы не плодить темы спрошу тут.есть сервер freebsd 7.3 с тремя сетями - два прова и локалка.
локалка - rl1 (192.168.0.0/24)
провы - rl0 (95.128.224.187), alc0 (192.168.1.2)BSDsrv# vi /etc/natd.conf
log yes
#instance default
use_sockets yes
same_ports yes
unregistered_only yes
interface rl0
port 8668
dynamic yesinstance yota
use_sockets yes
same_ports yes
interface alc0
port 8669
dynamic yesBSDsrv# vi /etc/myfw.ipfw
<...>
ipfw add 520 divert 8669 log all from ${localnet} to any out via alc0
ipfw add 530 fwd 192.168.1.1 all from 192.168.1.2 to any
ipfw add 610 divert 8669 log all from any to 192.168.1.2 in via alc0
ipfw add 721 allow log tcp from me to any out via alc0
ipfw add 729 allow tcp from any to me dst-port 20,21,80,443,1024-65535 in via alc0
ipfw add 731 deny log tcp from any to me in via alc0
ipfw add 741 allow log tcp from any to ${localnet} in via alc0
<...>BSDsrv# vi /var/log/security
<...>
BSDsrv kernel: ipfw: 520 Divert 8669 TCP 192.168.0.169:4517 192.168.1.1:80 out via alc0
BSDsrv kernel: ipfw: 721 Accept TCP 95.128.224.187:4517 192.168.1.1:80 out via alc0
BSDsrv kernel: ipfw: 520 Divert 8669 TCP 192.168.0.169:4518 192.168.1.1:80 out via alc0
BSDsrv kernel: ipfw: 721 Accept TCP 95.128.224.187:4518 192.168.1.1:80 out via alc0
<...>объясните мне - какого хрена divert 8669 подставляет IP от rl1???
блин все, вопрос решен - нужно было убрать из rc.conf строку#natd_interface="rl0" # Public interface or IPaddress to use.