Подсмотрев в хэндбук, набросал вот такое:
======================================================
Код: Выделить всё
root@:/usr/home/user1 # uname -a
FreeBSD 11.0-RELEASE-p1 FreeBSD 11.0-RELEASE-p1 #0 r306420: Thu Sep 29 01:43:23 UTC 2016 root@releng2.nyi.freebsd.org:/usr/obj/usr/src/sys/GENERIC amd64
=======================================================
Код: Выделить всё
root@:/usr/home/user1 # cat /etc/rc.conf
defaultrouter="192.168.100.1"
ifconfig_hn0_alias0="192.168.100.5/24"
ifconfig_hn0_alias1="192.168.100.6/24"
ifconfig_hn1="10.1.10.1/24"
ifconfig_hn2="10.1.90.1/24"
dhcpd_enable="YES"
dhcpd_ifaces="hn1 hn2"
gateway_enable="YES"
firewall_enable="YES"
firewall_nat_enable="YES"
firewall_script="/etc/ipfw.conf"
sshd_enable="YES"
========================================================
Код: Выделить всё
root@:/usr/home/user1 # cat /etc/ipfw.conf
#!/bin/sh
ipfw -q -f flush
cmd="ipfw -q add"
skip1="skipto 801" #skipto NAT1
skip2="skipto 802" #skipto NAT2
ks="keep-state"
eif="hn0" #external if
iif="hn1" #inetrnal if
gif="hn2" #guest if
inet="10.1.10.0/24" #internal net
gnet="10.1.90.0/24" #guest net
$cmd 010 allow all from any to any via lo0
$cmd 011 allow all from $inet to $inet via $iif
$cmd 012 deny all from $inet to $gnet via $iif
$cmd 013 deny all from $gnet to $inet via $gif
ipfw -q nat 1 config ip 192.168.100.5 same_ports reset
ipfw -q nat 2 config ip 192.168.100.6 same_ports reset
$cmd 094 nat 1 ip from any to 192.168.100.5 in via $eif
$cmd 095 nat 2 ip from any to 192.168.100.6 in via $eif
$cmd 119 check-state
#------------------------Outgoing---------------------------------------------------
$cmd 120 $skip1 udp from $inet to any out via $eif $ks
$cmd 140 $skip1 tcp from $inet to any out via $eif setup $ks
$cmd 170 $skip1 tcp from me to any out via $eif setup $ks uid root
$cmd 180 $skip1 icmp from $inet to any out via $eif $ks
$cmd 190 $skip2 tcp from $gnet to any out via $eif setup $ks
$cmd 191 $skip2 udp from $gnet to 192.168.100.1 53 out via $eif $ks
$cmd 192 $skip2 icmp from $gnet to any out via $eif $ks
#------------------------Incoming----------------------------------------------------
$cmd 301 deny all from 172.16.0.0/12 to any in via $eif
$cmd 302 deny all from 10.0.0.0/8 to any in via $eif
$cmd 303 deny all from 127.0.0.0/8 to any in via $eif
$cmd 304 deny all from 0.0.0.0/8 to any in via $eif
$cmd 305 deny all from 169.254.0.0/16 to any in via $eif
$cmd 306 deny all from 192.0.2.0/24 to any in via $eif
$cmd 307 deny all from 204.152.64.0/23 to any in via $eif
$cmd 308 deny all from 224.0.0.0/3 to any in via $eif
$cmd 315 deny tcp from any to any 113 in via $eif
$cmd 320 deny tcp from any to any 137 in via $eif
$cmd 321 deny tcp from any to any 138 in via $eif
$cmd 322 deny tcp from any to any 139 in via $eif
$cmd 323 deny tcp from any to any 81 in via $eif
$cmd 330 deny all from any to any frag in via $eif
$cmd 332 deny tcp from any to any established in via $eif
$cmd 380 allow tcp from any to me 22 in via $eif setup limit src-addr 2
$cmd 400 deny log all from any to any in via $eif
$cmd 450 deny log all from any to any out via $eif
#----------------------------Skipto-------------------------------------------------
$cmd 801 nat 1 ip from $inet to any out via $eif
$cmd 802 nat 2 ip from $gnet to any out via $eif
$cmd 900 allow ip from any to any
$cmd 999 deny log all from any to any
#-------------------------------------------------------------------------------------
============================================================
Код: Выделить всё
root@:/usr/home/user1 # sysctl -a | grep ip.fw
net.inet.ip.fw.dyn_keep_states: 0
net.inet.ip.fw.dyn_keepalive: 1
net.inet.ip.fw.dyn_short_lifetime: 5
net.inet.ip.fw.dyn_udp_lifetime: 10
net.inet.ip.fw.dyn_rst_lifetime: 1
net.inet.ip.fw.dyn_fin_lifetime: 1
net.inet.ip.fw.dyn_syn_lifetime: 20
net.inet.ip.fw.dyn_ack_lifetime: 300
net.inet.ip.fw.dyn_max: 16384
net.inet.ip.fw.dyn_count: 2
net.inet.ip.fw.curr_dyn_buckets: 256
net.inet.ip.fw.dyn_buckets: 256
net.inet.ip.fw.enable: 1
net.inet.ip.fw.static_count: 37
net.inet.ip.fw.default_to_accept: 0
net.inet.ip.fw.tables_sets: 0
net.inet.ip.fw.tables_max: 128
net.inet.ip.fw.default_rule: 65535
net.inet.ip.fw.verbose_limit: 10
net.inet.ip.fw.verbose: 1
net.inet.ip.fw.autoinc_step: 100
net.inet.ip.fw.one_pass: 0
=======================================================
Все это работает, только если net.inet.ip.fw.one_pass=0
В хэндбуке об этой переменно не говорится, эмпирически вышло..
Но правильно ли это?
И как все-таки работает эта one_pass? В интернетах пишут, что оно только для dummynet. Но получается, что это не так. Подскажите пжлста.
Еще как-то напрягает правило 900 и nat in вначале скрипта. Получается, что на внешнем интерфейсе обрабатываются вообще все ходящие пакеты? И потом только фильтруются? Есть ли это гуд? Что будет под хорошей нагрузкой?
Подскажите альтернативную конструкцию? (альтернативную вот этой, стейтфул)
Отправлено спустя 28 минут 7 секунд:
default_vlan,
Почтовый сервак в $inet. Снаружи доступ к нему (к mail.korp-pochta.ru) посредствам форвардинга (в этих правилах не отражено, но на самом деле через параметр redirect_port mail_ip:25 и т.д.). Можно ли, чтоб из $gnet люди могли подключаться к почте через внешний интерфейс? То есть "некое устройство в $gnet" -> "nat 2" -> "defaltrouter провайдера" -> "nat 1 c redirct_port" -> "почтовый сервер"