Код: Выделить всё
#!/bin/sh
. /etc/rc.subr
name="ngnat"
rcvar=`set_rcvar`
start_cmd="ngnat_start"
stop_cmd="ngnat_stop"
load_rc_config $name
eval "${rcvar}=\${${rcvar}:-'NO'}"
ngnat_aliasaddr1=${ngnat_aliasaddr1:-"0.0.0.0"}
ngnat_aliasaddr2=${ngnat_aliasaddr2:-"0.0.0.0"}
ngnat_export=${ngnat_export:-"127.0.0.1:9999"}
ngnat_start() {
echo "Setup ng_nat and ng_netflow"
/usr/sbin/ngctl -f- <<-SEQ
mkpeer ipfw: netflow 1 iface0
name ipfw:1 netflow
mkpeer netflow: split out0 in
name netflow:out0 split1
mkpeer netflow: ksocket export inet/dgram/udp
msg netflow:export connect inet/$ngnat_export
connect split1: netflow: out iface1
connect ipfw: netflow: 4 out1
mkpeer split1: nat mixed out
name split1:mixed nat1
connect ipfw: nat1: 23 in
connect ipfw: netflow: 5 iface2
connect ipfw: netflow: 6 out2
msg nat1: setaliasaddr $ngnat_aliasaddr1
msg netflow: setdlt { iface=0 dlt=12 }
msg netflow: setifindex { iface=0 index=1000 }
msg netflow: setdlt { iface=1 dlt=12 }
msg netflow: setifindex { iface=1 index=1001 }
msg netflow: setdlt { iface=2 dlt=12 }
msg netflow: setifindex { iface=2 index=1002 }
connect ipfw: netflow: 7 iface3
mkpeer netflow: split out3 in
name netflow:out3 split2
mkpeer split2: nat mixed out
name split2:mixed nat2
connect ipfw: nat2: 89 in
connect split2: netflow: out iface4
connect ipfw: netflow: 40 out4
msg nat2: setaliasaddr $ngnat_aliasaddr2
msg netflow: setdlt { iface=3 dlt=12 }
msg netflow: setifindex { iface=3 index=1003 }
msg netflow: setdlt { iface=4 dlt=12 }
msg netflow: setifindex { iface=4 index=1004 }
SEQ
}
ngnat_stop() {
/usr/sbin/ngctl -f- <<-SEQ
shutdown nat1:
shutdown nat2:
shutdown split1:
shutdown split2:
shutdown netflow:
SEQ
}
run_rc_command "$1"
Код: Выделить всё
#!/bin/sh
sysctl net.inet.ip.fw.one_pass=0
ipfw="/sbin/ipfw"
real="192.168.11.0/24{43,211-254}"
# группа реальных адресов
vpn1="10.0.0.0/16"
vpn2="10.100.0.0/16"
# "серые" подсети
inet1="192.18.11.0/24"
inet2="192.168.255.0/24"
#подсеть интерфейса inet1 и inet2
aliasaddr1="192.168.11.42"
aliasaddr2="192.168.255.1"
#адреса NAT
gate1="192.168.11.1"
gate2="192.168.255.254"
#шлюзы во внешний мир
${ipfw} -f flush
${ipfw} add netgraph 5 all from ${real} to any via "ng*" in
${ipfw} add fwd ${gate1} all from ${real} to not ${inet1}
#заворачиваем трафик от реальных адресов в netgraph
#вышедшие из netgraph пакеты оправляем на роутер
${ipfw} add netgraph 1 all from ${vpn1} to any via "ng*" in
${ipfw} add fwd ${gate1} all from ${aliasaddr1} to not ${inet1}
#тоже самое, но пакеты попавшие в хук 1 проходять процедуру
#преобразования адреса в nat1:
${ipfw} add netgraph 7 all from ${vpn2} to any via "ng*" in
${ipfw} add fwd ${gate2} all from ${aliasaddr2} to not ${inet2}
#аналогично двум правилам выше, но преобразование пакетов
#производится в nat2:
${ipfw} add netgraph 23 all from any to any via inet1 in
#загоняем пришедшие пакеты в nat1:
${ipfw} add netgraph 89 all from any to any via inet2 in
#тоже самое для nat2:
${ipfw} add allow all from any to any