Perfectus88
Junior Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Добрый день. Имеется проблема с IPFW на FreeBSD9.0 64bit Задача: открыть 21, 22 и 80 порт на сервере, остальное блокировать. Организовать NAT встроенный в ядро FreeBSD. Все делается на основе этой статьи: http://www.lissyara.su/articles/freebsd/tuning/ipfw_nat/ Правила составлены по наводке автора статьи. Проблема в следующем: сервер не принимает никакие входящие соединения до тех пор пока не включить машину за ним. Затем машину можно выключить - сервер какоето время принимает соединений - затем вновь тишина. Бьюс уже наверно недели две. Все работает отлично, но как то не хочется держать машину постоянно включенной Постарался учесть глюки IPFW NAT - все указано ниже. Ядро собрано со следующими опциями: Код: options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_VERBOSE_LIMIT=1000 options IPFIREWALL_NAT options LIBALIAS options ROUTETABLES=2 options DUMMYNET options HZ="1000" | Код: net.inet.ip.fw.one_pass=1 | Правила ipfw: Код: #!/bin/sh # Вводим переменные: FwCMD="/sbin/ipfw" # Расположение бинарника IPFW LanOUT="alc0" # Внешний интерфейс LanIN="re0" # Внутренний интерфейс IpOUT="80.80.80.80" # Внешний IP адрес IpIN="192.168.1.1" # Внутренний IP адрес NetIN="192.168.1.0" # Внетренняя сеть FullUSER="192.168.1.2/32,192.168.1.3/32,192.168.1.4/32,192.168.1.5/32,192.168.1.6/32" # IP адреса с доступом в интернет # Сбрасываем все правила ${FwCMD} -f flush # Очищаем таблицы с блокируемыми адресами ${FwCMD} -f "table 1" flush ${FwCMD} -f "table 2" flush # Разрешаем весь трафик по внутреннему интерфейсу (петле) ${FwCMD} add allow ip from any to any via lo0 # Запрещаем lo0 куда то лезть и откуда то лезть ${FwCMD} add deny ip from any to 127.0.0.0/8 ${FwCMD} add deny ip from 127.0.0.0/8 to any # Запрещаем таблицу с ip адресами с которых неправильно ввели логин или пароль по SSH. BruteBlock для SSH ${FwCMD} add deny ip from "table(1)" to any in recv ${LanOUT} # Запрещаем таблицу с ip адресами с которых неправильно ввели логин или пароль к vsftpd ${FwCMD} add deny ip from "table(2)" to any in recv ${LanOUT} # Разрешаем некоторые типы ICMP запросов (эхо-запрос, эхо-ответ, время жизни пакета истекло) ${FwCMD} add allow icmp from any to any icmptypes 0,8,11 # Разрешаем все исходящие/входящие соединения FullUser'ам через внутренний интерфейс # zapreshaem vsem ostalnim vozmozhnost' ispolzovat etot router ${FwCMD} add allow all from ${FullUSER} to any in recv ${LanIN} ${FwCMD} add allow all from any to ${FullUSER} out xmit ${LanIN} ${FwCMD} add deny all from ${NetIN} to any via ${LanIN} # Запрещаем частные сети на внешнем интерфейсе ${FwCMD} add deny ip from any to 10.0.0.0 in recv ${LanOUT} ${FwCMD} add deny ip from 10.0.0.0/8 to any in recv ${LanOUT} ${FwCMD} add deny ip from any to 172.16.0.0/12 in recv ${LanOUT} ${FwCMD} add deny ip from 172.16.0.0/12 to any in recv ${LanOUT} ${FwCMD} add deny ip from any to 192.168.0.0/16 in recv ${LanOUT} ${FwCMD} add deny ip from 192.168.0.0/16 to any in recv ${LanOUT} ${FwCMD} add deny ip from any to 169.254.0.0/16 in recv ${LanOUT} ${FwCMD} add deny ip from 169.254.0.0/16 to any in recv ${LanOUT} # Запрещаем широковещательные icmp на внешнем интерфейсе ${FwCMD} add deny log icmp from any to 255.255.255.255 in recv ${LanOUT} ${FwCMD} add deny log icmp from any to 255.255.255.255 out xmit ${LanOUT} # Делалось для тех моментов когда нет параметра deny_in в настройках ната ${FwCMD} add deny ip from any to any 139,445 in recv ${LanOUT} # NAT встроенный в ядро системы ${FwCMD} nat 1 config log if ${LanOUT} reset same_ports deny_in redirect_port tcp ${IpOUT}:22 22 redirect_port tcp ${IpOUT}:21 21 redirect_port tcp ${IpOUT}:50000-50500 50000-50500 redirect_port tcp ${IpOUT}:80 80 ${FwCMD} add nat 1 ip from any to any via ${LanOUT} | ipfw show: Код: 00100 1784 184134 allow ip from any to any via lo0 00200 0 0 deny ip from any to 127.0.0.0/8 00300 0 0 deny ip from 127.0.0.0/8 to any 00400 0 0 deny ip from table(1) to any in recv alc0 00500 0 0 deny ip from table(2) to any in recv alc0 00600 0 0 deny ip from table(3) to any dst-port 80 in recv alc0 00700 294 18092 allow icmp from any to any icmptypes 0,8,11 00800 225402 13071496 allow ip from 192.168.1.2,192.168.1.3,192.168.1.4,192.168.1.5,192.168.1.6 to any in recv re0 00900 482227 706049343 allow ip from any to 192.168.1.2,192.168.1.3,192.168.1.4,192.168.1.5,192.168.1.6 out xmit re0 01000 0 0 deny ip from 192.168.1.0 to any via re0 01100 31 1712 deny ip from any to any dst-port 139,445 in recv alc0 01200 0 0 deny ip from any to 10.0.0.0 in recv alc0 01300 198278 19158881 deny ip from 10.0.0.0/8 to any in recv alc0 01400 0 0 deny ip from any to 172.16.0.0/12 in recv alc0 01500 0 0 deny ip from 172.16.0.0/12 to any in recv alc0 01600 199 32138 deny ip from any to 192.168.0.0/16 in recv alc0 01700 345 198472 deny ip from 192.168.0.0/16 to any in recv alc0 01800 810 69875 deny ip from any to 169.254.0.0/16 in recv alc0 01900 0 0 deny ip from 169.254.0.0/16 to any in recv alc0 02000 0 0 deny log logamount 1000 icmp from any to 255.255.255.255 in recv alc0 02100 0 0 deny log logamount 1000 icmp from any to 255.255.255.255 out xmit alc0 02200 892966 842252492 nat 1 ip from any to any via alc0 65535 392 49192 deny ip from any to any | Вот параметры адаптеров: Внешний (выключены RXCSUM и TXCSUM): Код: alc0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=c3098<VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_MCAST,WOL_MAGIC,VLAN_HWTSO,LINKSTATE> | Внутренний: Код: re0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> metric 0 mtu 1500 options=389b<RXCSUM,TXCSUM,VLAN_MTU,VLAN_HWTAGGING,VLAN_HWCSUM,WOL_UCAST,WOL_MCAST,WOL_MAGIC> | Пробовал убирать параметр deny_in в настройках ната - без результата. Тоесть результат конечно есть: в те моменты в которые сервер принимает входящие соединения я вижу открытыми еще и 139 и 445 порты (samba стоит на сервере) Но потом сервер перестает даже пинговаться - включил машинку за ним - вуаля все заработало. Не могу понять как может зависить способность сервера принимать входящие соединения от машины которая находится за ним. Прошу помочь. |