Страница 1 из 2
ipfw + ipfw nat
Добавлено: 2009-02-26 9:20:21
CrazyPilot
Здравствуйте!
Имеется:
Код: Выделить всё
[root@gw ~]# uname -a
FreeBSD gw.somedomain.tld 7.0-RELEASE-p5 FreeBSD 7.0-RELEASE-p5 #0: Wed Dec 3 10:33:44 MSK 2008 root@gw.somedomain.tld:/usr/obj/usr/src/sys/GWSPB-2008-12-03 i386
Не могу разобраться с ipfw nat на серваке. Проблема в том, что ipfw nat весело пускает на сервак абсолютно все, если ему не сказать deny_in. Если поставить deny_in - в таком случае, если правила ната расположены в начале списка правил ipfw - firewall начинает блокировать все. Если правила ната опустить в конец списка правил - наблюдаются странные глюки. В моем случае это тормоза непонятные при серфинге нета через нат и еще нат отказывается пропускать vpn на pptp с внутренней сетки наружу. Я думал что это происходит из-за того, что gre пакеты с удаленного pptp сервака приходят на мой gw и не попадают в nat, так как прописаны правила для mpd. Попробовал для конкретного удаленного ip прописать skipto до правил ната - толку ноль. У меня так и не получилось заставить все это работать. Прошу помочь с настройкой файрвола, указать что у меня неверно настроено и т.д. Буду благодарен за любую помощь.
Вообще, мне бы хотелось услышать ваши советы по составлению конфига фаера, как сделать. Сначала что-то разрешать, потом нат, потом deny all? Или как-то иначе... Приведу скрипт, который работает на данный момент на серваке. При этом существует проблема, что нат пускает все.
У меня на серваке 2 канала в инет. Из внешних доступных сервисов: почтовик, ftp, openvpn (2 и один старый), ну и mpd5.
P.S. Простите за поток сознания, болею я...
Код: Выделить всё
#!/bin/sh
ipfw='/sbin/ipfw -q'
#out_if="em1"
#out_mask="255.255.255.252"
#out_ip="xxx.xxx.xxx.xxx"
out_if="em2"
out_mask="255.255.255.252"
out_ip="yyy.yyy.yyy.yyy"
in_if="em0"
in_net="10.10.1.0"
in_mask="255.255.0.0"
in_ip="10.10.1.1"
mpd_vpn="ng*"
vpn="tun0"
vpn_chel="tun3"
boss1="10.10.1.30/32"
boss2="10.10.1.31/32"
sklad_dc="10.10.2.30"
flanker="10.10.1.61/32"
S0000="10.10.1.10/32"
S0070="10.10.1.101/32"
S0070_bank_client="5080,465,110,25"
S0070_uralsib="995,465"
S0095="10.10.1.102/32"
S0095_pressol="9005"
S0050="10.10.1.103/32"
S0050_ports="110,25,1723"
S0050_out_peer="213.182.169.11"
S0068="10.10.1.104/32"
ts1="10.10.1.70/32"
ts2="10.10.1.71/32"
ts3="10.10.1.72/32"
buhg1="10.10.1.51/32"
spb_net="10.10.1.0/24"
spb_whnet="10.10.2.0/24"
${ipfw} flush
${ipfw} add 100 check-state
# Deny access to unrouteable networks
${ipfw} add 200 reject all from any to 10.0.0.0/8 in via ${out_if}
${ipfw} add 300 reject all from any to 172.16.0.0/12 in via ${out_if}
${ipfw} add 400 reject all from any to 192.168.0.0/16 in via ${out_if}
${ipfw} add 500 reject all from any to 0.0.0.0/8 in via ${out_if}
${ipfw} add 600 reject all from any to 169.254.0.0/16 in via ${out_if}
# Multicast
${ipfw} add 700 reject all from any to 224.0.0.0/4 in via ${out_if}
${ipfw} add 800 reject all from any to 240.0.0.0/4 in via ${out_if}
# Deny access from unrouteable networks
${ipfw} add 900 reject all from 10.0.0.0/8 to any in via ${out_if}
${ipfw} add 1000 reject all from 172.16.0.0/12 to any in via ${out_if}
${ipfw} add 1100 reject all from 192.168.0.0/16 to any in via ${out_if}
${ipfw} add 1200 reject all from 0.0.0.0/8 to any in via ${out_if}
${ipfw} add 1300 reject all from 169.254.0.0/16 to any in via ${out_if}
# Multicast
${ipfw} add 1400 reject all from 224.0.0.0/4 to any in via ${out_if}
${ipfw} add 1500 reject all from 240.0.0.0/4 to any in via ${out_if}
# ICMP
${ipfw} add 1600 deny icmp from any to any frag
${ipfw} add 1700 deny icmp from any to any in icmptype 5,9,13,14,15,16,17
#${ipfw} add allow all from any to any
# Правило для сбора статистики
${ipfw} add 1800 tee 10000 all from me to any out via ${out_if}
${ipfw} add 1900 tee 10000 all from any to me in via ${out_if}
# Разрешим весь трафик через локальный интерфейс (для работы системы)
${ipfw} add 2000 allow all from any to any via lo0
#################################################################
# #
# NAT configuration #
# #
#################################################################
# NAT
${ipfw} nat 111 config ip ${out_ip} reset same_ports unreg_only
# Special users (-:
${ipfw} add 2100 nat 111 all from $S0000 to any out via ${out_if}
${ipfw} add 2200 nat 111 all from 10.10.1.211/32 to any out via ${out_if}
# All from flanker
${ipfw} add 2300 nat 111 ip from $flanker to any out via ${out_if}
# ICMP for internal users
${ipfw} add 2400 nat 111 icmp from 10.10.0.0/16 to any out via ${out_if}
# DNS for domain controllers (tcp and udp)
${ipfw} add 2500 nat 111 log udp from $boss1 to any 53 out via ${out_if}
${ipfw} add 2600 nat 111 log tcp from $boss1 to any 53 out via ${out_if}
${ipfw} add 2700 nat 111 log udp from $boss2 to any 53 out via ${out_if}
${ipfw} add 2800 nat 111 log tcp from $boss2 to any 53 out via ${out_if}
${ipfw} add 2900 nat 111 log udp from $sklad_dc to any 53 out via ${out_if}
${ipfw} add 3000 nat 111 log tcp from $sklad_dc to any 53 out via ${out_if}
# Исключения, nat определенных портов и ip для пользовательских программ
# For pressol web site working (Some work for pressol from S0095)
${ipfw} add 3100 nat 111 all from $S0095 to any $S0095_pressol out via ${out_if}
# VTB Rostov bank-client
${ipfw} add 3200 nat 111 tcp from $S0070 to 195.151.17.7 25 out via ${out_if}
${ipfw} add 3300 nat 111 tcp from $S0070 to 195.151.17.2 110 out via ${out_if}
# SMTP.DBO.VTB.RU
${ipfw} add 3400 nat 111 tcp from $S0070 to 193.164.146.13 25 out via ${out_if}
${ipfw} add 3500 nat 111 tcp from $S0070 to 193.164.146.13 110 out via ${out_if}
# For bank client work (Bank client's on s0070.somedomain.tld)
${ipfw} add 3600 nat 111 tcp from $S0070 to any $S0070_bank_client out via ${out_if}
${ipfw} add 3700 nat 111 tcp from $S0070 to 217.195.66.228 $S0070_uralsib out via ${out_if}
# For some stuff from s0050
${ipfw} add 3800 nat 111 log logamount 0 gre from $S0050 to 213.182.169.11 out via ${out_if}
${ipfw} add 3900 nat 111 log logamount 0 tcp from $S0050 to 213.182.169.11 $S0050_ports out via ${out_if}
# Трафик из инета в обратную сторону - надо же как-то его отдавать.
${ipfw} add 4000 nat 111 ip from any to ${out_ip} in via ${out_if}
################### NAT HAPPY END ###################
# temp test
${ipfw} add 4010 deny log logamount 0 all from 77.236.252.198 to ${out_ip} 20,21 in via ${out_if}
# FTP for somepublichost.somedomain.tld
${ipfw} add 4100 allow tcp from any to ${out_ip} 20,21 in via ${out_if}
${ipfw} add 4200 allow tcp from ${out_ip} 20,21 to any out via ${out_if}
# OpenVPN
${ipfw} add 4300 allow all from any to any via ${vpn}
${ipfw} add 4400 allow udp from any to ${out_ip} 1194 in via ${out_if}
${ipfw} add 4500 allow udp from ${out_ip} 1194 to any out via ${out_if}
# VPN Челябинск
${ipfw} add 4600 allow ip from any to any via ${vpn_chel}
${ipfw} add 4700 allow all from any to any 5003
# For mpd
${ipfw} add 4800 allow tcp from any to any via ${mpd_vpn}
${ipfw} add 4900 allow icmp from any to any via ${mpd_vpn}
${ipfw} add 5000 allow log logamount 0 gre from ${out_ip} to any keep-state out via ${out_if}
${ipfw} add 5100 allow log logamount 0 tcp from any to ${out_ip} 1723 keep-state in via ${out_if}
# Forward ftp from users to frox
${ipfw} add 5200 fwd 10.10.1.1,2121 tcp from $ts1 to any 21 out via ${out_if}
${ipfw} add 5300 fwd 10.10.1.1,2121 tcp from $ts2 to any 21 out via ${out_if}
${ipfw} add 5400 fwd 10.10.1.1,2121 tcp from $ts3 to any 21 out via ${out_if}
${ipfw} add 5500 fwd 10.10.1.1,2121 tcp from $buhg1 to any 21 out via ${out_if}
# Для доступа сервера в интернет
${ipfw} add 5600 allow tcp from me to any keep-state out via ${out_if}
${ipfw} add 5700 allow icmp from me to any keep-state out via ${out_if}
# DNS
${ipfw} add 5900 allow udp from me to any 53 out via ${out_if}
${ipfw} add 6000 allow udp from any 53 to me in via ${out_if}
${ipfw} add 6100 allow tcp from me to any 53 out via ${out_if}
${ipfw} add 6200 allow tcp from any 53 to me in via ${out_if}
# NTP
${ipfw} add 6300 allow udp from me 123 to any 123 out via ${out_if}
${ipfw} add 6400 allow udp from any 123 to ${out_ip} 123 in via ${out_if}
# SMTP on em2
${ipfw} add 6500 allow tcp from any to ${out_ip} 25 in via ${out_if}
${ipfw} add 6600 allow tcp from ${out_ip} to any 25 out via ${out_if}
# SMTP on em1
${ipfw} add 6700 fwd 81.3.179.221 all from xxx.xxx.xxx.xxx to any
${ipfw} add 6800 allow tcp from any to xxx.xxx.xxx.xxx 25 in via em1
${ipfw} add 6900 allow tcp from xxx.xxx.xxx.xxx to any 25
# SMTP from flanker and no other via em0
${ipfw} add 7000 allow tcp from $flanker to me 25 in via em0
${ipfw} add 7100 allow tcp from me to $flanker 25 out via em0
${ipfw} add 7200 deny tcp from any to me 25 in via em0
# SSH
${ipfw} add 7300 allow tcp from any to me 5222 setup keep-state
# Saint-Petersburgh warehouse
${ipfw} add 7400 allow all from ${spb_net} to ${spb_whnet} out via em3
${ipfw} add 7500 allow all from ${spb_whnet} to ${spb_net} in via em3
# LAN
${ipfw} add 7600 allow ip from ${spb_net} to any via ${in_if}
${ipfw} add 7700 allow ip from any to ${spb_net} via ${in_if}
# ICMP
${ipfw} add 7800 allow icmp from any to any via ${in_if}
# Deny all another
${ipfw} add 7900 deny log logamount 10000 ip from any to any
Re: ipfw + ipfw nat
Добавлено: 2009-02-26 12:49:00
zingel
сначала нужно нат с номерами + allow gre from any to any,
болею я...

чтобы не болеть внимательно прочитайте
http://www.lissyara.su/?id=1127
Re: ipfw + ipfw nat
Добавлено: 2009-02-26 12:55:36
CrazyPilot
zingel писал(а):сначала нужно нат с номерами + allow gre from any to any,
болею я...

чтобы не болеть внимательно прочитайте
http://www.lissyara.su/?id=1127
Эээ, читал и не раз. Болею собственно по-настоящему
Насчет сначала нат - потом деньги. Вы имеете ввиду скрипт добавления правил? То есть сначала я прописываю нат, дальше все что мне захочется? А как быть с deny_in?
Re: ipfw + ipfw nat
Добавлено: 2009-02-26 14:31:07
zingel
ну я тоже болею, но нат нужно всегда вначале и gre тоже, это как *не убий*
Re: ipfw + ipfw nat
Добавлено: 2009-02-26 14:45:34
paradox
были ж статьи на опен нете и еще где то
где расписано как проходит пакет по ipfw
не понимая этого
пысать правила фаервола всеравно что гадать на цветочке
Re: ipfw + ipfw nat
Добавлено: 2009-02-26 14:53:58
CrazyPilot
Если поставить нат в начале списка правил, то ipfw nat по one_pass и без deny_in, насколько я понял, не найдя подходящей пары в своей таблице принимает пакет на внешний интерфейс и возвращает обратно в файрволл, но так как стоит one_pass то, пакет не пойдет дальше по файрволлу, где в конце указано deny, а сразу будет применено allow, что создаёт дырку в файрволле. Если же поставить deny_in, то нат в начале списка правил будет убивать весь входящий трафик. Может конечно мой больной моск что-то не так понимает, но именно это я просил разъяснить...
млиа, я понимаю как проходит пакет по ipfw, и статью сложные случаи уже почти наизусть помню...ладно, тема видать бесполезна...
спасибо.
Re: ipfw + ipfw nat
Добавлено: 2009-02-26 15:02:52
zingel
гадать можно сколько угодно, я бы использовал tcpdump. чтобы быть увереным, за 1 минуту понять твою маршрутизацию это не очень просто, погрепай пока пакеты, а я подумаю.
Re: ipfw + ipfw nat
Добавлено: 2009-02-26 15:22:59
CrazyPilot
Ладно, остается только и правда tcpdump и ковыряние логов. Только вот не поиграешься особо в рабочее время на шлюзовой машине...
Re: ipfw + ipfw nat
Добавлено: 2009-03-23 10:47:19
CrazyPilot
Написал я таки скрипт для фаера. Вроде все работает. Конфиг конечно аццкий получился, но после внимательного чтения мана и статьи про сложные случаи прохождение трафика в ipfw (читал до опупения) (
http://nuclight.livejournal.com/124348.html). В итоге пришлось отказаться от one_pass=1 и разрешать нату все входящие подключения, но ставить его первым правилом для трафика, входящего с WAN, а дальше уже раскидывать пакеты. Может кому и поможет, но я не гарантирую что в данном конфиге нет косяков и т.д.
Конфиг перегружен чересчур, но у меня нет кошки, чтобы все было красиво. В итоге на шлюзе два внешних интерфейса и два внутренних, плюс два openvpn интерфейса, плюс mpd интерфейсы.
Код: Выделить всё
#!/bin/sh
ipfw='/sbin/ipfw -q '
# Interfaces
# Link to local spb network
int0_if="em0"
int0_ip="10.10.1.1/32"
# Link to spb warehouse
int1_if="em3"
int1_ip="10.10.2.1/32"
# Link to internet from Severen
ext0_if="em2"
ext0_ip="xxx.xxx.xxx.xxx"
# Link to internet from Peterstar
ext1_if="em1"
ext1_ip="yyy.yyy.yyy.yyy"
ext1_gw="yyy.yyy.yyy.zzz"
# OpenVPN2 interface
vpn_if="tun0"
# Old openvpn for chelyabinsk
vpn_chel="tun3"
# MPD vpn interfaces
vpn_mpd='ng*'
# Table names
tRFC1918="0"
tGateways="1"
tVPN_networks="2"
tAll_lan="3"
tFTP_access="4"
# ipfw nat 111 delete
${ipfw} flush
${ipfw} table $tRFC1918 flush # Private networks
${ipfw} table $tGateways flush # Our gateways
${ipfw} table $tVPN_networks flush # Affiliates and vpn service networks
${ipfw} table $tAll_lan flush # All real client's LAN's
${ipfw} table $tFTP_access flush # Hosts that need to have ftp fproxy
# Table "zero" - RFC 1918 private networks
${ipfw} table $tRFC1918 add 10.0.0.0/8
${ipfw} table $tRFC1918 add 172.16.0.0/12
${ipfw} table $tRFC1918 add 192.168.0.0/16
# MS autoconfigured network
${ipfw} table $tRFC1918 add 169.254.0.0/16
# Our gateways
${ipfw} table $tGateways add 87.241.230.xxx # RST
${ipfw} table $tGateways add 195.68.133.xxx # MSK
${ipfw} table $tGateways add 77.236.252.xxx # MSK WAREHOUSE
${ipfw} table $tGateways add 82.147.124.xxx # CHEL
# Affiliates and vpn service networks
${ipfw} table $tVPN_networks add 10.10.4.0/24
${ipfw} table $tVPN_networks add 10.10.5.0/24
${ipfw} table $tVPN_networks add 10.10.6.0/24
${ipfw} table $tVPN_networks add 10.10.7.0/24
${ipfw} table $tVPN_networks add 10.10.20.0/24
# All real client's LAN's
${ipfw} table $tAll_lan add 10.10.1.0/24
${ipfw} table $tAll_lan add 10.10.2.0/24
${ipfw} table $tAll_lan add 10.10.4.0/24
${ipfw} table $tAll_lan add 10.10.5.0/24
${ipfw} table $tAll_lan add 10.10.6.0/24
${ipfw} table $tAll_lan add 10.10.7.0/24
# Hosts, that need to have access to ftp proxy (frox)
${ipfw} table $tFTP_access add 10.10.1.70/32 # TS1
${ipfw} table $tFTP_access add 10.10.1.71/32 # TS2
${ipfw} table $tFTP_access add 10.10.1.72/32 # TS3
${ipfw} table $tFTP_access add 10.10.1.51/32 # BUHG1
# Domain controllers
dc_boss1="10.10.1.30/32"
dc_boss2="10.10.1.31/32"
dc_spbwh="10.10.2.30/32"
# Networks definition
spb_net="10.10.1.0/24"
spbwh_net="10.10.2.0/24"
msk_net="10.10.4.0/24"
mskwh_net="10.10.7.0/24"
chel_net="10.10.5.0/24"
rst_net="10.10.6.0/24"
vpn_srv_net="10.10.20.0/24"
# Special hosts definition
flanker="10.10.1.61/32" # Mail srv (allow smtp to me)
s0000="10.10.1.10/32" # (allow all)
s0021="10.10.1.211/32" # (allow all)
s0050="10.10.1.103/32" # Nalogovaya (PPTP calls) + pop + smtp
s0070="10.10.1.101/32" # Bank client UralSib: pop smtp 465/tcp 995/tcp 5080/tcp
s0095="10.10.1.102/32" # Pressol access 9005/tcp
s0050_ports="110,25"
s0070_ports="110,25,465,995,5080"
s0095_ports="9005"
${ipfw} disable one_pass
${ipfw} add 100 check-state
# Localhost
${ipfw} add 200 allow ip from any to any via lo0
${ipfw} add 250 allow tcp from any to ${ext0_ip} 5222 keep-state in via ${ext0_if}
# Divide the traffic from multiple interfaces and directions
# Traffic from local spb network
${ipfw} add 310 skipto 1000 ip from any to any in recv ${int0_if}
# Traffic to local spb network
${ipfw} add 320 skipto 4000 ip from any to any out xmit ${int0_if}
# Traffic from spb warehouse network
${ipfw} add 330 skipto 7000 ip from any to any in recv ${int1_if}
# Traffic to spb warehouse network
${ipfw} add 340 skipto 10000 ip from any to any out xmit ${int1_if}
# Traffic from internet (main channel)
${ipfw} add 350 skipto 13000 ip from any to any in recv ${ext0_if}
# Traffic to internet (main channel)
${ipfw} add 360 skipto 16000 ip from any to any out xmit ${ext0_if}
# Traffic from internet (backup channel)
${ipfw} add 370 skipto 19000 ip from any to any in recv ${ext1_if}
# Traffic to internet (backup channel)
${ipfw} add 380 skipto 21000 ip from any to any out xmit ${ext1_if}
# Traffic from affiliates through vpn
${ipfw} add 390 skipto 24000 ip from any to any in recv ${vpn_if}
# Traffic to affiliates through vpn
${ipfw} add 400 skipto 27000 ip from any to any out xmit ${vpn_if}
# Traffic from chelyabinsk through vpn (deprecated)
${ipfw} add 410 skipto 30000 ip from any to any in recv ${vpn_chel}
# Traffic to chelyabinsk through vpn (deprecated)
${ipfw} add 420 skipto 33000 ip from any to any out xmit ${vpn_chel}
# Traffic from vpn (PPTP MPD)
${ipfw} add 430 skipto 36000 ip from any to any in recv ${vpn_mpd}
# Traffic to vpn (PPTP VPN)
${ipfw} add 440 skipto 39000 ip from any to any out xmit ${vpn_mpd}
${ipfw} add 450 deny log logamount 10000 ip from any to any
# NAT Configuration
# NAT on interface em2
${ipfw} nat 111 config ip ${ext0_ip} log reset unreg_only
# ---------------------------------------------------------#
# ---- Traffic from local spb network (in recv int0_if) ----
# ---------------------------------------------------------#
# Allow only flanker connect to exim and no one other
${ipfw} add 1000 allow tcp from ${flanker} to me 25
${ipfw} add deny log logamount 10000 tcp from any to me 25
# Allow traffic to LAN's
${ipfw} add allow ip from ${spb_net} to ${spb_net}
${ipfw} add allow ip from ${spb_net} to ${spbwh_net}
${ipfw} add allow ip from ${spb_net} to ${msk_net}
${ipfw} add allow ip from ${spb_net} to ${mskwh_net}
${ipfw} add allow ip from ${spb_net} to ${chel_net}
${ipfw} add allow ip from ${spb_net} to ${rst_net}
# Forward request to ftp sites to ftp proxy
${ipfw} add fwd 10.10.1.1,2121 tcp from table\($tFTP_access\) to any 21
# NAT and others (Allow all, Traffic that we don't need we will deny at out xmit ext0_if)
${ipfw} add allow ip from ${s0000} to any
${ipfw} add allow ip from ${s0021} to any
${ipfw} add allow ip from ${s0050} to any
${ipfw} add allow ip from ${s0070} to any
${ipfw} add allow ip from ${s0095} to any
# TEMP ######
${ipfw} add allow ip from 10.10.1.203/32 to any
# Volkov
${ipfw} add allow ip from 10.10.1.199/32 to any
# Kotovich
${ipfw} add allow ip from 10.10.1.192/32 to any
${ipfw} add allow ip from ${dc_boss1} to any
${ipfw} add allow ip from ${dc_boss2} to any
${ipfw} add allow ip from ${dc_spbwh} to any
${ipfw} add allow ip from ${flanker} to any
# Default rule for traffic from local spb network
${ipfw} add 3999 deny log logamount 10000 all from any to any
# ---------------------------------------------------------#
# ---- Traffic to local spb network (out xmit int0_if) ----
# ---------------------------------------------------------#
# Allow traffic from LAN's
${ipfw} add 4000 allow ip from ${spbwh_net} to ${spb_net}
${ipfw} add allow ip from ${spb_net} to ${spb_net}
${ipfw} add allow ip from ${msk_net} to ${spb_net}
${ipfw} add allow ip from ${mskwh_net} to ${spb_net}
${ipfw} add allow ip from ${chel_net} to ${spb_net}
${ipfw} add allow ip from ${rst_net} to ${spb_net}
# Traffic from internet
${ipfw} add allow ip from any to ${spb_net}
# Default rule for traffic from any to local spb network
${ipfw} add 6999 deny log logamount 10000 ip from any to ${spb_net}
# -------------------------------------------------------------#
# ---- Traffic from spb warehouse network (in recv int1_if) ----
# -------------------------------------------------------------#
# Allow traffic to spb local network only
${ipfw} add 7000 allow ip from ${spbwh_net} to ${spb_net}
# Default deny all another
${ipfw} add 9999 deny log logamount 10000 ip from any to any
# -------------------------------------------------------------#
# ---- Traffic to spb warehouse network (out xmit int1_if) ----
# -------------------------------------------------------------#
${ipfw} add 10000 allow ip from ${spb_net} to ${spbwh_net}
# Default deny all another
${ipfw} add 12999 deny log logamount 10000 ip from any to any
# ---------------------------------------------------------------#
# ---- Traffic from internet (main channel) (in recv ext0_if) ----
# ---------------------------------------------------------------#
# Deny from RFC 1918 networks
${ipfw} add 13000 deny ip from table\($tRFC1918\) to ${ext0_ip}
# Pass all trafic to NAT instance. Not NAT traffic will leave from NAT without modification.
# NAT traffic will leave from NAT with LAN dst ip.
${ipfw} add nat 111 ip from any to ${ext0_ip}
# Traffic from NAT to local net.
${ipfw} add allow ip from any to ${spb_net}
# ICMP 0 - echo reply, 8 - echo request, 11 - TTL exceeded
${ipfw} add allow icmp from any to ${ext0_ip} icmptypes 0,8,11
# FTP
# Active FTP
${ipfw} add allow tcp from any to ${ext0_ip} 20,21
# Passive FTP 60k-60,5k - ports, defined as PASV in vsftpd.conf
${ipfw} add allow tcp from any to ${ext0_ip} 60000-60500 keep-state
# SMTP
${ipfw} add allow tcp from any to ${ext0_ip} 25
# NTP
${ipfw} add allow udp from any 123 to ${ext0_ip} 123
# DNS
${ipfw} add allow udp from any 53 to ${ext0_ip}
${ipfw} add allow tcp from any 53 to ${ext0_ip}
# OpenVPN 2
${ipfw} add allow udp from table\($tGateways\) to ${ext0_ip} 1194
# OpenVPN 1 (deprecated for Chelyabinsk)
${ipfw} add allow udp from 82.147.124.90 to ${ext0_ip} 5003
# SSH
${ipfw} add allow tcp from any to ${ext0_ip} 5222 keep-state
# PPTP to MPD
${ipfw} add allow gre from any to ${ext0_ip}
${ipfw} add allow tcp from any to ${ext0_ip} 1723 keep-state
# Default rule for traffic from internet through main channel (in recv ext0_if)
${ipfw} add 15999 deny log logamount 10000 ip from any to any
# ---------------------------------------------------------------#
# ---- Traffic to internet (main channel) (out xmit ext0_if) ----
# ---------------------------------------------------------------#
# FTP
# Active FTP
${ipfw} add 16000 allow tcp from ${ext0_ip} 20,21 to any
# Passive FTP
${ipfw} add allow tcp from ${ext0_ip} 60000-60500 to any keep-state
# Forward traffic from ext1_ip to ext1_gw
${ipfw} add fwd ${ext1_gw} ip from ${ext1_ip} to any
# SMTP
${ipfw} add allow tcp from ${ext0_ip} to any 25 # Mail from me to any
${ipfw} add allow tcp from ${ext0_ip} 25 to any # Answer to mail clients
# NTP
${ipfw} add allow udp from ${ext0_ip} 123 to any 123
# DNS
${ipfw} add allow udp from ${ext0_ip} to any 53
${ipfw} add allow tcp from ${ext0_ip} to any 53
# OpenVPN 2
${ipfw} add allow udp from ${ext0_ip} 1194 to table\($tGateways\)
# OpenVPN 1 (deprecated for Chelyabinsk)
${ipfw} add allow udp from ${ext0_ip} 5003 to 82.147.124.xxx
# ICMP
${ipfw} add allow icmp from ${ext0_ip} to any
# MPD VPN
${ipfw} add allow gre from ${ext0_ip} to any
${ipfw} add allow tcp from ${ext0_ip} 1723 to any
# All from my ip
${ipfw} add allow ip from ${ext0_ip} to any keep-state
# NAT
# Special
${ipfw} add nat 111 ip from ${s0000} to any
${ipfw} add nat 111 ip from ${s0021} to any
# TEMP #
${ipfw} add nat 111 ip from 10.10.1.203/32 to any
# Volkov
${ipfw} add nat 111 ip from 10.10.1.199/32 to any
# Kotovich
${ipfw} add nat 111 ip from 10.10.1.192/32 to any
${ipfw} add nat 111 ip from ${flanker} to any
# DNS
${ipfw} add nat 111 udp from ${dc_boss1} to any 53
${ipfw} add nat 111 udp from ${dc_boss2} to any 53
${ipfw} add nat 111 udp from ${dc_spbwh} to any 53
${ipfw} add nat 111 tcp from ${dc_boss1} to any 53
${ipfw} add nat 111 tcp from ${dc_boss2} to any 53
${ipfw} add nat 111 tcp from ${dc_spbwh} to any 53
# ICMP
${ipfw} add nat 111 icmp from ${spb_net} to any
# Bank clients, nalogovaya and others
${ipfw} add nat 111 tcp from ${s0050} to any ${s0050_ports}
${ipfw} add nat 111 tcp from ${s0070} to any ${s0070_ports}
${ipfw} add nat 111 tcp from ${s0095} to any ${s0095_ports}
# PPTP from inside
${ipfw} add nat 111 gre from ${s0050} to any
${ipfw} add nat 111 tcp from ${s0050} to any 1723
# Allow all from NAT and our ip
${ipfw} add allow ip from ${ext0_ip} to any
# Default rule for traffic to internet (out xmit ext0_if)
${ipfw} add 18999 deny log logamount 10000 ip from any to any
# -----------------------------------------------------------------#
# ---- Traffic from internet (backup channel) (in recv ext1_if) ----
# -----------------------------------------------------------------#
# Deny from RFC 1918 networks
${ipfw} add 19000 deny ip from table\($tRFC1918\) to ${ext1_ip}
# ICMP 0 - echo reply, 8 - echo request, 11 - TTL exceeded
${ipfw} add allow icmp from any to ${ext1_ip} icmptypes 0,8,11
# SMTP
${ipfw} add allow tcp from any to ${ext1_ip} 25
# NTP
${ipfw} add allow udp from any 123 to ${ext1_ip} 123
# DNS
${ipfw} add allow udp from any 53 to ${ext1_ip}
# OpenVPN 2
${ipfw} add allow udp from table\($tGateways\) to ${ext1_ip} 1194
# OpenVPN 1 (deprecated for Chelyabinsk)
${ipfw} add allow udp from 82.147.124.90 to ${ext1_ip} 5003
# SSH
${ipfw} add allow tcp from any to ${ext1_ip} 5222 keep-state
# PPTP to MPD
${ipfw} add allow tcp from any to ${ext1_ip} 1723 keep-state
# Default rule for traffic from internet through backup channel (in recv ext1_if)
${ipfw} add 20999 deny log logamount 10000 ip from any to any
# ----------------------------------------------------------------#
# ---- Traffic to internet (backup channel) (out xmit ext1_if) ----
# ----------------------------------------------------------------#
# SMTP
${ipfw} add 21000 allow tcp from ${ext1_ip} to any 25
${ipfw} add allow tcp from ${ext1_ip} 25 to any
# NTP
${ipfw} add allow udp from ${ext1_ip} 123 to any 123
# DNS
${ipfw} add allow udp from ${ext1_ip} to any 53
# OpenVPN 2
${ipfw} add allow udp from ${ext1_ip} 1194 to table\($tGateways\)
# OpenVPN 1 (deprecated for Chelyabinsk)
${ipfw} add allow udp from ${ext1_ip} 5003 to 82.147.124.xxx
# MPD VPN
${ipfw} add allow gre from ${ext1_ip} to any
${ipfw} add allow tcp from ${ext1_ip} 1723 to any
# Default rule for traffic to internet (out xmit ext1_if)
${ipfw} add 23999 deny log logamount 10000 ip from any to any
# ------------------------------------------------------------ #
# ---- Traffic from affiliates through vpn (in recv tun0) ---- #
# ------------------------------------------------------------ #
${ipfw} add 24000 allow ip from table\($tVPN_networks\) to ${spb_net}
${ipfw} add allow ip from table\($tVPN_networks\) to ${vpn_srv_net}
# Defaul rule for traffic from affiliates through vpn
${ipfw} add 26999 deny ip from any to any
# ----------------------------------------------------------- #
# ---- Traffic to affiliates through vpn (out xmit tun0) ---- #
# ----------------------------------------------------------- #
# Traffic to affiliates through vpn
${ipfw} add 27000 allow ip from ${spb_net} to table\($tVPN_networks\)
${ipfw} add allow ip from ${vpn_srv_net} to table\($tVPN_networks\)
# Defaul rule for traffic to affiliates through vpn
${ipfw} add 29999 deny log logamount 10000 ip from any to any
# -------------------------------------------------------------------------- #
# ---- Traffic from chelyabinsk through vpn (deprecated) (in recv tun3) ---- #
# -------------------------------------------------------------------------- #
${ipfw} add 30000 allow ip from ${chel_net} to ${spb_net}
# Default rule for traffic from chelyabinsk through vpn
${ipfw} add 32999 deny log logamount 10000 ip from any to any
# ------------------------------------------------------------------------- #
# ---- Traffic to chelyabinsk through vpn (deprecated) (out xmit tun3) ---- #
# ------------------------------------------------------------------------- #
${ipfw} add 33000 allow ip from ${spb_net} to ${chel_net}
# Default rule for traffic to chelyabinsk through vpn
${ipfw} add 35999 deny log logamount 10000 ip from any to any
# --------------------------------------------------- #
# ---- Traffic from vpn (PPTP MPD) (in recv ng*) ---- #
# --------------------------------------------------- #
${ipfw} add 36000 allow ip from ${spb_net} to table\($tAll_lan\)
# Default rule for traffic from vpn
${ipfw} add 38999 deny log logamount 10000 ip from any to any
# -------------------------------------------------- #
# ---- Traffic to vpn (PPTP MPD) (out xmit ng*) ---- #
# -------------------------------------------------- #
${ipfw} add 39000 allow ip from table\($tAll_lan\) to ${spb_net}
# Default rule for traffic to vpn
${ipfw} add 42999 deny log logamount 10000 ip from any to any
Кто найдет косяки, недочеты и т.д. - you are welcome!
Re: ipfw + ipfw nat
Добавлено: 2009-03-23 16:31:44
Lucky SB
Лично я прописал бы номера правил явно.
CrazyPilot писал(а):статьи про сложные случаи прохождение трафика в ipfw (читал до опупения)
Статья немного устарела ) В ней разговор про natd, а у тебя kernel nat. Вещи разные, хоть и похожие.
CrazyPilot писал(а):В итоге пришлось отказаться от one_pass=1 и разрешать нату все входящие подключения, но ставить его первым правилом для трафика, входящего с WAN, а дальше уже раскидывать пакеты.
Хм. В мане на ipfw из семерки написано
Код: Выделить всё
To let the packet continue after being (de)aliased, set the sysctl vari-
able net.inet.ip.fw.one_pass to 0. For more information about aliasing
modes, refer to libalias(3) See Section EXAMPLES for some examples about
nat usage.
Ты говоришь о том, что при one_pass=1 kernel nat пропускает ВСЕ входящие пакеты ? Не только те, которые он (de)aliased (обработал), но и те, правил на которые нету в таблице трансляций и он должен их пропускать без изменения ???
Это серъезный баг и нужен send_pr
Ты, кстати своими правилами поведение при one_pass=1, таким, каким оно должно быть согласно man
Код: Выделить всё
# Pass all trafic to NAT instance. Not NAT traffic will leave from NAT without modification.
# NAT traffic will leave from NAT with LAN dst ip.
${ipfw} add nat 111 ip from any to ${ext0_ip}
# Traffic from NAT to local net.
${ipfw} add allow ip from any to ${spb_net}
Транслируем входящий трафик.
Разрешаем все, что в локалку.
Re: ipfw + ipfw nat
Добавлено: 2009-03-23 17:41:20
CrazyPilot
Lucky SB писал(а):Статья немного устарела ) В ней разговор про natd, а у тебя kernel nat. Вещи разные, хоть и похожие.
Как я понял из статьи - не суть, divert ли это демон, или сразу все в ядре. Факт что пакет уходит в nat, тот его возвращает (de)alised, либо без изменений. Если у ната не стоит в конфиге "deny in" и в системе one_pass=1 - пакет, вернувшийся с ната, сразу принимается. Причем пакет, ни каким боком не отсносящийся к нату - тоже принимается. У меня было так. Старого конфига к сожалению нет, уже переписал. Но там было именно так, я пробовал разные варианты. Без deny in нат "кушал" всё.
Lucky SB писал(а):Ты говоришь о том, что при one_pass=1 kernel nat пропускает ВСЕ входящие пакеты ? Не только те, которые он (de)aliased (обработал), но и те, правил на которые нету в таблице трансляций и он должен их пропускать без изменения ???
Это серъезный баг и нужен send_pr
Ага, пропускает. Точнее честно делает свою работу. Возвращает пакет обратно в ipfw без изменений, но так как стоит one_pass=1 и пакет пришел из "внешней" подсистемы (в терминах статьи про сложные случаи...) - к пакету сразу применяется allow. Если у него (ipfw nat) явно не указано в конфиге "deny in" и стоит one_pass=1. Дальше по правилам пакет не уходил. Может это фича, а не бага

Вряд ли такой баг был бы никем кроме меня не замечен...
Lucky SB писал(а):Ты, кстати своими правилами поведение при one_pass=1, таким, каким оно должно быть согласно man
Код: Выделить всё
# Pass all trafic to NAT instance. Not NAT traffic will leave from NAT without modification.
# NAT traffic will leave from NAT with LAN dst ip.
${ipfw} add nat 111 ip from any to ${ext0_ip}
# Traffic from NAT to local net.
${ipfw} add allow ip from any to ${spb_net}
Транслируем входящий трафик.
Разрешаем все, что в локалку.
Насчет этого не понял - такой конфиг у меня при one_pass=0.Соответственно, пакет пришедший допустим на внешний интерфейс на smtp, сначала попадает в nat, тот не находит для него соответствия у себя - пакет выходит из ната обратно без изменений - дальше я правилами разруливаю то, что мне надо и т.д.
Re: ipfw + ipfw nat
Добавлено: 2009-03-23 19:01:54
Lucky SB
CrazyPilot писал(а):
Как я понял из статьи - не суть, divert ли это демон, или сразу все в ядре.
Код разный. Баги тоже разные могут быть
CrazyPilot писал(а):Причем пакет, ни каким боком не отсносящийся к нату - тоже принимается. У меня было так.
Хм. У меня-то семерки нету рядом, чтобы проверить. Попрошу седня в фидошной эхе.
CrazyPilot писал(а):так как стоит one_pass=1 и пакет пришел из "внешней" подсистемы (в терминах статьи про сложные случаи...) - к пакету сразу применяется allow
Это неправильно.
CrazyPilot писал(а):Может это фича, а не бага

Вряд ли такой баг был бы никем кроме меня не замечен...
Це не фича, це дырка ) Хотя много у кого стоит one_pass=0 из-за того, что шейпить юзеров надо.
CrazyPilot писал(а):Насчет этого не понял - такой конфиг у меня при one_pass=0.Соответственно
Ну судя по man ipfw именно такое поведение должно быть при one_pass=1 без дополнительного правила на пропуск трафика локалки.
Мне прям инетересно стало....

Re: ipfw + ipfw nat
Добавлено: 2009-03-24 9:14:26
CrazyPilot
CrazyPilot писал(а):так как стоит one_pass=1 и пакет пришел из "внешней" подсистемы (в терминах статьи про сложные случаи...) - к пакету сразу применяется allow
Lucky SB писал(а):Это неправильно.
А вот здесь можно поподробнее? Почему неправильно? То есть правильно должно быть так: nat, не найдя в таблице трансляций соответствие для пакета, должен вернуть пакет обратно в ipfw, причем без навешивания всяких флагов? Так, как будто этот пакет и не проходил через nat?
Насчет правил...
one_pass = 1 - правило для локалки после ната
не нужно. Пакет, вернувшись из ната, сразу принимается
one_pass = 0 - правило для локалки после ната
нужно. Пакет, вернувшись из ната (dealiased) пойдет дальше по правилам, соответственно правило для локалки нужно.
Я на верном пути?
Кстати нарыл еще интересную штуку:
Если в скрипт добавления правил ipfw с его натом не ставить в начале скрипта ${ipfw} nat xxx delete и у вас уже есть нат, созданный ранее с этим номером - то начинаются странные глюки. В моем случае не резолвился dns со шлюза. Причем в логах ipfw не было никакой порнографии, просто тупо не резолвился dns. После того как добавил правило, удаляющее нат, а следующее его создающее - все просралось :-)
Re: ipfw + ipfw nat
Добавлено: 2009-03-24 15:51:35
Lucky SB
CrazyPilot писал(а):
А вот здесь можно поподробнее? Почему неправильно? То есть правильно должно быть так: nat, не найдя в таблице трансляций соответствие для пакета, должен вернуть пакет обратно в ipfw, причем без навешивания всяких флагов? Так, как будто этот пакет и не проходил через nat?
Ну да. Он вообще его трогать не должен. Посмотрел себе в таблицы - нету - делать ничего не надо.
CrazyPilot писал(а):
Насчет правил...
one_pass = 1 - правило для локалки после ната
не нужно. Пакет, вернувшись из ната, сразу принимается
one_pass = 0 - правило для локалки после ната
нужно. Пакет, вернувшись из ната (dealiased) пойдет дальше по правилам, соответственно правило для локалки нужно.
Я на верном пути?
да. Так в мане написано. а на самом деле фигня получаеться )
CrazyPilot писал(а):
Кстати нарыл еще интересную штуку:
Если в скрипт добавления правил ipfw с его натом не ставить в начале скрипта ${ipfw} nat xxx delete и у вас уже есть нат, созданный ранее с этим номером - то начинаются странные глюки. В моем случае не резолвился dns со шлюза. Причем в логах ipfw не было никакой порнографии, просто тупо не резолвился dns. После того как добавил правило, удаляющее нат, а следующее его создающее - все просралось :-)
ужас.
Рекомендовать обновиться до 7.1 я не могу. У меня 7.1-RELEASE падал в панику при загрузке в боевой сети. (
Почему я так и не смог разобраться. откатился на 6.4 и ng_nat
Обходные пути ты нашел. Все заработало )
Re: ipfw + ipfw nat
Добавлено: 2009-03-24 15:56:29
CrazyPilot
Lucky SB писал(а):да. Так в мане написано. а на самом деле фигня получаеться )
Почему фигня? Всё именно так и работает, как написано в мане.
Lucky SB писал(а):Почему я так и не смог разобраться. откатился на 6.4 и ng_nat
ng_nat - это нат с помощью netgraph?
Re: ipfw + ipfw nat
Добавлено: 2009-03-24 16:08:19
Lucky SB
CrazyPilot писал(а):Lucky SB писал(а):да. Так в мане написано. а на самом деле фигня получаеться )
Почему фигня? Всё именно так и работает, как написано в мане.
ну ты ж говорил, что при one_pass оно у тебя ВСЕ пакеты принимает. Независимо от того обработан он НАТ или нет.
CrazyPilot писал(а):
ng_nat - это нат с помощью netgraph?
угу. У меня там сразу и ng_nat и ng_netflow в одном кустике.
В гугле полно примеров.
Re: ipfw + ipfw nat
Добавлено: 2009-03-24 17:21:52
CrazyPilot
Lucky SB писал(а):CrazyPilot писал(а):Lucky SB писал(а):да. Так в мане написано. а на самом деле фигня получаеться )
Почему фигня? Всё именно так и работает, как написано в мане.
ну ты ж говорил, что при one_pass оно у тебя ВСЕ пакеты принимает. Независимо от того обработан он НАТ или нет.
Да, принимает...Ладно, мы видать о чём-то разном думаем (-:
Re: ipfw + ipfw nat
Добавлено: 2009-03-25 12:58:19
sch
ИМХО - это фича, соответствующая задуманной логике ipfw.
можно добавить дополнительный селектор для правила входящего NAT, чтобы он принимал только пакеты в рамках установленного соединения
add nat 111 ip from any to ${ext0_ip} established
Хотя это только для TCP, но во многих случаях может сильно упростить жизнь
Re: ipfw + ipfw nat
Добавлено: 2009-03-25 14:12:55
CrazyPilot
Да, а от ната udp, gre и прочего тогда надо отказаться :-)
Имхо, one_pass=1 для ipfw nat штука в большинстве случаев непригодная.
Re: ipfw + ipfw nat
Добавлено: 2009-03-25 14:20:59
Гость
Если нормально писать отдельные специальные правила NAT для разных типов исходящего трафика -- то нормально написать дополняющие правила для входящего ответного трафика.
И вроде немного правил получится?
nat 111 tcp from any to ${ext0_ip} established
nat 111 gre from any to ${ext0_ip}
UDP вещь специфическая и обычно точно известно откуда и на какой порт этот трафик приходит: ntp, dns, ipsec, что еще? Названные сервисы кстати обчычно на роутере и работают, то есть такой трафик пускать через NAT незачем -- до правил входящего NAT разрешить прием пакетов для сервисов роутера.
Подчеркиваю заранее - я не спорю с утверждением, что "one_pass=1 для ipfw nat штука в большинстве случаев непригодная"
Re: ipfw + ipfw nat
Добавлено: 2009-03-25 14:39:08
CrazyPilot
Гость писал(а):nat 111 gre from any to ${ext0_ip}
При one_pass=1 такая штука у меня глючила почему-то. У меня на серваке mpd еще висит в качестве сервака - к нему клиенты нормально цеплялись. А вот pptp под натом не хотел работать. Почему - разобраться так и не смог...
Тот же днс кстати у меня активно юзается контроллерами домена, а на шлюзе нет dns.
Re: ipfw + ipfw nat
Добавлено: 2009-03-25 17:58:23
sch
по поводу pptp и gre - если на шлюзе MPD в роли PPTP-сервера для внешних клиентов и изнутри сети клиент создает PPTP-линк на внешний сервер - то конечно глючить может - gre нужно терминировать на шлюзе для MPD и одновременно пропускать внутрь для клиентского компьютера...
allow gre from any to ${ext0_ip} 1723 # можно поставить и до, и после блока правил NAT
nat 111 gre from any to ${ext0_ip} not 1723
По поводу DNS - если надо транслировать ответы из Интернет на внутренние сервера:
dnslist="ip.addr.prov.dns1,ip.addr.prov.dns2"
nat 111 udp from ${dnslist} 53 to ${ext0_ip}
В общем идея остается та же - специальными правилами NAT разрешать только нужный трафик - фактически используем те же методы, что и для двухпроходного режима работы, только вместо правила allow указывается nat.
Итого блок правил для входящего NAT:
Код: Выделить всё
...
add nat 111 ip from any to ${ext0_ip} established
add nat 111 gre from any to ${ext0_ip} not 1723
add nat 111 udp from ${dnslist} 53 to ${ext0_ip}
...
allow gre from any to ${ext0_ip} 1723
Re: ipfw + ipfw nat
Добавлено: 2009-03-25 18:12:25
CrazyPilot
Да по поводу dns понятно про нат.
А вот про gre не понял?????
sch писал(а):nat 111 gre from any to ${ext0_ip} not 1723
Что за бред? Или я чего-то не понимаю, или вы. 1723 - это tcp порт, который pptp использует для инициализации vpn. GRE - отдельный протокол (не TCP) под номером 47. По-моему правило лишено смысла...Порты сокетов в контексте gre не имеют смысла.
Re: ipfw + ipfw nat
Добавлено: 2009-03-25 18:34:22
4fssw
да, бред - увлекся

похоже, что для PPTP-сервера на шлюзе и одновременно для PPTP-клиента внутри будет таки глючить в однопроходном режиме...
Re: ipfw + ipfw nat
Добавлено: 2009-03-25 18:39:50
sch
4fssw писал(а):да, бред - увлекся

похоже, что для PPTP-сервера на шлюзе и одновременно для PPTP-клиента внутри будет таки глючить в однопроходном режиме...
а если так попробовать
nat 111 tcp from any to ${ext0_ip} not 1723 proto 47