Потребовалось пробросить порт с одного сервера с ОС FreeBSD c ipfw на другой сервер. На всякий случай решил записать — мало ли еще кому-нибудь пригодится…
В файл /boot/loader.conf допишем:
# RUS
kern.vty=vt
# PIPE
ipdivert_load="YES"
dummynet_load="YES"
ng_pipe_load="YES"
# SETFIB
#net.fibs="2"'
# IPFW
ipfw_load="YES"
ipfw_nat_load="YES"
firewall_logif="YES"
В файле /etc/sysctl.conf укажем:
net.inet.ip.fw.verbose_limit=0
net.inet.ip.fw.verbose=1
В файле /etc/rc.conf допишем:
keymap="ru"
# IPFW
firewall_enable="YES"
firewall_script="/etc/ipfw.script"
firewall_logging="YES"
firewall_logif="YES"
firewall_nat_enable="YES"
dummynet_enable="YES"
gateway_enable="YES"
И собственно, сам файл для файрвола /etc/ipfw.script:
FW="/sbin/ipfw"
# Интерфейс, на котором слушаем
WAN="em0"
# Порт, который слушаем
FromPort="43389"
# IP, на который будем пробрасывать порт
ToIP="91.01.91.11"
# Порт, на который будем пробрасывать
ToPort="3389"
${FW} -f flush
${FW} enable one_pass
${FW} add allow all from any to any via lo0
${FW} add deny all from any to 127.0.0.0/8
${FW} add deny all from 127.0.0.0/8 to any
${FW} add deny all from any to any frag
${FW} add check-state
# Табличка тех IP, кто может зайти в ssh
${FW} table admin create missing
${FW} table admin add 46.0.0.0/8
${FW} table admin add 5.135.191.0/24
${FW} table admin add 188.138.9.0/24
${FW} table admin add 195.154.236.0/24
${FW} add allow ip from "table(admin)" to me 22
# Для них же - разрешаем пинг
${FW} add allow icmp from "table(admin)" to me in icmptype 8
${FW} add allow icmp from me to "table(admin)" out icmptype 0,8
# Ограничим скорость подключения с одного IP на защищенный адрес IP
# Входящая скорость
${FW} pipe 1 config bw 20Mbit/s queue 60 gred 0.002/10/30/0.1
${FW} queue 1 config pipe 1 queue 60 buckets 128 mask src-ip 0xffffffff gred 0.002/10/30/0.1
# Выходящая скорость
${FW} pipe 2 config bw 20Mbit/s queue 60 gred 0.002/10/30/0.1
${FW} queue 2 config pipe 2 queue 60 buckets 128 mask dst-ip 0xffffffff gred 0.002/10/30/0.1
# Собственно - редирект порта
${FW} nat 1 config log if ${WAN} same_ports deny_in \
redirect_port tcp ${ToIP}:${ToPort} ${FromPort}
${FW} add nat 1 ip from any to any via ${WAN}
${FW} add allow tcp from any ${FromPort} to any via ${WAN}
${FW} add queue 1 ip from any to ${ToIP} in via ${WAN}
${FW} add allow tcp from any to ${ToIP} in via ${WAN}
${FW} add queue 2 ip from me to any out via ${WAN}
${FW} add allow tcp from me to any out via ${WAN}
${FW} add allow tcp from any to any established
${FW} add deny log all from any to any
После всего этого перезагружаемся, проверяем редирект. При необходимости дописываем еще порты, IP адреса, добавляя
redirect_port IP:Port Port_который слушаем на ${WAN}
Если на интерфейсе несколько IP и редиректить нужно только с одного IP, то строчка NAT выглядит так:
${FW} nat 1 config log ip ${FromIP} same_ports deny_in \
redirect_port tcp ${ToIP}:${ToPort} ${FromPort}
Конечно же, проверить все это можно на выделенных и виртуальных серверах компании vps-server.ru