Прозрачный nat нескольких сетей на шлюзе FreeBSD через setfib
Скрипт создания таблицы с адресами
#!/bin/sh
rm /tmp/reestr.txt
rm /tmp/reestrbsd.txt
/usr/local/bin/wget -O - https://reestr.rublacklist.net/api/v2/ips/json|tr ',' '\n'|tr -d '"'|tr -d ']'|tr -d '[' > /tmp/reestr.txt
grep -E -o "([0-9]{1,3}[\.]){3}[0-9]{1,3}" /tmp/reestr.txt > /tmp/reestrbsd.txt
file="/tmp/reestrbsd.txt"
ipfw table 1 flush
while read line
do
ipfw table 1 add $line
done < $file
Фаервол:
#!/bin/sh -
# прописываем роут для setfib 1
setfib 1 route del default
setfib 1 route add default -interface tun1
fwcmd="/sbin/ipfw"
${fwcmd} -f flush
${fwcmd} -f pipe flush
${fwcmd} nat 1 delete
${fwcmd} nat 2 delete
if_local1="re0" # локалка
if_inet1="ng0" # интерфейс интернета
if_rkn="tun1" # интерфейс openvpn
# заруливаем все обращения к ip из таблицы в setfib 1
${fwcmd} add setfib 1 ip from any to table\(1\) recv ${if_local1}
# основной нат
${fwcmd} nat 1 config if ${if_inet1} same_ports
${fwcmd} add nat 1 ip from any to any via ${if_inet1}
# нат для ip из таблицы
${fwcmd} nat 2 config if ${if_rkn} same_ports
${fwcmd} add nat 2 ip from any to any via ${if_rkn}
${fwcmd} add allow all from any to any