Имеется сервер, на нем запущены:
1. apache - обслуживает внутреннюю и внешнюю сеть
2. bind - обслуживает внутреннюю и внешнюю сеть
3. proftpd - обслуживает внутреннюю и внешнюю сеть
4. dhcpd - обслуживает внутреннюю сеть
5. squid - обслуживает внутреннюю сеть
Помогите решить проблему, народ, вот конфиг ipfw:
Код: Выделить всё
#!/bin/sh
# v.01.00.00 13.03.2014 First working version of firewall
# v.01.10.00 28.06.2014 Version of firewall with hotspot support
# v.01.11.00 29.06.2014 Added "table 0" for previleged users
# v.01.12.00 30.06.2014 Added rule for blocking dos attack
# v.01.13.00 04.07.2014 Deny Netbion on the LanOut, deny ident
# v.01.14.00 01.08.2014 Added adsl line support (created rules and tun0 iface)
# v.01.14.01 26.01.2015 Fixed rules about httpd, bind, proftpd, added getting ng0 address
# для начала вводим переменные - для нашего же удобства, чтобы не
# вводить по сотне раз одно и то же, а потом искать почему не работает,
# и в итоге выяснять, что ошибся IP адресом в одном из правил
FwCMD="/sbin/ipfw -q" # собственно где лежит бинарник ipfw
LanOut="ng0" # внешний интерфейс
LanIn="re0" # внутренний интерфейс
IpOut=`ifconfig ng0 | awk '$1=="inet"{print $2}'` # внешний IP адрес машины
IpIn="10.0.0.1" # внутренний IP машины
NetMask="24" # маска внутренней сети
NetIn="10.0.0.0" # Внутренняя сеть
# Сбрасываем все правила:
${FwCMD} -f -q flush
# Сбрасываем содержимое таблиц
${FwCMD} -f table 0 flush
# В эту таблицу будем добавляем превилигированных пользователей.
${FwCMD} table 0 add 10.0.0.10
${FwCMD} table 0 add 10.0.0.100
# Проверяем - соответствует ли пакет динамическим правилам:
${FwCMD} add 110 check-state
# Разрешаем весь траффик по внутреннему интерфейсу (петле)
${FwCMD} add 111 allow ip from any to any via lo0
# рубим попытки lo0 куда-то лезть и откуда-то лезть на lo0
${FwCMD} add 112 deny ip from any to 127.0.0.0/8
${FwCMD} add 113 deny ip from 127.0.0.0/8 to any
# block some DOS attacks.
${FwCMD} add 114 deny tcp from any to any tcpoptions !mss tcpflags syn,!ack
# Вводим запреты:
# режем частные сети на внешнем интерфейсе - по легенде он у нас
# смотрит в интернет, а значит пакетам этим браться неоткуда на нём.
# рубим частные сeти
${FwCMD} add 115 deny ip from any to 10.0.0.0/8 in via ${LanOut}
${FwCMD} add 116 deny ip from any to 172.16.0.0/12 in via ${LanOut}
${FwCMD} add 117 deny ip from any to 0.0.0.0/8 in via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add 118 deny ip from any to 169.254.0.0/16 in via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add 119 deny ip from any to 240.0.0.0/4 in via ${LanOut}
# запрещаем ident
${FwCMD} add 120 deny tcp from any to any 113 in via ${LanOut}
# запрет Netbios, 137=имя, 138=дейтаграмма, 139=сессия
${FwCMD} add 121 deny tcp from any to any 137 in via ${LanOut}
${FwCMD} add 122 deny tcp from any to any 138 in via ${LanOut}
${FwCMD} add 123 deny tcp from any to any 139 in via ${LanOut}
# рубим фрагментированные icmp
${FwCMD} add 124 deny icmp from any to any frag
# рубим широковещательные icmp на внешнем интерфейсе
${FwCMD} add 125 deny log icmp from any to 255.255.255.255 in via ${LanOut}
${FwCMD} add 126 deny log icmp from any to 255.255.255.255 out via ${LanOut}
# а тут собственно файрволл и начался:
# открываем снаружи 80 порт - есть WWW сервер на машине
${FwCMD} add 150 allow tcp from any to ${IpOut} 80 via ${LanOut}
# открываем снаружи 2200 порт - надо будет ходить на машину по ssh
${FwCMD} add 151 allow tcp from any to ${IpOut} 2200 in via ${LanOut} setup limit src-addr 3
# открываем снаружи 27015 порт для CS сервера
${FwCMD} add 152 allow udp from any to ${IpOut} 27015 via ${LanOut} limit src-addr 30
# открываем снаружи 27910 порт для Quake2 сервера
${FwCMD} add 153 allow udp from any to ${IpOut} 27910 via ${LanOut} limit src-addr 30
# DNS на внешнюю сетевуху
${FwCMD} add 154 allow udp from any 53 to any via ${LanOut}
${FwCMD} add 155 allow udp from any to any 53 via ${LanOut}
# разрешаем UDP (для синхронизации времени - 123 порт)
${FwCMD} add 156 allow udp from any to any 123 via ${LanOut}
# разрешаем ftp снаружи (оба правила - для пасивного режима)
# для узнавания портранджа по которому будет работать, лезем в
#/usr/home/lissyara/>sysctl net.inet.ip.portrange.first
# net.inet.ip.portrange.first: 49152
# /usr/home/lissyara/>sysctl net.inet.ip.portrange.last
# net.inet.ip.portrange.last: 65535
${FwCMD} add 157 allow tcp from any to ${IpOut} 21 via ${LanOut}
#Можно изгалиться примерно так, если есть желание, но я предпочитаю руками
#${FwCMD} add allow tcp from any to ${IpOut} \
#`sysctl net.inet.ip.portrange.first | awk '{print $2}'`-\
#`sysctl net.inet.ip.portrange.last | awk '{print $2}'` via ${LanOut}
#${FwCMD} add 158 allow tcp from any to ${IpOut} 10000-65535 via ${LanOut}
# разрешаем некоторые типы ICMP траффика - эхо-запрос,
# эхо-ответ и время жизни пакета истекло
${FwCMD} add 159 allow icmp from any to any icmptypes 0,8,11
# Юзеров заворачиваем на squid
${FwCMD} add 160 fwd 127.0.0.1,3128 tcp from ${NetIn}/${NetMask} to any 80 via ${LanOut}
# ядерный NAT
${FwCMD} nat 1 config log if ${LanOut} reset same_ports deny_in
${FwCMD} add 161 nat 1 ip from any to any via ${LanOut}
# рубим траффик к частным сетям через внешний интерфейс
# эти правила отличаются от тех что были выше!
${FwCMD} add 162 deny ip from 10.0.0.0/8 to any out via ${LanOut}
${FwCMD} add 163 deny ip from 172.16.0.0/12 to any out via ${LanOut}
${FwCMD} add 164 deny ip from 0.0.0.0/8 to any out via ${LanOut}
# рубим автоконфигуреную частную сеть
${FwCMD} add 165 deny ip from 169.254.0.0/16 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add 166 deny ip from 224.0.0.0/4 to any out via ${LanOut}
# рубаем мультикастовые рассылки
${FwCMD} add 167 deny ip from 240.0.0.0/4 to any out via ${LanOut}
# разрешаем все установленные соединения (если они установились -
# значит по каким-то правилам они проходили.)
${FwCMD} add 168 allow tcp from any to any established
# разрешаем весь исходящий траффик (серверу-то в инет можно? :))
${FwCMD} add 169 allow ip from ${IpOut} to any out xmit ${LanOut}
${FwCMD} add 170 allow ip from me to any via ${LanOut}
${FwCMD} add 171 allow ip from any to me via ${LanOut}
# разрешаем весь tcp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add 172 allow tcp from any to any via ${LanIn}
# разрешаем весь udp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add 173 allow udp from any to any via ${LanIn}
# разрешаем весь icmp траффик внутри локалки (на внутреннем интерфейсе)
${FwCMD} add 174 allow icmp from any to any via ${LanIn}
# запрещаем всё и всем. Если тип файрволла не open то это правило добавится
# автоматически, но всё-же ну его. Лучше сам. Надёжней.
${FwCMD} add deny log all from any to any
Несколько вопросов:
1. Не открывается снаружи фтп, хотя порт открыт и профтпд обслуживает:
Код: Выделить всё
root@hostname:/usr/home/alex # sockstat | grep proftp
nobody proftpd 888 0 tcp4 6 *:21 *:*
nobody proftpd 888 3 stream /var/run/proftpd.sock
nobody proftpd 888 4 stream /var/run/proftpd.sock
Что посоветуете?
2. Не уверен что правило для нат в моем варианте описано достаточно
безопасно:
Код: Выделить всё
# ядерный NAT
${FwCMD} nat 1 config log if ${LanOut} reset same_ports deny_in
${FwCMD} add 161 nat 1 ip from any to any via ${LanOut} # в данном случае он будет пускать всех и всюду
Но по другому нат мне не удалось завести, пробовал сначала входящее правило описать, затем исходящее.
Может есть у кого готовый конфиг, где по-человечески все описано или конфиг где описан подобный набор сервисов?
3. В логах проскочила ошибка:
Код: Выделить всё
named[5916]: could not listen on UDP socket: permission denied
named[5916]: creating IPv4 interface ng0 failed; interface ignored
Погуглил, руками перезапустил демон, т.е. /etc/rc.d/named restart - пока работает.
Нужно ли мне при поднятии/падении ng0 перезапускать bind?
Прошу ткнуть носом в явные косяки и недочеты.
P.S. И все-таки мне кажется что мой фаервол из-за того как описан нат - дырка! Поправьте, если это не так.