Редко кто делится полноценными скриптами по IPFW, а он довольно замороченный для понимания новичками. Далее выкладываю пару скриптов для изучения новичками, в одном объявляются все переменные, в том числе и по сетевым интерфейсам, а во втором сами правила, причем запуск возможен с различными ключами для соответствующих целей.
"-list" - для отображения правил
"-stat" - для статических правил
"-test" - для отладки правил
Первый:
variables.sh
Код: Выделить всё
#!/bin/sh
WanIf=`netstat -rnf inet |awk '/default/{print $6}'` # Интерфейс WAN/oif (outside/внешний)
if [ "${WanIf}" != "" ]; then
WanGw=`netstat -rnf inet |awk '/default/{print $2}'` # WAN/oif (outside/внешний) Gateway/Шлюз по умолчанию
#/sbin/ipfw -q add 1 pass icmp from any to any icmptypes 0,8,11
#if [ "${WanGw}" != "" ] && [ "`ping -i 0.1 -c 5 -t 1 ${WanGw} |awk '/100.0% packet loss/'`" = "" ]; then
#/sbin/ipfw -q delete 1
if [ "${WanGw}" != "" ]; then
WanIp=`ifconfig ${WanIf}|awk '/inet /{print $2}'` # WAN/oif (outside/внешний) IP/адрес
#WanIp=`ifconfig ${WanIf}| grep inet | awk '{print $2}'` # WAN/oif (outside/внешний) IP/адрес
WanNet=`netstat -rnf inet |grep ${WanIf}|awk '/ U /{print $1}'` # WAN/oif (outside/внешняя) Net/сеть
#WanNet=`netstat -rnf inet |awk '/ U /&&/${WanIf}/{print $1}'` # WAN/oif (outside/внешняя) Net/сеть
fi
LanIf=`netstat -rnf inet |grep -v ${WanIf}|awk '/ U /{print $6}'` # Интерфейс LAN (inside/внутренний)
if [ "${LanIf}" != "" ]; then
LanIp=`ifconfig ${LanIf} |awk '/inet /{print $2}'` # LAN/iif (inside/внутренний) IP/адрес
#WanIp=`ifconfig ${LanIf}| grep inet | awk '{print $2}'` # LAN/iif (inside/внутренний) IP/адрес
LanNet=`netstat -rnf inet |grep ${LanIf}|awk '/ U /{print $1}'` # LAN/iif (inside/внутренняя) Net/сеть
#WanNet=`netstat -rnf inet |awk '/ U /&&/${LanIf}/{print $1}'` # LAN/iif (inside/внутренняя) Net/сеть
fi
echo Var1 ${WanIf} ${WanIp} ${WanGw} ${WanNet} ${LanIf} ${LanIp} ${LanGw} ${LanNet} > /tmp/firevall
else
WanIf="rl0" # WAN Интерфейс (outside/внешний)
WanIp="77.37.166.92" # WAN IP-адрес (outside/внешний)
WanGw="77.37.166.1" # WAN Шлюз (outside/внешний)
WanNet="77.37.166.0/23" # WAN IP-сеть (outside/внешний)
LanIf="lan0" # LAN Интерфейс (inside/внутренний)
LanIp="192.168.0.5" # LAN IP-адрес (inside/внутренний)
#LanGw="192.168.1.5" # LAN Шлюз (inside/внутренний)
LanNet="192.168.0.0/24" # LAN IP-сеть (inside/внутренняя)
echo Var2 ${WanIf} ${WanIp} ${WanGw} ${WanNet} ${LanIf} ${LanIp} ${LanGw} ${LanNet}
fi
LoopIf="lo0" # LoopBack интерфейс (петля)
LoopIp="127.0.0.1" # LocalHost IP
LoopNet="127.0.0.0/8" # Сеть LocalHost(Подсеть для коммуникаций внутри хоста)
DmzIf="dmz0" # DMZ Интерфейс (демилитаризованная зона трехдомного типа
#DmzIp="172.16.1.1" # DMZ IP-адрес (демилитаризованная зона)
#DmzGw="172.16.1.1" # DMZ Шлюз (демилитаризованная зона)
DmzNet="172.16.1.0/28" # DMZ IP-сеть (демилитаризованная зона) 172.16.1.0-172.16.1.6
#PppIf="ng0" # PPP Интерфейс (PPPoE VPN клиент)
#PppIp="77.37.166.92" # PPP IP-адрес (PPPoE VPN клиент)
#PppGw="77.37.166.1" # PPP Шлюз (PPPoE VPN клиент)
#PppNet="77.37.166.0/23" # PPP IP-сеть (PPPoE VPN клиент)
VpnIf="ng*" # VPN Интерфейс (PPTP VPN сервер)
VpnGv="192.168.1.232" # VPN IP-адрес (PPTP VPN шлюз)
VpnNet="192.168.1.232/29" # VPN IP-сеть (PPTP VPN подсеть) 192.168.1.233-192.168.1.238
# При включении PPTP VPN сервера, накладывается ограничение на диапазон IP локальной сети
LanNet="$LanNet{1-231}" # LAN IP-сеть (inside/внутренняя) 192.168.1.1-192.168.1.231
OvpnIf="tun0" # OVPN Интерфейс(Open VPN сервер)
OvpnIp="192.168.2.1" # OVPN IP-адрес (Open VPN шлюз)
OvpnNet="192.168.2.0/24" # OVPN IP-сеть (Open VPN подсеть)
# Зарезервированные по RFC 791 адреса которые не должны быть глобально маршрутизируемыми
OwnNet="0.0.0.0/8" # "Своя" сеть (для локального использования на хосте при создании сокетов IP)
MCastNet="224.0.0.0/3" # Class D, E multicast (общегрупповое вещание)
BCastNet="255.255.255.255" # Broadcast
PrivNet="10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16" # RFC 1918 - Приватные сети
DenyNet=$OwnNet", "$PrivNet # Запрещенные сети
DenyNet=$DenyNet", 169.254.0.0/16" # IANA - Канальные (link-local) адреса (IP сеть авто-конфигурации машин без DHCP)
DenyNet=$DenyNet", 192.0.2.0/24, 198.51.100.0/24, 203.0.113.0/24" # Для примеров в документации.
DenyNet=$DenyNet", 204.152.64.0/23" # Sun Microsystems cluster interconnect (соединения кластеров)
DenyNet=$DenyNet", 240.0.0.0/4" # Зарезервировано для использования в будущем
AdminHost="192.168.1.10,192.168.1.20,192.168.0.10,192.168.0.20" # Компьютеры локальной сети, которым разрешен привелегированный доступ
DenyHost="192.168.1.30,192.168.1.40" # Компьютеры локальной сети, которым запрещен доступ в internet
PubPort="0-1023" # RFC 4340 Общеизвестные порты используемые процессами системы или прикладными программами, запущенные привилегированными пользователями
RegPort="1024-49151" # RFC 4340 Зарегистрированные порты используемые процессами обычных пользователей или программами, запущенными обычными пользователями
DynPort="49152-65535" # Клиентские порты используемые внутри закрытых сетей - для временного использования
# Запрещенные порты, по которым требуется посылка уведомления (RST), для ускорения работы приложений удаленного сервера/клиента
ResetPort="113" # RFC 1413 запрет ident
# Запрещенные на отправку в Интернет порты Netbios/Samba
DenyPort="135" # Windows (функция отображения конечных точек RPC) (COM/DCOM, DFS, журнал событий, репликация файлов, очереди сообщений и MsOutlook.)
DenyPort=$DenyPort",137,138,139,445" # Netbios/Samba 137=name, 138=datagram, 139=session (браузер поиска компьютеров, службы совместного использования файлов, Net Logon и служба сервера), 445 (доступ к файлам, принтерам и другим сетевым ресурсам, межпроцессное взаимодействие)
DenyPort=$DenyPort",389,636" # ldap и ldaps (sldap)
DenyPort=$DenyPort",520" # RIP протокол дистанционно-векторной маршрутизации по умолчанию вещает в сеть свою полную таблицу маршрутизации раз в 30 секунд, довольно сильно нагружая низкоскоростные линии связи.
DmzUdp="" # Открытые на серверах DMZ сервисы/порты "smtp/smtps,http,https,pop3/pop3s"
DmzTcp="25,465,80,443,110,995" # Открытые на серверах DMZ сервисы/порты "smtp/smtps,http,https,pop3/pop3s"
WanUdp="1194" # Открытые на сервере сервисы/порты "openvpn" за исключением ssh
#WanTcp="25,80,110,1723" # Открытые на сервере сервисы/порты "ftp,smtp,http,pop3,pptp" за исключением ssh
WanTcp="1723" # Открытые на сервере сервисы/порты "ftp,smtp,http,pop3,pptp" за исключением ssh
LanUdp="53,67,123,137,138" # Открытые на сервере сервисы/порты "dns,dhcp,ntp,samba"
LanTcp="21,22,25,53,80,110,139,445,1723,1194,3306,5006,9091" # Открытые на сервере сервисы/порты "ftp,ssh,smtp,dns,dhcp,http,pop3,pptp,openvpn,mysql,mpd5,transmission"
AdmTcp="20,22,25,465,53,110,1723" # Разрешенные администраторам сервисы/порты "ftp-data,ftp,ssh,smtp/smtps,domain,http,https,pop3/pop3s,pptp,aol"
AdmUdp="53,443,955,1194" # Разрешенные администраторам UDP сервисы/порты "domain,OpenVpn,OpenVpn"
UsrUdp="123" # Разрешенные пользователям сервисы/порты "ftp,http,https,aol"
UsrTcp="21,80,443,8080,5190" # Разрешенные пользователям сервисы/порты "ftp,http,https,aol"
BsdTcp="5999" # Разрешенные Jail серверам сервисы/порты "CVSup"
Второй:
firewall.sh
Код: Выделить всё
#!/bin/sh
## Сброс и инициализация переменных, ограничений, очередей, таблиц, функций ###
#- Инициализация переменных скрипта ------------------------------------------#
ssys="set 0"; sbug="set 29"; sfnp="set 30" # $ssys-обязательные, $sbug-отладка, $sfnp-fingerprinting/antispoofing
swan="set 1"; sdmz="set 2"; sppp="set 3" # Правила на внешних интерфейсах $swan-WAN, $sdmz-DMZ, $sppp-PPP,
slan="set 4"; svpn="set 5"; sovpn="set 6" # Правила на внутренних интерфейсах $slan-LAN, $svpn-VPN, $sovpn-OVPN
snat="set 10"; spip="set 11"; sque="set 12" # Правила $snat=NAT, $spip=Pipe, $sque=Queue
l0=""; l1="log logamount 10"; l2="log logamount 100"; l3="log logamount 1000" # Количество записей по правилу
inc=10; SStart=100; SysEnd=65000 # Значение шага динамической генерации номеров правил. Стартовое значение счетчика первичных и завершающих павил.
WanIn=1000; DmzIn=2000; PppIn=3000; LanIn=4000; VpnIn=5000; OvpnIn=6000 # Стартовое значение счетчика правил по каждому интерфейсу для ф-ии ip_input()
WanOut=1500; DmzOut=2500; PppOut=3500; LanOut=4500; VpnOut=5500; OvpnOut=6500 # Стартовое значение счетчика правил по каждому интерфейсу для ф-ии ip_output()
. /etc/ipfw/variables.sh # Запуск скрипта установки и инициализации переменных
#- Инициализация функций -----------------------------------------------------#
dyncmd () { eval ${fwcmd} add \$${1} ${@##${1}}; eval ${1}=$((${1}+${inc})); } # Функция динамичекой генерации номеров правил
setup_loopback () { # Функция обязательных правил LoopBack интерфейса
dyncmd "SStart" $ssys allow ip from any to any via ${LoopIf} # Трафик через LoopBack интерфейс $LoopIf
dyncmd "SStart" $ssys deny ip from any to ${LoopNet} # Запрет трафика на подсеть хоста на всех интерфейсах
dyncmd "SStart" $ssys deny ip from ${LoopNet} to any # Запрет трафика из подсети хоста на всех интерфейсах
}
natWanIn () { # Пример: natWanIn "$l1" "tcp" "192.168.1.10" "3389" "10389" "$sl2" # Функция создания комплекта правил для проброса порта с внешнего интерфейса на адрес локальной сети
dyncmd "WanIn" $snat nat 1 $1 $2 from any to ${WanIp} $5 in recv ${WanIf} $6
dyncmd "WanOut" $snat nat 1 $1 $2 from $3 $4 to any out xmit ${WanIf} established
dyncmd "LanIn" $snat allow $1 $2 from $3 $4 to any in recv ${LanIf}
dyncmd "LanOut" $snat allow $1 $2 from any to $3 $4 out xmit ${LanIf}
}
natLanOut () { # Пример: #natLanOut "$l1" "tcp" "192.168.1.10" "87.250.250.203" "9595" "$sl6" # Функция создания комплекта правил для выхода в интернет с локальной сети
local notLanIp=$4; local setEstablished="established"
if [ "${6##setup*}" != "" ]; then setEstablished=""; fi
if [ "$4" == "any" ]; then notLanIp="not ${LanIp}"; fi
dyncmd "WanIn" nat 1 $1 $2 from $4 $5 to ${WanIp} in recv ${WanIf} $setEstablished
#dyncmd "WanIn" $snat check-state
dyncmd "WanOut" skipto $((${WanOut}+${inc})) $1 $2 from $3 to $4 $5 out xmit ${WanIf} $6
#dyncmd "WanIn" $snat deny $1 $2 from $3 $4 to any in recv ${WanIf} established
#dyncmd "WanIn" $snat deny $1 $2 from any to any in recv ${WanIf}
#dyncmd "WanOut" $snat deny $1 $2 from any to any out xmit ${WanIf}
dyncmd "WanOut" nat 1 $1 $2 from $3 to $4 $5 out xmit ${WanIf}
dyncmd "LanIn" allow $1 $2 from $3 to $notLanIp $5 in recv ${LanIf}
dyncmd "LanOut" allow $1 $2 from $notLanIp $5 to $3 out xmit ${LanIf}
}
configMini () { # Функция создания минимально-достаточного набора проверенно-работающих статических правил
setup_loopback # Добавление обязательных правил LoopBack интерфейса
dyncmd "SStart" $ssys check-state # Разрешение установленных соединений
dyncmd "WanIn" $swan fwd ${LoopIp},22 $l1 tcp from any to ${WanIp} "10122" in recv ${WanIf} $ks # Разрешение подключения по SSH(22) из интернета
dyncmd "WanIn" $swan fwd ${LoopIp},21 $l1 tcp from any to ${WanIp} "10121" in recv ${WanIf} $ks # Разрешение подключения по FTP(21) из интернета
dyncmd "WanIn" $swan fwd ${LoopIp},1194 $l1 tcp from any to ${WanIp} "10194 " in recv ${WanIf} $ks # Разрешение подключения по OpenVPN(1194) из интернета
dyncmd "WanIn" $sfnp deny $l1 ip from "'table(1)'" to any in recv ${WanIf} # Запрет не маршрутизируемого трафика
dyncmd "WanIn" $swan allow $l1 icmp from any to ${WanIp} in recv ${WanIf} icmptypes "8" # Разрешение входящих пингов (RFC 792 ICMP)
for i in `echo ${WanTcp}|sed 's/,/ /g'`; do # Разрешение подключений к серверу из интернета на разрешенные порты
dyncmd "WanIn" $swan allow $l1 tcp from any to ${WanIp} $i in recv ${WanIf} ; done #
dyncmd "WanOut" $swan allow $l1 ip from me to any out xmit ${WanIf} $ks # Разрешение серверу выходить в интернет
dyncmd "WanIn" $snat nat 1 $l1 ip from any to any in recv ${WanIf} # Включение NAT-а для всех подключений на внешнем интерфейсе
dyncmd "WanOut" $snat nat 1 $l1 ip from any to any out xmit ${WanIf} #
dyncmd "LanIn" $slan allow $l1 ip from any to any in recv ${LanIf} # Разрешение все для всех на внутреннем интерфейсе
dyncmd "LanOut" $sbug allow $l1 ip from any to any out xmit ${LanIf} #
dyncmd "VpnIn" $svpn allow $l1 ip from ${VpnNet} to ${LanNet} in recv ${VpnIf} $ks # Разрешение из VPN сети в локалку
dyncmd "OvpnOut" $sovpn allow $l1 ip from ${OvpnNet} to ${LanNet} in recv ${OvpnIf} $ks # Разрешение "все для всех" из VPN сети
}
deny_fnp_spoof () { # Функция защиты от fingerprinting и antispoofing на входящем трафике WAN
#dyncmd "WanIn" $sfnp deny $l1 ip from any to not ${WanIp} in recv ${WanIf} # Анти спуфинг - Запрет пакетов адресованных не серверу
dyncmd "WanIn" $sfnp deny $l1 ip from "'table(1)'" to any in recv ${WanIf} # Запрет не маршрутизируемого трафика
dyncmd "WanIn" $sfnp deny $l1 ip from any to ${WanIp} in recv ${WanIf} ipoptions ssrr # Запрет пакетов с нестандартными IP-опциями
dyncmd "WanIn" $sfnp deny $l1 ip from any to ${WanIp} in recv ${WanIf} ipoptions lsrr
dyncmd "WanIn" $sfnp deny $l1 ip from any to ${WanIp} in recv ${WanIf} ipoptions rr
dyncmd "WanIn" $sfnp deny $l1 ip from any to ${WanIp} in recv ${WanIf} ipoptions ts # Запрет пакетов с Timestamp
dyncmd "WanIn" $sfnp deny $l1 tcp from any to ${WanIp} in recv ${WanIf} tcpflags !syn, !ack, !rst # Запрет NULL-пакетов (без единого флага) - второй тест nmap
dyncmd "WanIn" $sfnp deny $l1 tcp from any to ${WanIp} in recv ${WanIf} tcpflags syn, fin, urg, psh, !ack # Запрет XMAS-пакетов - третий тест nmap
dyncmd "WanIn" $sfnp deny $l1 tcp from any to ${WanIp} in recv ${WanIf} tcpflags syn, fin, !ack
dyncmd "WanIn" $sfnp deny $l1 tcp from any to ${WanIp} in recv ${WanIf} tcpflags fin, urg, psh, !ack # Седьмой тест nmap
dyncmd "WanIn" $sfnp deny $l1 tcp from any to ${WanIp} in recv ${WanIf} tcpflags fin, !ack
dyncmd "WanIn" $sfnp deny $l1 tcp from any to ${WanIp} in recv ${WanIf} tcpflags urg, !ack
dyncmd "WanIn" $sfnp deny $l1 tcp from any to ${WanIp} in recv ${WanIf} tcpflags psh, !ack
dyncmd "WanIn" $sfnp deny $l1 tcp from any to ${WanIp} in recv ${WanIf} tcpflags fin, syn, rst, psh, ack, urg # Запрет X-сканирования:
dyncmd "WanIn" $sfnp deny $l1 tcp from any to ${WanIp} in recv ${WanIf} tcpflags !fin, !syn, !rst, !psh, !ack, !urg # Запрет NULL-сканирования:
dyncmd "WanIn" $sfnp deny $l1 tcp from any to ${WanIp} in recv ${WanIf} not established tcpflags fin # Запрет FIN-сканирования:
dyncmd "WanIn" $sfnp deny $l1 ip from any to ${WanIp} in recv ${WanIf} not verrevpath in # Защита от спуфинга
#${fwcmd} set disable $sfnp # enable/disable правил ОТЛАДКА.
}
#- Разделение на отладку и применение правил----------------------------------#
if [ "${1}" == "-list" ]; then fwcmd="echo ipfw" # Запуск скрипта c опцией "-list" - для отображения правил
if [ "${2}" != "-stat" ]; then ks="keep-state"; fi # Запуск скрипта c опцией "-stat" - для статических правил
elif [ "${1}" == "-test" ]; then fwcmd="/sbin/ipfw -n" # Запуск скрипта c опцией "-test" - для отладки правил
if [ "${2}" != "-stat" ]; then ks="keep-state"; fi # Запуск скрипта c опцией "-stat" - для статических правил
else # Запуск скрипта в рабочем режиме - для применения правил
if [ "${1}" != "-stat" ]; then ks="keep-state"; fi # Запуск скрипта c опцией "-stat" - для статических правил
#- Сброс(удаление) всех правил, пайпов, очередей, таблиц ---------------------#
fwcmd="/sbin/ipfw -q" # Подавление информационных сообщений при добавлении правил
${fwcmd} -f flush # Сброс правил
#${fwcmd} -f pipe flush # Сброс ограничителей ширины канала
#${fwcmd} -f queue flush # Сброс очередей
${fwcmd} -f table all flush # Сброс всех таблиц
for i in `${fwcmd} nat show config |awk '{print $3}'`; do ${fwcmd} nat $i delete; done # Сброс всех правил нат
#- Инициализация переменных SYSCTL -------------------------------------------#
#${fwcmd} -f enable one_allow #sysctl net.inet.ip.fw.one_allow=1 # Пакеты, перенаправляемые мостом, обрабатываются ipfw один раз
${fwcmd} -f enable verbose #sysctl net.inet.ip.fw.verbose=1 # Включение выдачи более подробных сообщений.
${fwcmd} -f enable debug #sysctl net.inet.ip.fw.debug=1 # Включение отладочных сообщений.
#sysctl net.inet.ip.fw.verbose_limit=0 # Ограничение количества сообщений. 0 - без ограничений
#sysctl net.inet.ip.fw.autoinc_step=10 # inc=10 # Установка разности между номерами правил при их автогенерации
#sysctl net.inet.ip.fw.default_to_accept=0 # Правило по умолчанию, 0-доступ запрещен
#- Инициализация таблиц ------------------------------------------------------#
for i in ${DenyNet}; do ${fwcmd} table 1 add $i; done # Создание таблицы(1) приватных сетей
for i in `echo ${DenyHost}|sed 's/,/ /g'`; do ${fwcmd} table 2 add $i; done # Создание таблицы(2) блокированных хостов
for i in `echo ${AdminHost}|sed 's/,/ /g'`; do ${fwcmd} table 3 add $i; done # Создание таблицы(3) административных хостов
#- Инициализация объектов NAT, pipe, queue -----------------------------------#
${fwcmd} nat 1 config log if ${WanIf} reset deny_in same_ports unreg_only redirect_port tcp 192.168.1.10:3389 10389 # Включить nat 1 на внешнем интерфейсе, Включить редирект на внутренний RDP
#${fwcmd} pipe 1 config bw 7Mbit/s queue 10 # исходящая
#${fwcmd} pipe 2 config bw 7Mbit/s queue 10 # входящая
#${fwcmd} queue 1 config mask src-ip 0xffffffff pipe 1 queue 70 gred 0.002/15/35/0.2 #
#${fwcmd} queue 2 config mask dst-ip 0xffffffff pipe 2 queue 70 gred 0.002/15/35/0.2 #
if [ "${1}" == "-mini" ]; then configMini; exit; fi # Запуск скрипта c опцией "-mini" - для минимальных правил
fi
#- Инициализация переменных и правил для динамических правил -----------------#
if [ "$ks" != "" ]; then sks="setup $ks"; sl="setup limit src-addr";
sl2="$sl 2"; sl4="$sl 8"; sl6="$sl 32"; sl7="$sl 64"; sl8="$sl 128"; # 1-1/2-2/3-4/4-8/5-16/6-32/7-64/8-128
dyncmd "SStart" $ssys check-state ; fi # Разрешение установленных соединений
###############################################################################
## Правила IPFW ###############################################################
#-($SStart) Стартовые правила -----------------------------------------------#
setup_loopback # Обязательные правила LoopBack интерфейса
#-(00300) Подсчет всего трафика в интернет и обратно -------------------------#
#dyncmd "SStart" $ssys count $l0 ip from ${WanIp} to not ${LanNet} out via $WanIf
#dyncmd "SStart" $ssys count $l0 ip from not ${LanNet} to ${WanIp} in via $WanIf
#-(00400) Правила распределения по ф-ям ip_input/ip_output и интефейсам ------#
dyncmd "SStart" $ssys skipto ${WanIn} ip from any to any in via ${WanIf} # ip_input()
dyncmd "SStart" $ssys skipto ${DmzIn} ip from any to any in via ${DmzIf}
#dyncmd "SStart" $ssys skipto ${PppIn} ip from any to any in via ${PppIf}
dyncmd "SStart" $ssys skipto ${LanIn} ip from any to any in via ${LanIf}
dyncmd "SStart" $ssys skipto ${VpnIn} ip from any to any in via ${VpnIf}
dyncmd "SStart" $ssys skipto ${OvpnIn} ip from any to any in via ${OvpnIf}
dyncmd "SStart" $ssys skipto ${WanOut} ip from any to any out via ${WanIf} # ip_output()
dyncmd "SStart" $ssys skipto ${DmzOut} ip from any to any out via ${DmzIf}
#dyncmd "SStart" $ssys skipto ${PppOut} ip from any to any out via ${PppIf}
dyncmd "SStart" $ssys skipto ${LanOut} ip from any to any out via ${LanIf}
dyncmd "SStart" $ssys skipto ${VpnOut} ip from any to any out via ${VpnIf}
dyncmd "SStart" $ssys skipto ${OvpnOut} ip from any to any out via ${OvpnIf}
#-($WanIn) Трафик WAN входящий - in recv ${WanIf} ---------------------------#
deny_fnp_spoof # Защита от fingerprinting и antispoofing на входящем трафике WAN --#
dyncmd "WanIn" $swan fwd ${LoopIp},22 $l1 tcp from any to ${WanIp} "10122" in recv ${WanIf} $sl2 # Разрешение подключения по SSH(22) из интернета
dyncmd "WanIn" $swan fwd ${LanIp},21 $l1 tcp from any to ${WanIp} "10121" in recv ${WanIf} $sl2 # Разрешение подключения по FTP(21) из интернета
dyncmd "WanIn" $swan fwd ${LoopIp},1194 $l1 tcp from any to ${WanIp} "10194 " in recv ${WanIf} $sl2 # Разрешение подключения по OpenVPN(1194) из интернета
dyncmd "WanIn" $swan fwd 172.16.1.1,80 $l1 tcp from any to ${WanIp} "8080" in recv ${WanIf} $sl8 # Разрешение подключения по WWW(80) из интернета в зону DMZ
dyncmd "WanIn" $swan fwd 172.16.1.1,80 $l1 tcp from any to ${WanIp} "80" in recv ${WanIf} $sl8 # Разрешение подключения по W
dyncmd "WanIn" $swan allow $l1 icmp from any to ${WanIp} in recv ${WanIf} icmptypes "8" $ks # Разрешение входящих пингов (RFC 792 ICMP)
dyncmd "WanIn" $swan allow $l1 udp from any to ${WanIp} "10413" in recv ${WanIf} $ks # Разрешение torrent - Transmission
dyncmd "WanIn" $swan allow $l1 tcp from any to ${WanIp} "10413" in recv ${WanIf} $sks # Разрешение torrent - Transmission
#dyncmd "WanIn" $swan allow $l1 udp from any "67" to ${WanIp} "68" in recv ${WanIf} $ks # DHCP (UDP 77.37.166.92:68 77.37.128.2:67 out via rl0)
#dyncmd "WanIn" $swan allow $l1 ospf from any to any in recv ${WanIf} #
for i in `echo ${WanTcp}|sed 's/,/ /g'`; do # Разрешение подключений к серверу из интернета на разрешенные порты
dyncmd "WanIn" $swan allow $l1 tcp from any to ${WanIp} $i in recv ${WanIf} $sl7; done
#-($WanIn) NAT входящего трафика WAN - in recv ${WanIf} ----------------------#
dyncmd "WanIn" $snat nat 1 $l1 gre from any to ${WanIp} in recv ${WanIf} # compressed PPP data
natWanIn "$l1" "tcp" "192.168.1.10" "3389" "10389" "$sl2"
#-($WanOut) Трафик WAN исходящий - out xmit ${WanIf} -------------------------#
dyncmd "WanOut" $sfnp deny $l1 ip from any to any ${DenyPort} out xmit ${WanIf} # Запрет отправки в Интернет пакетов Netbios/Samba
dyncmd "WanOut" $swan allow $l1 udp from ${WanIp} "68" to any "67" out xmit ${WanIf} $ks # DHCP (UDP 77.37.166.92:68 77.37.128.2:67 out via rl0)
dyncmd "WanOut" $swan allow $l1 udp from ${WanIp} to any "53" out xmit ${WanIf} $ks # Разрешение DNS запросов 53-"domain"
#dyncmd "WanOut" $swan allow $l1 tcp from ${WanIp} to any "53" out xmit ${WanIf} $sks # Разрешение DNS запросов
dyncmd "WanOut" $swan allow $l1 udp from ${WanIp} to any "123" out xmit ${WanIf} $ks # Разрешение NTP запросов
dyncmd "WanOut" $swan allow $l1 udp from ${WanIp} "10413" to any out xmit ${WanIf} $ks # Разрешение torrent - Transmission
#dyncmd "WanOut" $sbug allow $l1 icmp from ${WanIp} to any out xmit ${WanIf} $ks # ОТЛАДКА. Разрешение серверу ходить в инет
#dyncmd "WanOut" $sbug allow $l1 udp from ${WanIp} to any out xmit ${WanIf} $ks # ОТЛАДКА. Разрешение серверу ходить в инет
#dyncmd "WanOut" $sbug allow $l1 tcp from ${WanIp} to any out xmit ${WanIf} $sks # ОТЛАДКА. Разрешение серверу ходить в инет
#-($WanOut) NAT исходящего трафика WAN - out xmit ${WanIf} -------------------------#
dyncmd "WanOut" $snat nat 1 $l1 gre from ${WanIp} to any out xmit ${WanIf} # compressed PPP data
#-($WanOut) Трафик WAN с локальной сети в интернет - out recv ${LanIf} xmit ${WanIf}#
#dyncmd "WanOut" $swan allow $l1 tcp from ${LanNet} to any "pptp" out recv ${LanIf} xmit ${WanIf} $sks # Разрешение VPN запросов Microsoft Point-to-Point Tunneling Protocol (PPTP)
#-($DmzIn) Трафик DMZ входящий - in recv ${DmzIf} ---------------------------#
#dyncmd "DmzIn" $sdmz nat 1 $l1 tcp from any "5999" to ${WanIp} in recv rl0 established # csup/cvsup
#dyncmd "DmzIn" $sdmz nat 1 $l1 tcp from any to ${WanIp} "6849152-65535" in recv rl0 established # fetch FTP passive
#dyncmd "DmzIn" $sbug allow $l1 icmp from any to ${DmzNet} in recv ${DmzIf} $ks # ОТЛАДКА. Разрешение серверу ходить в инет
#dyncmd "DmzIn" $sbug allow $l1 udp from any to ${DmzNet} in recv ${DmzIf} $ks # ОТЛАДКА. Разрешение серверу ходить в инет
#dyncmd "DmzIn" $sbug allow $l1 tcp from any to ${DmzNet} in recv ${DmzIf} $sks # ОТЛАДКА. Разрешение серверу
dyncmd "DmzIn" $sdmz allow $l1 tcp from any to 172.16.1.1 "80" in recv ${DmzIf} $sks # Разрешение подключений к WWW серверу
#-($DmzOut) Трафик DMZ исходящий - out xmit ${DmzIf} -------------------------#
dyncmd "DmzOut" $sdmz nat 1 $l1 icmp from ${DmzNet} to any out xmit ${DmzIf} icmptypes "0,8" $ks # Разрешение ping-ов из DMZ с
dyncmd "DmzOut" $sdmz allow $l1 icmp from ${DmzNet} to any out xmit ${DmzIf} icmptypes "0,8" # Разрешение ping-ов из DMZ сети
#dyncmd "DmzOut" $sbug allow $l1 udp from ${DmzNet} to any out xmit ${DmzIf} $ks # ОТЛАДКА. Разрешение серверу ходить в инет
#dyncmd "DmzOut" $sbug allow $l1 tcp from ${DmzNet} to any out xmit ${DmzIf} $sks # ОТЛАДКА. Разрешение серверу
dyncmd "DmzOut" $sdmz nat 1 $l1 tcp from 172.16.1.1 to any "21,80,443" out xmit ${WanIf} $sks # Разрешение серверу WWW подключаться на порты 21,80,443
dyncmd "DmzOut" $sdmz allow $l1 tcp from 172.16.1.1 "80" to any out xmit ${DmzIf} # Разрешение серверу WWW подключаться на порты 21,80,443
dyncmd "DmzOut" $sbug allow $l1 udp from ${LanIp} "53,123" to ${DmzNet} out xmit ${DmzIf} $ks # Разрешение DMZ сети обращаться к DNS и NTP
#-($DmzOut) Трафик DMZ с интернета в DMZ - out recv ${WanIf} xmit ${DmzIf} ---#
#-($PppIn) Трафик PPP входящий - in recv ${PppIf} ---------------------------#
#dyncmd "PppIn" $snat nat 2 $l1 ip from any to ${PppIp} in via ${PppIf}
#-($PppOut) Трафик PPP исходящий - out xmit ${PppIf} -------------------------#
#dyncmd "PppOut" $snat nat 2 $l1 ip from ${LanNet} to any out via ${PppIf}
#-($PppOut) Трафик PPP с интернета в PPP - out recv ${WanIf} xmit ${PppIf} ---#
#-($LanIn) Трафик LAN входящий - in recv ${LanIf} ---------------------------# #- Транзитный трафик из локалки в интернет будет преобразован роутером в out xmit ${WanIf} и уже в таком виде попадает в NAT
#dyncmd "LanIn" $sfnp deny $l1 ip from any to not ${LanIp} in recv ${LanIf} # Анти спуфинг - Запрет пакетов адресованных не серверу
#dyncmd "LanIn" $sfnp deny $l1 ip from ${WanNet} to any in recv ${LanIf} # Анти спуфинг - Запрет перекрестных пакетов
dyncmd "LanIn" $sfnp reset $l1 ip from ${LanNet} to any ${ResetPort} in recv ${LanIf} # Отвергать пакеты на данные порты с посылкой уведомлений
dyncmd "LanIn" $slan deny $l1 ip from "'table(2)'" to not ${LanIp} in recv ${LanIf} # Запрет доступа в internet заблокированным компьютерам локальной сети
dyncmd "LanIn" $slan allow $l1 udp from ${LanNet} "68" to ${LanIp} "67" in recv ${LanIf} $ks # DHCP (UDP 192.168.1.10:68 192.168.1.5:67 in via em0)
dyncmd "LanIn" $slan allow $l1 udp from ${LanNet} "68" to ${BCastNet} "67" in recv ${LanIf} # DHCP (UDP 192.168.1.10:68 255.255.255.255:67 in via em0)
dyncmd "LanIn" $slan allow $l1 udp from ${OwnNet} "68" to ${BCastNet} "67" in recv ${LanIf} # DHCP (UDP 0.0.0.0:68 255.255.255.255:67 in via em0)
dyncmd "LanIn" $slan allow $l1 udp from ${LanNet} to ${LanIp} "53" in recv ${LanIf} $ks # Разрешение запросов к DNS серверу
dyncmd "LanIn" $slan allow $l1 icmp from ${LanNet} to ${LanIp} in recv ${LanIf} icmptypes "0,3,4,8,11,12" $ks # Разрешение из локалки Ping-а к серверу
dyncmd "LanIn" $slan allow $l1 udp from ${LanNet} to ${LanIp} ${LanUdp} in recv ${LanIf} $ks # Разрешение входящих подключений к портам разрешенных сервисов сервера
dyncmd "LanIn" $slan allow $l1 tcp from ${LanNet} to ${LanIp} ${LanTcp} in recv ${LanIf} $sks # Разрешение входящих подключений к портам разрешенных сервисов сервера
#dyncmd "LanIn" $slan fwd {LoopIp},3128 $l1 tcp from ${LanNet} to not ${LanNet} "80,3128,8000,8001,8080,8081,443,21" in recv ${LanIf} $sks
#-($LanOut) Трафик LAN исходящий - out xmit ${LanIf} -------------------------#
dyncmd "LanOut" $sbug allow $l1 ip from me to any out xmit ${LanIf} $ks # ОТЛАДКА. Серверу выход на внутреннем интерфейсе
#-($LanOut) NAT трафика с ${LanNet} в интернет - out xmit ${LanIf} -----------#
natLanOut "$l1" "udp" "${LanNet}" "any" "${UsrUdp}" "$ks" # Разрешение локалке ходить в инет на разрешенные порты
natLanOut "$l1" "tcp" "${LanNet}" "any" "${UsrTcp}" "$sks" # Разрешение локалке ходить в инет на разрешенные порты
natLanOut "$l1" "icmp" "'table(3)'" "any" "" "$ks" # Разрешение админам пинговать хосты в интернете
natLanOut "$l1" "udp" "'table(3)'" "any" "${AdmUdp}" "$ks" # Разрешение админам ходить в инет на разрешенные админские UDP порты
natLanOut "$l1" "tcp" "'table(3)'" "any" "${AdmTcp}" "$sl2" # Разрешение админам ходить в инет на разрешенные админские TCP порты
#-($LanOut) Трафик LAN с интернета в локальную сеть - out recv ${WanIf} xmit ${LanIf}#
#dyncmd "LanOut" $sbug allow $l1 tcp from ${LanNet} to any out recv ${WanIf} xmit ${LanIf} $sks # ОТЛАДКА.
#-($VpnIn) Трафик VPN входящий - in recv ${VpnIf} ---------------------------#
#dyncmd "VpnIn" $svpn allow $l1 ip from any to any verrevpath via ${VpnIf} # ОТЛАДКА. Разрешение "все для всех" из VPN сети
dyncmd "VpnIn" $svpn allow $l1 ip from ${VpnNet} to ${LanNet} in recv ${VpnIf} $ks # Разрешение из VPN сети в локалку
#-($VpnOut) Трафик VPN исходящий - out xmit ${VpnIf} -------------------------#
#dyncmd "VpnOut" $svpn allow $l1 ip from ${LanNet} to ${VpnNet} out xmit ${VpnIf} # Разрешение из локалки в VPN сеть
#-($VpnOut) Трафик VPN с интернета на VPN - out recv ${WanIf} xmit ${VpnIf} --#
#-($OvpnIn) Трафик OVPN входящий - in recv ${OvpnIf} ------------------------#
dyncmd "OvpnOut" $sovpn allow $l1 ip from ${OvpnNet} to ${LanNet} in recv ${OvpnIf} $ks # Разрешение "все для всех" из VPN сети
#-($OvpnOut) Трафик OVPN исходящий - out xmit ${OvpnIf} ----------------------#
#dyncmd "OvpnOut" $sovpn allow $l1 ip from ${LanNet} to ${OvpnNet} out xmit ${OvpnIf} # ОТЛАДКА. Разрешение "все для всех" из VPN сети
#-($OvpnOut) Трафик OVPN с интернета на VPN - out recv ${WanIf} xmit ${VpnIf}-#
#dyncmd "SysEnd" $sbug allow $l1 ip from any to any # ОТЛАДКА. Разрешение "все для всех" из VPN сети
dyncmd "SysEnd" $sbug deny $l1 ip from any to any # ОТЛАДКА. Запрет "все для всех" из VPN сети
# ===============================================================
if [ "${1}" == "-temp" ]; then sleep 300; exec $0 '-mini'; fi # Запуск скрипта c опцией "-temp" - для отката на минимальный конфиг через 5 мин