Надеюсь это прояснит ситуацию:
Код: Выделить всё
#!/bin/sh
################################################################################
debug=0
################################################################################
ipfw="/sbin/ipfw -q"
################################################################################
${ipfw} flush
${ipfw} queue flush
${ipfw} pipe flush
${ipfw} nat flush
#${ipfw} table all flush
${ipfw} table 1 flush
${ipfw} table 2 flush
${ipfw} table 3 flush
${ipfw} table 4 flush
${ipfw} table 7 flush
${ipfw} zero
################################################################################
${ipfw} disable one_pass
#${ipfw} enable one_pass
################################################################################
####
ext_if="vlan2"
ext_if_ip="1.1.1.111"
ext_if_alias0="1.1.2.111"
ext_if_alias1="1.1.2.112"
ext_if_alias2="1.1.2.113"
ext_if_alias3="1.1.2.114"
####
ext_if_replacement=${ext_if_ip}
ext_if_alias0_replacement=${ext_if_alias0}
net_if="vlan2"
int_if="vlan10"
wlan_if="vlan20"
www_if="vlan10"
int_if_ip="192.168.50.1"
www_if_ip="192.168.50.11"
olan_ip="192.168.60.1"
####
int_if_replacement=${int_if_ip}
www_if_replacement=${www_if_ip}
####
# Внутренняя сеть
# Рабочая сеть
wlocalnet="192.168.50.0/22"
# Широковещательный адрес для локальной сети.
broadcast_ip_of_wlocalnet="192.168.51.255"
# Общая сеть
olocalnet="192.168.60.0/22"
# Широковещательный адрес общей сети.
broadcast_ip_of_olocalnet="192.168.61.255"
####
################################################################################
# NAT (проброс портов)
# Если на интерфейсе статический ip, то лучше указывать его.
# Для EXTERNAL-канала.
#${ipfw} nat 1 config log ip ${ext_if_alias0} reset same_ports
${ipfw} nat 1 config log ip ${ext_if_ip} reset same_ports \
redirect_port tcp ${www_if_ip}:${HTTP_PORT} ${HTTP_PORT} \
redirect_port tcp ${www_if_ip}:${HTTPS_PORT} ${HTTPS_PORT} \
redirect_port tcp ${www_if_ip}:${FTP_PORT_INTERNAL} ${FTP_PORT_EXTERNAL} \
redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_1} ${FTP_PASV_PORT_1} \
redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_2} ${FTP_PASV_PORT_2} \
redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_3} ${FTP_PASV_PORT_3} \
redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_4} ${FTP_PASV_PORT_4} \
redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_5} ${FTP_PASV_PORT_5} \
redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_6} ${FTP_PASV_PORT_6} \
redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_7} ${FTP_PASV_PORT_7} \
redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_8} ${FTP_PASV_PORT_8} \
redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_9} ${FTP_PASV_PORT_9} \
redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_10} ${FTP_PASV_PORT_10} \
redirect_port tcp ${www_if_ip}:${SSH_WWW_INT_PORT} ${SSH_WWW_EXT_PORT}
# NAT 20
#${ipfw} nat 2 config log ip $(ext_if_alias1) reset same_ports
################################################################################
# START: EXTERNAL канал #
# Входящий канал 0 -> pipe 30 - для "служебного" (важного) трафика.
# Правда вопрос: что считать важным трафиком? - Я думаю это: TCP FIN, TCP SYN, TCP RST, TCP PSH ... (нужно продолжить :)
# bw (bandwidth) - A value of 0 (default) means unlimited bandwidth.
# У нас локальная сеть с маской /22 - поэтому 0xfffffc00
${ipfw} pipe 30 config bw 0Kbit/s mask dst-ip 0xfffffc00
# Входящий канал 1 -> pipe 31 (для нас и vip)
${ipfw} pipe 31 config bw 45000Kbit/s queue 60 gred 0.002/54/60/0.1
# Входящий канал 2 -> pipe 32 (для остальных)
${ipfw} pipe 32 config bw 25000Kbit/s queue 40 gred 0.002/36/40/0.1
# Входящий канал 3 -> pipe 33 (для 192.168.51.0/24)
${ipfw} pipe 33 config bw 25000Kbit/s queue 26 gred 0.002/23/26/0.1
# Исходящий канал 0 -> pipe 40 - для "служебного" (важного) трафика.
# bw (bandwidth) - A value of 0 (default) means unlimited bandwidth.
# У нас локальная сеть с маской /22 - поэтому 0xfffffc00
${ipfw} pipe 40 config bw 0Kbit/s mask src-ip 0xfffffc00
# Исходящий канал 1 -> pipe 41 (для нас и vip)
${ipfw} pipe 41 config bw 32000Kbit/s queue 30 gred 0.002/27/30/0.1
# Исходящий канал 2 -> pipe 42 (для остальных)
${ipfw} pipe 42 config bw 10000Kbit/s queue 26 gred 0.002/23/26/0.1
# Исходящий канал 3 -> pipe 43 (для 192.168.51.0/24)
${ipfw} pipe 43 config bw 8000Kbit/s queue 26 gred 0.002/23/26/0.1
# STOP: EXTERNAL канал #
################################################################################
# Очереди на входящий канал 1 (pipe 31) -> 31x
${ipfw} queue 311 config pipe 31 weight 60 mask dst-ip 0xfffffc00
${ipfw} queue 312 config pipe 31 weight 35 mask dst-ip 0xfffffc00
# Очереди на входящий канал 2 (pipe 32) -> 32x
${ipfw} queue 321 config pipe 32 weight 30 mask dst-ip 0xfffffc00
${ipfw} queue 322 config pipe 32 weight 5 mask dst-ip 0xfffffc00
# Очереди на входящий канал 3 (pipe 33) -> 33x
${ipfw} queue 331 config pipe 33 weight 30 mask dst-ip 0xfffffc00
# Очереди на исходящий канал 1 (pipe 41) -> 41x
${ipfw} queue 411 config pipe 41 weight 60 mask src-ip 0xfffffc00
${ipfw} queue 412 config pipe 41 weight 35 mask src-ip 0xfffffc00
# Очереди на исходящий канал 2 (pipe 42) -> 42x
${ipfw} queue 421 config pipe 42 weight 30 mask src-ip 0xfffffc00
${ipfw} queue 422 config pipe 42 weight 5 mask src-ip 0xfffffc00
# Очереди на исходящий канал 3 (pipe 43) -> 43x
${ipfw} queue 431 config pipe 43 weight 30 mask src-ip 0xfffffc00
################################################################################
#${ipfw} add 11 set 1 allow ip4 from any to any via lo0
${ipfw} add 11 set 1 allow all from any to any via lo0
#${ipfw} add 12 set 1 deny ip4 from any to 127.0.0.0/8
${ipfw} add 12 set 1 deny all from any to 127.0.0.0/8
#${ipfw} add 13 set 1 deny ip4 from 127.0.0.0/8 to any
${ipfw} add 13 set 1 deny all from 127.0.0.0/8 to any
${ipfw} add 14 deny all from any to ::1
${ipfw} add 15 deny all from ::1 to any
###
# Запрещаем IPV6.
${ipfw} add 31 deny ip6 from any to any
###
${ipfw} add 51 set 1 deny log logamount 500 all from any to any frag
# Для перестраховки :)
${ipfw} add 71 set 1 allow ip4 from 191.168.50.31 to 192.168.50.1
${ipfw} add 72 set 1 allow ip4 from 192.168.50.1 to 192.168.50.31
# olan 20 begin
#${ipfw} add 91 set 1 allow ip4 from ${olan_ip} to any
${ipfw} add 91 set 1 allow ip4 from ${olan_ip} to ${olocalnet}
${ipfw} add 92 set 1 allow ip4 from ${olocalnet} to ${olan_ip}
################################################################################
# DENY
# deny bad ips
bad_ips="6.6.6.1, 6.6.6.2"
${ipfw} add 111 set 1 deny log logamount 1000 ip4 from any to ${bad_ips} in recv ${int_if_replacement}
${ipfw} add 112 set 2 deny log logamount 1000 ip4 from ${bad_ips} to any in recv ${int_if_replacement}
################################################################################
ext_ips="1.1.2.111, 1.1.2.112, 1.1.2.113, 1.1.2.114"
${ipfw} add 131 allow ip from any to $ext_ips
${ipfw} add 132 allow ip from $ext_ips to any
################################################################################
# set 2 - EXTERNAL-канал
# *** IN *** #
# Правила для сервера.
# start
# В pf: set skip on ${int_if}
# Для dhcp-клиентов.
${ipfw} add 151 set 1 allow udp from 0.0.0.0 68 to 255.255.255.255 67 in recv ${int_if_replacement}
# Для bsnmpd.
${ipfw} add 152 set 1 deny ip4 from any to any 161 in
${ipfw} add 153 set 1 allow ip4 from ${wlocalnet} to ${int_if_ip} in recv ${int_if_replacement}
${ipfw} add 154 set 1 allow ip4 from ${wlocalnet} to ${www_if_ip} in recv ${www_if_replacement}
${ipfw} add 156 set 1 fwd ${int_if_ip} ip4 from ${wlocalnet} to ${ext_if_ip} in recv ${int_if_replacement}
###
# Для www server-а!
# from any to ${ext_if_ip} in recv ${ext_if_replacement}
${ipfw} add 171 set 2 allow ip4 from any to ${www_if_ip} in recv ${ext_if_replacement}
# stop
################################################################################
# Пакеты на исход.
if [ ${debug} -eq 1 ]
then
printf "\n *** IN *** Пакеты на исход."
fi
# Разрешаем внутренний трафик из сети провайдера
provider="10.100.100.0/24, 10.100.200.0/24, 10.100.210.0/24"
${ipfw} add 192 set 1 allow ip4 from any to $provider in recv ${int_if_replacement}
# Для шейпа.
${ipfw} add 211 set 1 deny ip4 from any to ${broadcast_ip_of_wlocalnet} in recv ${int_if_replacement}
${ipfw} add 212 set 1 deny ip4 from any to 255.255.255.255 in recv ${int_if_replacement}
RFC1918="192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8"
#RFC1918="192.168.0.0/16, 172.16.0.0/12"
${ipfw} add 213 set 1 deny log logamount 1000 ip4 from any to ${RFC1918} in recv ${int_if_replacement}
${ipfw} add 214 set 2 skipto 1000 ip4 from table\(7\) to any in recv ${int_if_replacement}
################################################################################
# Пакеты на вход.
if [ ${debug} -eq 1 ]
then
printf "\n *** IN *** Пакеты на вход."
fi
# Для EXTERNAL-интерфейса (NAT).
${ipfw} add 231 set 2 skipto 2000 ip4 from any to ${ext_if_ip} in recv ${ext_if_replacement}
# Запрещаем то, что не разрешено явно!
if [ ${debug} -eq 1 ]
then
printf "\n *** IN *** Запрещаем то, что не разрешено явно!"
fi
${ipfw} add 495 set 1 deny log logamount 1000 ip4 from any to any in
################################################################################
# *** OUT *** #
# Правила для сервера.
# start
if [ ${debug} -eq 1 ]
then
printf "\n *** OUT *** Правила для сервера."
fi
${ipfw} add 511 set 1 allow ip4 from ${int_if_ip} to ${wlocalnet} out xmit ${int_if_replacement}
# <!-- po idee mogno ubrat -->
${ipfw} add 512 set 1 allow ip4 from ${www_if_ip} to ${wlocalnet} out xmit ${www_if_replacement}
${ipfw} add 513 set 1 allow ip4 from ${ext_if_ip} to ${wlocalnet} out xmit ${int_if_replacement}
# stop
# Пакеты, возвращающиеся обратно к lan с EXTERNAL-интерфейса.
if [ ${debug} -eq 1 ]
then
printf "\n *** OUT *** Пакеты, возвращающиеся обратно к lan с EXTERNAL-интерфейса."
fi
# Для шейпа.
${ipfw} add 541 set 2 skipto 5000 ip4 from any to table\(7\) out xmit ${int_if_replacement} recv ${ext_if_replacement}
# Пакеты на исход.
if [ ${debug} -eq 1 ]
then
printf "\n *** OUT *** Пакеты на исход."
fi
${ipfw} add 711 set 2 skipto 7000 ip4 from any to any out xmit ${ext_if_replacement} recv ${int_if_replacement}
################################################################################
# Правила для сервера.
# Нужно будет указать явно какие пакеты разрешены, а всё остальное отбрасывать!
# Точнее, то что уходит от _сервера_ (через внешние интерфейсы) - пускай уходит,
# а нужно "рубать" на внутренних интерфейсах.
# start
if [ ${debug} -eq 1 ]
then
printf "\n *** OUT *** Правила для сервера."
fi
# Для www server-а!
${ipfw} add 911 set 2 allow ip4 from ${www_if_ip} to any src-port ${SSH_WWW_INT_PORT} out xmit ${ext_if_replacement}
${ipfw} add 912 set 2 nat 1 ip4 from ${www_if_ip} to any out xmit ${ext_if_replacement}
${ipfw} add 931 set 2 allow ip4 from ${ext_if_ip} to any out xmit ${ext_if_replacement}
# stop
################################################################################
# Запрещаем то, что не разрешено явно!
if [ ${debug} -eq 1 ]
then
printf "\n *** OUT *** Запрещаем то, что не разрешено явно!"
fi
${ipfw} add 991 set 1 deny log logamount 1000 ip4 from any to any out
# in recv ${int_if_replacement}
# Все DNS-запросы должны обслуживаться _локальным_ DNS-сервером, а то, к примеру, некоторые вирусы могут
# подменить DNS-сервер на свой. Хотя они обычно правят файл hosts :) (C:\Windows\System32\drivers\etc\hosts)
#${ipfw} add 1011 set 1 allow ip4 from ${ext_if_ip} to any dst-port 53
${ipfw} add 1011 set 1 allow ip4 from me to any dst-port 53
#${ipfw} add 1012 set 1 allow ip4 from any 53 to ${ext_if_ip}
${ipfw} add 1012 set 1 allow ip4 from any 53 to me
${ipfw} add 1021 set 1 deny log logamount 1000 ip4 from any to any dst-port 53
# Те же рассуждения касаются и 25 TCP-порта (SMTP)
# http://mostlygeek.com/tech/smtp-on-port-587/
mail_allowed_ips="192.168.50.11, 1.1.2.111, 1.1.2.112, 1.1.2.113, 1.1.2.114"
${ipfw} add 1042 set 1 allow ip4 from $mail_allowed_ips to any dst-port ${ALL_SMTP}
${ipfw} add 1043 set 1 deny log logamount 10000 ip4 from any to any dst-port ${SMTP_PORT}
${ipfw} add 1044 set 1 deny log logamount 10000 ip4 from any to any dst-port ${SMTPS_PORT}
${ipfw} add 1045 set 1 deny log logamount 10000 ip4 from any to any dst-port ${SMTP_SUBMISSION_PORT}
################################################################################
# !!! Следующее правило для того, чтобы те, кто явно не перечислен (кто не в базе), не вышли в интернет. !!!
if [ ${debug} -eq 1 ]
then
printf "\n *** OUT *** Следующее правило для того, чтобы те, кто явно не перечислен (кто не в базе), не вышли в интернет."
fi
${ipfw} add 1071 set 2 deny log logamount 500 ip4 from not table\(7\) to any
# и + запрещаем выход тем, кто в таблице 6 !!!
if [ ${debug} -eq 1 ]
then
printf "\n *** OUT *** и + запрещаем выход тем, кто в таблице 6 !!!"
fi
${ipfw} add 1091 set 2 deny log logamount 500 ip4 from table\(6\) to any
###
#${ipfw} add 1210 set 2 pipe 40 ip4 from any to any { tcpflags syn or tcpflags fin or tcpflags rst or tcpflags psh }
${ipfw} add 1230 set 2 queue 411 ip4 from table\(1\) to any
${ipfw} add 1240 set 2 queue 412 ip4 from table\(2\) to any
${ipfw} add 1250 set 2 queue 421 ip4 from table\(3\) to any
${ipfw} add 1260 set 2 queue 422 ip4 from table\(4\) to any
${ipfw} add 1265 set 2 queue 431 ip4 from 192.168.51.0/24 to any
###${ipfw} add 1270 set 2 netgraph 100 ip4 from any to any
${ipfw} add 1290 set 2 allow ip4 from any to any
###
# in recv ${ext_if_replacement}
# NAT
${ipfw} add 2011 set 2 nat 1 ip4 from any to any
${ipfw} add 2091 set 2 allow ip4 from any to any
# out xmit ${int_if_replacement} recv ${ext_if_replacement}
#${ipfw} add 5011 set 2 pipe 30 ip4 from any to any { tcpflags syn or tcpflags fin or tcpflags rst or tcpflags psh }
${ipfw} add 5031 set 2 queue 311 ip4 from any to table\(1\)
${ipfw} add 5041 set 2 queue 312 ip4 from any to table\(2\)
${ipfw} add 5051 set 2 queue 321 ip4 from any to table\(3\)
${ipfw} add 5061 set 2 queue 322 ip4 from any to table\(4\)
${ipfw} add 5071 set 2 queue 331 ip4 from any to 192.168.51.0/24
#${ipfw} add 5081 set 2 netgraph 100 ip4 from any to any
${ipfw} add 5111 set 2 allow ip4 from any to any
###
# out xmit ${ext_if_replacement} recv ${int_if_replacement}
# NAT
${ipfw} add 7011 set 2 nat 1 ip4 from any to any
${ipfw} add 7111 set 2 allow ip4 from any to any
################################################################################
# Запрещаем то, что не разрешено явно!
${ipfw} add 60000 set 1 deny log logamount 1000 ip4 from any to any
if [ ${debug} -eq 1 ]
then
printf "\n\nFinish :)\n\n"
fi
################################################################################
Поэтому в приведенном конфиге есть некоторые остатки.