Для начала надо пересобрать ядро со следующими опциями options IPFIREWALL #firewall
options IPFIREWALL_VERBOSE #enable logging to syslogd(8)
options IPFIREWALL_DEFAULT_TO_ACCEPT #allow everything by default
options IPDIVERT
options IPFIREWALL_FORWARD
options DUMMYNET
options IPFIREWALL_NAT #ipfw kernel nat support
options LIBALIAS
в /etc/make.conf:
CFLAGS+= -DIPFIREWALL_NAT
Далее пересобираем ядро:
cd /usr/src/
make buildkernel KERNCONF=Yourkernel && make installkernel KERNCONF=Yourkernel
shutdown -r now
Далее кусок файла конфигурации с примером.
192.168.1.132 - ip адрес сетевой карты смотрящей наружу
останое внутренние адреса
#!/bin/sh
# здесь просто удаляю старые правила
ipfw -f flush
ipfw nat 122 delete && ipfw nat 123 delete
# разрещаю все через loopback
ipfw add allow all from any to any via lo0
# делаю нат на ip смотрящем наружу, same_ports - для попытки сохранить номера портов при нате
ipfw nat 123 config ip 192.168.1.132 log same_ports \
# пробрасываю все что приходит на порт 9999 на тот же порт внутренней машины
# как вариант можно указать -redirect_port tcp 192.168.4.86:9999 192.168.1.132:9999
redirect_port tcp 192.168.4.86:9999 9999
# этот кусок нужен что бы у машины был не полный нат а только порт который я разрешил,
# потому что вообще в интернет буду пускать через проксю.
ipfw add 100 nat 123 tcp from 192.168.4.86 9999 to any
ipfw add 100 nat 123 tcp from any to 192.168.4.86 9999
# здесь я разрешаю клиенту с ip 192.168.4.86 коннектится к любым серверам по 25 порту,
# но только по нему.
ipfw add 100 nat 123 tcp from 192.168.4.86 to any 25
# это что бы был нат, иначе ничего не будет работать, правило для выпуска клиентов наружу
ipfw add 100 nat 123 ip from any to 192.168.1.132
Основанно на https://www.opennet.ru/tips/info/1618.shtml
URL:
Обсуждается: https://www.opennet.ru/tips/info/1938.shtml