Проброс порта во FreeBSD ipfw kernel nat на другой IP

Потребовалось пробросить порт с одного сервера с ОС 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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *