Подробное руководство по ipfw nat

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
usrZorg
проходил мимо
Сообщения: 5
Зарегистрирован: 2011-05-13 9:00:27

Подробное руководство по ipfw nat

Непрочитанное сообщение usrZorg » 2018-03-31 3:04:55

Прошу прощения.
Надеюсь это прояснит ситуацию:

Код: Выделить всё

#!/bin/sh

################################################################################

debug=0

################################################################################

ipfw="/sbin/ipfw -q"

################################################################################

${ipfw} flush
${ipfw} queue flush
${ipfw} pipe flush
${ipfw} nat flush
#${ipfw} table all flush
${ipfw} table 1 flush
${ipfw} table 2 flush
${ipfw} table 3 flush
${ipfw} table 4 flush
${ipfw} table 7 flush
${ipfw} zero

################################################################################

${ipfw} disable one_pass
#${ipfw} enable one_pass

################################################################################

####

ext_if="vlan2"
ext_if_ip="1.1.1.111"
ext_if_alias0="1.1.2.111"
ext_if_alias1="1.1.2.112"
ext_if_alias2="1.1.2.113"
ext_if_alias3="1.1.2.114"

####

ext_if_replacement=${ext_if_ip}
ext_if_alias0_replacement=${ext_if_alias0}
net_if="vlan2"
int_if="vlan10"
wlan_if="vlan20"

www_if="vlan10"

int_if_ip="192.168.50.1"

www_if_ip="192.168.50.11"

olan_ip="192.168.60.1"

####

int_if_replacement=${int_if_ip}

www_if_replacement=${www_if_ip}

####



# Внутренняя сеть
# Рабочая сеть
wlocalnet="192.168.50.0/22"
# Широковещательный адрес для локальной сети.
broadcast_ip_of_wlocalnet="192.168.51.255"
# Общая сеть
olocalnet="192.168.60.0/22"
# Широковещательный адрес общей сети.
broadcast_ip_of_olocalnet="192.168.61.255"

####

################################################################################

# NAT (проброс портов)
# Если на интерфейсе статический ip, то лучше указывать его.
# Для EXTERNAL-канала.
#${ipfw} nat 1 config log ip ${ext_if_alias0} reset same_ports
${ipfw} nat 1 config log ip ${ext_if_ip} reset same_ports \
	redirect_port tcp ${www_if_ip}:${HTTP_PORT} ${HTTP_PORT} \
	redirect_port tcp ${www_if_ip}:${HTTPS_PORT} ${HTTPS_PORT} \
	redirect_port tcp ${www_if_ip}:${FTP_PORT_INTERNAL} ${FTP_PORT_EXTERNAL} \
	redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_1} ${FTP_PASV_PORT_1} \
	redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_2} ${FTP_PASV_PORT_2} \
	redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_3} ${FTP_PASV_PORT_3} \
	redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_4} ${FTP_PASV_PORT_4} \
	redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_5} ${FTP_PASV_PORT_5} \
	redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_6} ${FTP_PASV_PORT_6} \
	redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_7} ${FTP_PASV_PORT_7} \
	redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_8} ${FTP_PASV_PORT_8} \
	redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_9} ${FTP_PASV_PORT_9} \
	redirect_port tcp ${www_if_ip}:${FTP_PASV_PORT_10} ${FTP_PASV_PORT_10} \
	redirect_port tcp ${www_if_ip}:${SSH_WWW_INT_PORT} ${SSH_WWW_EXT_PORT}



# NAT 20
#${ipfw} nat 2 config log ip $(ext_if_alias1) reset same_ports


################################################################################

# START: EXTERNAL канал #

# Входящий канал 0 -> pipe 30 - для "служебного" (важного) трафика.
# Правда вопрос: что считать важным трафиком? - Я думаю это: TCP FIN, TCP SYN, TCP RST, TCP PSH ... (нужно продолжить :)
# bw (bandwidth) - A value of 0 (default) means unlimited bandwidth.
# У нас локальная сеть с маской /22 - поэтому 0xfffffc00
${ipfw} pipe 30 config bw 0Kbit/s mask dst-ip 0xfffffc00

# Входящий канал 1 -> pipe 31 (для нас и vip)
${ipfw} pipe 31 config bw 45000Kbit/s queue 60 gred 0.002/54/60/0.1

# Входящий канал 2 -> pipe 32 (для остальных)
${ipfw} pipe 32 config bw 25000Kbit/s queue 40 gred 0.002/36/40/0.1

# Входящий канал 3 -> pipe 33 (для 192.168.51.0/24)
${ipfw} pipe 33 config bw 25000Kbit/s queue 26 gred 0.002/23/26/0.1

# Исходящий канал 0 -> pipe 40 - для "служебного" (важного) трафика.
# bw (bandwidth) - A value of 0 (default) means unlimited bandwidth.
# У нас локальная сеть с маской /22 - поэтому 0xfffffc00
${ipfw} pipe 40 config bw 0Kbit/s mask src-ip 0xfffffc00

# Исходящий канал 1 -> pipe 41 (для нас и vip)
${ipfw} pipe 41 config bw 32000Kbit/s queue 30 gred 0.002/27/30/0.1

# Исходящий канал 2 -> pipe 42 (для остальных)
${ipfw} pipe 42 config bw 10000Kbit/s queue 26 gred 0.002/23/26/0.1

# Исходящий канал 3 -> pipe 43 (для 192.168.51.0/24)
${ipfw} pipe 43 config bw 8000Kbit/s queue 26 gred 0.002/23/26/0.1

# STOP: EXTERNAL канал #

################################################################################

# Очереди на входящий канал 1 (pipe 31) -> 31x
${ipfw} queue 311 config pipe 31 weight 60 mask dst-ip 0xfffffc00

${ipfw} queue 312 config pipe 31 weight 35 mask dst-ip 0xfffffc00

# Очереди на входящий канал 2 (pipe 32) -> 32x
${ipfw} queue 321 config pipe 32 weight 30 mask dst-ip 0xfffffc00

${ipfw} queue 322 config pipe 32 weight 5 mask dst-ip 0xfffffc00

# Очереди на входящий канал 3 (pipe 33) -> 33x
${ipfw} queue 331 config pipe 33 weight 30 mask dst-ip 0xfffffc00

# Очереди на исходящий канал 1 (pipe 41) -> 41x
${ipfw} queue 411 config pipe 41 weight 60 mask src-ip 0xfffffc00

${ipfw} queue 412 config pipe 41 weight 35 mask src-ip 0xfffffc00

# Очереди на исходящий канал 2 (pipe 42) -> 42x
${ipfw} queue 421 config pipe 42 weight 30 mask src-ip 0xfffffc00

${ipfw} queue 422 config pipe 42 weight 5 mask src-ip 0xfffffc00

# Очереди на исходящий канал 3 (pipe 43) -> 43x
${ipfw} queue 431 config pipe 43 weight 30 mask src-ip 0xfffffc00

################################################################################

#${ipfw} add 11 set 1 allow ip4 from any to any via lo0
${ipfw} add 11 set 1 allow all from any to any via lo0
#${ipfw} add 12 set 1 deny ip4 from any to 127.0.0.0/8
${ipfw} add 12 set 1 deny all from any to 127.0.0.0/8
#${ipfw} add 13 set 1 deny ip4 from 127.0.0.0/8 to any
${ipfw} add 13 set 1 deny all from 127.0.0.0/8 to any
${ipfw} add 14 deny all from any to ::1
${ipfw} add 15 deny all from ::1 to any


###

# Запрещаем IPV6.
${ipfw} add 31 deny ip6 from any to any

###


${ipfw} add 51 set 1 deny log logamount 500 all from any to any frag

# Для перестраховки :)
${ipfw} add 71 set 1 allow ip4 from 191.168.50.31 to 192.168.50.1
${ipfw} add 72 set 1 allow ip4 from 192.168.50.1 to 192.168.50.31

# olan 20 begin
#${ipfw} add 91 set 1 allow ip4 from ${olan_ip} to any
${ipfw} add 91 set 1 allow ip4 from ${olan_ip} to ${olocalnet}
${ipfw} add 92 set 1 allow ip4 from ${olocalnet} to ${olan_ip}

################################################################################

# DENY

# deny bad ips
bad_ips="6.6.6.1, 6.6.6.2"

${ipfw} add 111 set 1 deny log logamount 1000 ip4 from any to ${bad_ips} in recv ${int_if_replacement}
${ipfw} add 112 set 2 deny log logamount 1000 ip4 from ${bad_ips} to any in recv ${int_if_replacement}

################################################################################

ext_ips="1.1.2.111, 1.1.2.112, 1.1.2.113, 1.1.2.114"

${ipfw} add 131 allow ip from any to $ext_ips
${ipfw} add 132 allow ip from $ext_ips to any

################################################################################

# set 2 - EXTERNAL-канал

# *** IN *** #

# Правила для сервера.
# start
# В pf: set skip on ${int_if}

# Для dhcp-клиентов.
${ipfw} add 151 set 1 allow udp from 0.0.0.0 68 to 255.255.255.255 67 in recv ${int_if_replacement}

# Для bsnmpd.
${ipfw} add 152 set 1 deny ip4 from any to any 161 in

${ipfw} add 153 set 1 allow ip4 from ${wlocalnet} to ${int_if_ip} in recv ${int_if_replacement}

${ipfw} add 154 set 1 allow ip4 from ${wlocalnet} to ${www_if_ip} in recv ${www_if_replacement}

${ipfw} add 156 set 1 fwd ${int_if_ip} ip4 from ${wlocalnet} to ${ext_if_ip} in recv ${int_if_replacement}

###


# Для www server-а!
# from any to ${ext_if_ip} in recv ${ext_if_replacement}
${ipfw} add 171 set 2 allow ip4 from any to ${www_if_ip} in recv ${ext_if_replacement}

# stop

################################################################################

# Пакеты на исход.
if [ ${debug} -eq 1 ]
then
	printf "\n *** IN *** Пакеты на исход."
fi

# Разрешаем внутренний трафик из сети провайдера
provider="10.100.100.0/24, 10.100.200.0/24, 10.100.210.0/24"
${ipfw} add 192 set 1 allow ip4 from any to $provider in recv ${int_if_replacement}

# Для шейпа.
${ipfw} add 211 set 1 deny ip4 from any to ${broadcast_ip_of_wlocalnet} in recv ${int_if_replacement}
${ipfw} add 212 set 1 deny ip4 from any to 255.255.255.255 in recv ${int_if_replacement}

RFC1918="192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8"
#RFC1918="192.168.0.0/16, 172.16.0.0/12"

${ipfw} add 213 set 1 deny log logamount 1000 ip4 from any to ${RFC1918} in recv ${int_if_replacement}
${ipfw} add 214 set 2 skipto 1000 ip4 from table\(7\) to any in recv ${int_if_replacement}

################################################################################

# Пакеты на вход.
if [ ${debug} -eq 1 ]
then
	printf "\n *** IN *** Пакеты на вход."
fi

# Для EXTERNAL-интерфейса (NAT).
${ipfw} add 231 set 2 skipto 2000 ip4 from any to ${ext_if_ip} in recv ${ext_if_replacement}


# Запрещаем то, что не разрешено явно!
if [ ${debug} -eq 1 ]
then
	printf "\n *** IN *** Запрещаем то, что не разрешено явно!"
fi

${ipfw} add 495 set 1 deny log logamount 1000 ip4 from any to any in

################################################################################

# *** OUT *** #


# Правила для сервера.
# start
if [ ${debug} -eq 1 ]
then
	printf "\n *** OUT *** Правила для сервера."
fi

${ipfw} add 511 set 1 allow ip4 from ${int_if_ip} to ${wlocalnet} out xmit ${int_if_replacement}
# <!-- po idee mogno ubrat -->
${ipfw} add 512 set 1 allow ip4 from ${www_if_ip} to ${wlocalnet} out xmit ${www_if_replacement}
${ipfw} add 513 set 1 allow ip4 from ${ext_if_ip} to ${wlocalnet} out xmit ${int_if_replacement}
# stop


# Пакеты, возвращающиеся обратно к lan с EXTERNAL-интерфейса.
if [ ${debug} -eq 1 ]
then
	printf "\n *** OUT *** Пакеты, возвращающиеся обратно к lan с EXTERNAL-интерфейса."
fi


# Для шейпа.
${ipfw} add 541 set 2 skipto 5000 ip4 from any to table\(7\) out xmit ${int_if_replacement} recv ${ext_if_replacement}


# Пакеты на исход.
if [ ${debug} -eq 1 ]
then
	printf "\n *** OUT *** Пакеты на исход."
fi

${ipfw} add 711 set 2 skipto 7000 ip4 from any to any out xmit ${ext_if_replacement} recv ${int_if_replacement}

################################################################################

# Правила для сервера.
# Нужно будет указать явно какие пакеты разрешены, а всё остальное отбрасывать!
# Точнее, то что уходит от _сервера_ (через внешние интерфейсы) - пускай уходит,
# а нужно "рубать" на внутренних интерфейсах.
# start

if [ ${debug} -eq 1 ]
then
	printf "\n *** OUT *** Правила для сервера."
fi

# Для www server-а!
${ipfw} add 911 set 2 allow ip4 from ${www_if_ip} to any src-port ${SSH_WWW_INT_PORT} out xmit ${ext_if_replacement}
${ipfw} add 912 set 2 nat 1 ip4 from ${www_if_ip} to any out xmit ${ext_if_replacement}

${ipfw} add 931 set 2 allow ip4 from ${ext_if_ip} to any out xmit ${ext_if_replacement}

# stop

################################################################################

# Запрещаем то, что не разрешено явно!
if [ ${debug} -eq 1 ]
then
	printf "\n *** OUT *** Запрещаем то, что не разрешено явно!"
fi
${ipfw} add 991 set 1 deny log logamount 1000 ip4 from any to any out


# in recv ${int_if_replacement}

# Все DNS-запросы должны обслуживаться _локальным_ DNS-сервером, а то, к примеру, некоторые вирусы могут
# подменить DNS-сервер на свой. Хотя они обычно правят файл hosts :) (C:\Windows\System32\drivers\etc\hosts)
#${ipfw} add 1011 set 1 allow ip4 from ${ext_if_ip} to any dst-port 53
${ipfw} add 1011 set 1 allow ip4 from me to any dst-port 53
#${ipfw} add 1012 set 1 allow ip4 from any 53 to ${ext_if_ip}
${ipfw} add 1012 set 1 allow ip4 from any 53 to me
${ipfw} add 1021 set 1 deny log logamount 1000 ip4 from any to any dst-port 53


# Те же рассуждения касаются и 25 TCP-порта (SMTP)
# http://mostlygeek.com/tech/smtp-on-port-587/
mail_allowed_ips="192.168.50.11, 1.1.2.111, 1.1.2.112, 1.1.2.113, 1.1.2.114"
${ipfw} add 1042 set 1 allow ip4 from $mail_allowed_ips to any dst-port ${ALL_SMTP}
${ipfw} add 1043 set 1 deny log logamount 10000 ip4 from any to any dst-port ${SMTP_PORT}
${ipfw} add 1044 set 1 deny log logamount 10000 ip4 from any to any dst-port ${SMTPS_PORT}
${ipfw} add 1045 set 1 deny log logamount 10000 ip4 from any to any dst-port ${SMTP_SUBMISSION_PORT}


################################################################################

# !!! Следующее правило для того, чтобы те, кто явно не перечислен (кто не в базе), не вышли в интернет. !!!
if [ ${debug} -eq 1 ]
then
	printf "\n *** OUT *** Следующее правило для того, чтобы те, кто явно не перечислен (кто не в базе), не вышли в интернет."
fi

${ipfw} add 1071 set 2 deny log logamount 500 ip4 from not table\(7\) to any

# и + запрещаем выход тем, кто в таблице 6 !!!

if [ ${debug} -eq 1 ]
then
	printf "\n *** OUT *** и + запрещаем выход тем, кто в таблице 6 !!!"
fi

${ipfw} add 1091 set 2 deny log logamount 500 ip4 from table\(6\) to any

###

#${ipfw} add 1210 set 2 pipe 40 ip4 from any to any { tcpflags syn or tcpflags fin or tcpflags rst or tcpflags psh }

${ipfw} add 1230 set 2 queue 411 ip4 from table\(1\) to any

${ipfw} add 1240 set 2 queue 412 ip4 from table\(2\) to any

${ipfw} add 1250 set 2 queue 421 ip4 from table\(3\) to any

${ipfw} add 1260 set 2 queue 422 ip4 from table\(4\) to any

${ipfw} add 1265 set 2 queue 431 ip4 from 192.168.51.0/24 to any

###${ipfw} add 1270 set 2 netgraph 100 ip4 from any to any

${ipfw} add 1290 set 2 allow ip4 from any to any

###

# in recv ${ext_if_replacement}
# NAT

${ipfw} add 2011 set 2 nat 1 ip4 from any to any
${ipfw} add 2091 set 2 allow ip4 from any to any


# out xmit ${int_if_replacement} recv ${ext_if_replacement}

#${ipfw} add 5011 set 2 pipe 30 ip4 from any to any { tcpflags syn or tcpflags fin or tcpflags rst or tcpflags psh }

${ipfw} add 5031 set 2 queue 311 ip4 from any to table\(1\)

${ipfw} add 5041 set 2 queue 312 ip4 from any to table\(2\)

${ipfw} add 5051 set 2 queue 321 ip4 from any to table\(3\)

${ipfw} add 5061 set 2 queue 322 ip4 from any to table\(4\)

${ipfw} add 5071 set 2 queue 331 ip4 from any to 192.168.51.0/24

#${ipfw} add 5081 set 2 netgraph 100 ip4 from any to any

${ipfw} add 5111 set 2 allow ip4 from any to any

###

# out xmit ${ext_if_replacement} recv ${int_if_replacement}
# NAT


${ipfw} add 7011 set 2 nat 1 ip4 from any to any

${ipfw} add 7111 set 2 allow ip4 from any to any


################################################################################

# Запрещаем то, что не разрешено явно!
${ipfw} add 60000 set 1 deny log logamount 1000 ip4 from any to any


if [ ${debug} -eq 1 ]
then
	printf "\n\nFinish :)\n\n"
fi

################################################################################

Некоторое время назад я пробовал сделать, но работать не хотело.
Поэтому в приведенном конфиге есть некоторые остатки.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Аватара пользователя
Sindikat88
мл. сержант
Сообщения: 138
Зарегистрирован: 2010-09-02 15:07:54
Контактная информация:

Подробное руководство по ipfw nat

Непрочитанное сообщение Sindikat88 » 2018-06-15 4:04:58

Здравствуйте!
Коллеги, помогите избавиться от костылей, которые тянутся с версии 8.1
Подскажите, как можно переписать конфиг, что бы он пришел к нормальному виду?

Код: Выделить всё

# uname -a
FreeBSD out 10.4-RELEASE-p9 FreeBSD 10.4-RELEASE-p9

Код: Выделить всё

# sysctl -a | grep one_pass
net.inet.ip.fw.one_pass: 1
конфиг ipfw

Код: Выделить всё

#!/bin/sh
ipfw -f flush
ipfw -f pipe flush
ipfw -f queue flush

cmd="/sbin/ipfw add"

LanOut="bge1" # Внешняя сетевуха
IpOut="xxx.xxx.xxx.xxx" # Внешний IP

LanIn="bge0" # внутренняя сетевуха
NetIn="192.168.0.0/23" # Внутренняя сеть
openvpn_if="tun0"       #OpenVPN port
IpVPN="192.168.225.0"
skip="skipto 851"
skip2="skipto 855"

#NAT 
ipfw nat 123 config if $LanOut log same_ports reset redirect_port tcp 192.168.0.15:443 443 redirect_port tcp 192.168.0.15:80 80 redirect_port tcp 192.168.0.15:993 993 redirect_port tcp 192.168.0.7:14000 14000 redirect_port tcp 192.168.0.7:13000 13000 redirect_port udp 192.168.0.7:15000 15000



#local
$cmd 105 allow all from any to any via $LanIn
#VPN
$cmd 106 allow all from any to any via tun0
# loopback
$cmd 101 allow all from any to any via lo0

# Считаем трафик
# SMTP
$cmd 020 count tcp from any 25 to any out via $LanOut
$cmd 021 count tcp from any to any 25 in via $LanOut
#PROXY
$cmd 022 count tcp from any 3128 to any out via $LanOut
$cmd 023 count tcp from any to any 3128 in via $LanOut
# Kamera
$cmd 024 count tcp from any 554 to any in via $LanOut
$cmd 025 count tcp from any to any 554 out via $LanOut
#OpenVPN
$cmd 026 count tcp from any 2000 to any out via $LanOut
$cmd 027 count tcp from any to any 2000 in via $LanOut
# ALL
$cmd 029 count ip from any to any out via $LanOut
$cmd 028 count ip from any to any in via $LanOut


#Incoming traffic to NAT
$cmd 130 nat 123 ip from any to any in via $LanOut


#Allow DYN rules
$cmd 140 check-state

# DNS resolve
$cmd 172 $skip ip from any 53 to any via $LanOut
$cmd 173 $skip ip from any to any 53 via $LanOut

# Outgoing server to Internet
$cmd 180 $skip ip from me to any out via $LanOut setup keep-state

# ICMP
$cmd 200 $skip icmp from any to any out via $LanOut

# OpenVPN
$cmd 201 $skip tcp from any to ${IpOut} 2000 in via ${LanOut}
$cmd 202 $skip tcp from ${IpOut} 2000 to any out via ${LanOut}
$cmd 203 $skip all from any to any in via ${openvpn_if}
$cmd 204 $skip all from any to any out via ${openvpn_if}

# Time
$cmd 209 $skip udp from any to any 123 out via $LanOut
$cmd 210 $skip udp from any 123 to any in recv $LanOut

# Postal service
$cmd 211 $skip tcp from any to me 25 in via $LanOut
$cmd 212 $skip tcp from me 25 to any out via $LanOut
$cmd 213 $skip tcp from any to 80.93.62.30 25 via $LanOut
$cmd 215 $skip tcp from any to 80.93.62.23 110 via $LanOut

# ATS
$cmd 223 $skip ip from 193.201.230.128/26 to 192.168.0.91 in recv $LanOut
$cmd 224 $skip ip from 192.168.0.91 to 193.201.230.128/26 out via $LanOut
$cmd 225 $skip ip from 193.201.230.128/26 to 192.168.0.92 in recv $LanOut
$cmd 226 $skip ip from 192.168.0.92 to 193.201.230.128/26 out via $LanOut
$cmd 220 deny ip from not 193.201.230.128/26 to me 5060 in via $LanOut

#Skype
$cmd 235 $skip ip from "table(1)" to any in via $LanOut
$cmd 236 $skip ip from any to "table(1)" out via $LanOut

#NAT for Iphone and etc
$cmd 263 $skip ip from any to "table(3)" in via $LanOut
$cmd 264 $skip ip from "table(3)" to any out via $LanOut


# mail
$cmd 321 $skip ip from any to 192.168.0.15 443,80,993 in via $LanOut
$cmd 322 $skip ip from 192.168.0.15 443,80,993 to any out via $LanOut

#Открываем Глонасс
$cmd 341 $skip ip from any 2225-2230 to any out via $LanOut
$cmd 342 $skip ip from any to any 2225-2230 in via $LanOut

# FTP
$cmd 373 $skip ip from any to me 20-21 in via $LanOut
$cmd 374 $skip ip from me 20-21 to any out via $LanOut

#Разрешаем определенный ICMP-трафик из мира к нам
$cmd 391 $skip icmp from any to me in via $LanOut icmptype 3,8,12

#Разрешаем определенный ICMP-трафик от нас в мир
$cmd 392 $skip icmp from me to any out via $LanOut icmptype 0,3,4,11,12

#Запрещаем прочий ICMP-трафик
$cmd 429 deny log icmp from any to me in via $LanOut icmptype 5,9,10,13,15,17

# Deny all inbound traffic from non-routable reserved address spaces
$cmd 430 deny all from 192.168.0.0/16 to any in via $LanOut
$cmd 431 deny all from 172.16.0.0/12 to any in via $LanOut
$cmd 432 deny all from 10.0.0.0/8 to any in via $LanOut
$cmd 433 deny all from 127.0.0.0/8 to any in via $LanOut
$cmd 434 deny all from 0.0.0.0/8 to any in via $LanOut
$cmd 435 deny all from 169.254.0.0/16 to any in via $LanOut
$cmd 436 deny all from 192.0.2.0/24 to any in via $LanOut
$cmd 437 deny all from 204.152.64.0/23 to any in via $LanOut
$cmd 438 deny all from 224.0.0.0/3 to any in via $LanOut

# Deny ident
$cmd 439 deny tcp from any to any 113 in via $LanOut

#Netbios
$cmd 440 deny tcp from any to any 137 via $LanOut
$cmd 441 deny tcp from any to any 138 via $LanOut
$cmd 442 deny tcp from any to any 139 via $LanOut
$cmd 443 deny tcp from any to any 81 via $LanOut

# Deny fragments packets
$cmd 444 deny all from any to any frag in via $LanOut

# Deny ACK packets that did not match the dynamic rule table
$cmd 445 deny tcp from any to any established in via $LanOut

# Allow in ssh from Internet
$cmd 500 allow tcp from xxx.xxx.xxx.xxx to me 22 in via $LanOut setup limit src-addr 1

# Reject incomming traffic from Inet
$cmd 600 deny log all from any to any in via $LanOut

# Reject outgoing traffic to Inet
$cmd 610 deny log all from any to any out via $LanOut

# NAT from local to Inet
$cmd 851 nat 123 log ip from $NetIn to any out via $LanOut

$cmd 853 allow ip from any to any

$cmd 855 nat 123 log ip from $NetIn to any via $LanOut
$cmd 857 allow ip from any to any

$cmd 999 deny log all from any to any

7 guest
проходил мимо

Подробное руководство по ipfw nat

Непрочитанное сообщение 7 guest » 2018-06-15 20:00:08

Конфиг на 4+.
Главное - читается легко. Хотя можно сделать лучше.
Правило $skip натит только исходящие пакеты. Ссылаются на него правила и для входящих пакетов. Во многих местах бессмысленный порядок прохода правил.
$LanOut в каждой строчке. Проще в начале правил нарезать секции по интерфейсам через skipto.
Входящий и исходящий трафик лучше оформляется отдельными подсекциями. Для NAT это существенно упрощает понимание правил. Протоколы делаются внутри каждой подсекции отдельно.
ip тоже что all, для многих секций можно конкретно указать tcp|udp.
Локальная сеть обозначена, но практический не используется, пример:

Код: Выделить всё

# DNS resolve
$cmd 172 $skip ip from any 53 to any via $LanOut
$cmd 173 $skip ip from any to any 53 via $LanOut
Должно быть:

Код: Выделить всё

$cmd 172 $skip ip from any 53 to $LanIn via $LanOut in
$cmd 173 $skip ip from $LanIn to any 53 via $LanOut out


Аватара пользователя
Sindikat88
мл. сержант
Сообщения: 138
Зарегистрирован: 2010-09-02 15:07:54
Контактная информация:

Подробное руководство по ipfw nat

Непрочитанное сообщение Sindikat88 » 2018-06-18 13:35:25

При таком правиле

Код: Выделить всё

$cmd 172 $skip ip from any 53 to $LanIn via $LanOut in
получаем

Код: Выделить всё

ipfw: hostname ``bge0'' unknown


Аватара пользователя
Sindikat88
мл. сержант
Сообщения: 138
Зарегистрирован: 2010-09-02 15:07:54
Контактная информация:

Подробное руководство по ipfw nat

Непрочитанное сообщение Sindikat88 » 2018-06-18 16:55:10

7 guest, это я знаю.
Просто написал, что при таком написании, правило не работает.
А если сделать так:
1. меняем номер правила 130 на 840
2. прописываем
skip3="skipto 840"
3. изменяем правила

Код: Выделить всё

$cmd 172 $skip3 ip from any 53 to $NetIn via $LanOut in
$cmd 173 $skip ip from $NetIn to any 53 via $LanOut out
Так будет правильнее?

7 guest
проходил мимо

Подробное руководство по ipfw nat

Непрочитанное сообщение 7 guest » 2018-06-19 8:49:40

Мой конфиг.

Код: Выделить всё

fwcmd="/sbin/ipfw -q"
#fwcmd="/sbin/ipfw"
${fwcmd} -f flush

APP_IP=nnn.nnn.nnn.nnn
APP_GW=nnn.nnn.nnn.nnn
MGMT=nnn.nnn.nnn.nnn,nnn.nnn.nnn.nnn

WHITE_IP=${APP_IP}


${fwcmd} disable one_pass
${fwcmd} nat flush
${fwcmd} nat 1 config ip ${APP_IP} \
	redirect_port tcp 192.168.1.2:7256 7256 \
	redirect_port tcp 192.168.1.2:7256 31029 \
	redirect_port tcp 192.168.1.2:36849 36849 \
	redirect_port tcp 192.168.1.3:50638 50638

${fwcmd} add 10 allow via lo0
${fwcmd} add 20 deny log { dst-ip 127.0.0.0/8 or src-ip 127.0.0.0/8 }

${fwcmd} add 30 deny log not verrevpath src-ip 192.168.0.0/16 in

################################################
# interface
################################################
${fwcmd} add 40 skipto 90 via vmx2
${fwcmd} add 50 skipto 230 via vmx0
${fwcmd} add 60 skipto 190 via ng0
${fwcmd} add 70 skipto 210 via ng*
${fwcmd} add 80 deny log all from any to any


################################################
# LAN
################################################

${fwcmd} add 100 skipto 140 out

#in
${fwcmd} add 110 fwd 192.168.1.1,25 src-ip 192.168.1.0/24 dst-port smtp 
${fwcmd} add 120 allow src-ip 192.168.1.0/24
${fwcmd} add 130 deny log all from any to any

#out

${fwcmd} add 150 skipto 570 src-ip 192.168.10.0/24,192.168.1.0/24 out
${fwcmd} add 160 deny src-ip 192.168.0.0/16,172.16.0.0/12,10.0.0.0/8 out
${fwcmd} add 180 allow all from any to any out



################################################
# VPN static
################################################

${fwcmd} add 200 allow all from any to any


################################################
# PPTP
################################################

${fwcmd} add 220 allow all from any to any


################################################
# INET
################################################

${fwcmd} add 240 skipto 420 out

#####################################
# inet in
#####################################
${fwcmd} add 250 count dst-ip ${APP_IP}
${fwcmd} add 260 deny not dst-ip ${WHITE_IP}
${fwcmd} add 270 nat 1 dst-ip ${APP_IP}

${fwcmd} add 280 skipto 320 not dst-ip 192.168.1.0/24
${fwcmd} add 290 count dst-ip 192.168.1.1
${fwcmd} add 300 count dst-ip 192.168.1.2
${fwcmd} add 310 count dst-ip 192.168.1.3


${fwcmd} add 330 skipto 540 proto tcp established
${fwcmd} add 340 skipto 540 proto ip frag
${fwcmd} add 350 skipto 540 not dst-ip ${WHITE_IP}

#${fwcmd} add nn deny log proto udp dst-port socks,3306,domain
#${fwcmd} add nn deny log proto tcp dst-port socks,3306,8080 setup
${fwcmd} add 360 skipto 540 { proto icmp or proto gre or proto esp }
${fwcmd} add 370 skipto 540 proto tcp dst-port ssh,pptp,49152-65535 setup
${fwcmd} add 380 skipto 540 proto tcp dst-port http,https,isakmp setup
${fwcmd} add 390 skipto 540 proto tcp dst-port ftp,ftp\\-data setup
${fwcmd} add 400 skipto 540 proto udp dst-port l2tp,ntp,isakmp,10000-65535
${fwcmd} add 410 deny log all from any to any


#####################################
# inet out
#####################################

${fwcmd} add 430 deny log dst-ip 192.168.0.0/16,172.16.0.0/12,10.0.0.0/8

${fwcmd} add 440 count src-ip 192.168.1.1
${fwcmd} add 450 count src-ip 192.168.1.2
${fwcmd} add 460 count src-ip 192.168.1.3

# exists NAT
${fwcmd} add 470 nat global not src-ip ${WHITE_IP}
${fwcmd} add 480 skipto 540 src-ip ${WHITE_IP}

# Access to NAT
${fwcmd} add 490 skipto 510 src-ip 192.168.1.0/24
${fwcmd} add 500 unreach net-prohib log { not src-ip me or dst-ip 192.168.0.0/16 }


${fwcmd} add 520 nat 1 all from any to any 
${fwcmd} add 530 skipto 540 all from any to any


#####################################
# shaper
#####################################

${fwcmd} add 550 count src-ip ${APP_IP}
${fwcmd} add 560 allow all from any to any


# LAN

${fwcmd} add 580 allow all from any to any

gyurza2000
лейтенант
Сообщения: 895
Зарегистрирован: 2007-07-08 23:53:20
Откуда: SPb
Контактная информация:

Подробное руководство по ipfw nat

Непрочитанное сообщение gyurza2000 » 2018-10-13 13:31:25

не работает редирект. Хочу пробросить RDP через FreeBSD Gate и, следующий за ним, Zyxel.
Топология:
В инет смотрит FreeBSD 11.2 и передаёт трафик дальше - на роутер Zyxel
IP FreeBSD внутрь - 192.168.0.254

IP Zyxel наружу - 192.168.0.1
IP Zyxel внутрь - 192.168.1.1

IP компа(стоящего ЗА Zyxel), на который нужно пробросить 192.168.1.48

В скрипте ipfw прописано:

Код: Выделить всё

${FwCMD} nat 1 config if ${ExtIF} log reset same_ports unreg_only redirect_port tcp 192.168.0.1:3389 3399
${FwCMD} add 500 nat 1 ip from any to any via ${ExtIF}
В Zyxel в "Правила трансляции сетевых адресов (NAT)"
прописано перенаправлять все входящие TCP 3389 на 192.168.1.48:3389

Тестирование порта 3399 снаружи на открытость, говорит, что он закрыт...
Xeon X5460, RAM 8Gb, FreeBSD 13.1-RELEASE on amd64, Apache 2.4, PHP 7.3.30, MySQL 5.7, Exim 4.95_5, Dovecot 2.3.19.1

usrZorg
проходил мимо
Сообщения: 5
Зарегистрирован: 2011-05-13 9:00:27

Подробное руководство по ipfw nat

Непрочитанное сообщение usrZorg » 2018-11-28 23:11:21

Здравствуйте уважаемые гуру FreeBSD, ipfw и ядерного NAT-а.
Прошу помощи застрял.
Сейчас подключаю через подгрузку модуля NAT.
kldstat:

Код: Выделить всё

Id Refs Address            Size     Name
 1   18 0xffffffff80200000 20647f8  kernel
 2    3 0xffffffff82419000 20198    ipfw.ko
 3    1 0xffffffff8243a000 107a0    dummynet.ko
 4    1 0xffffffff8244b000 21b0     ipfw_nat.ko
 5    1 0xffffffff8244e000 a4f2     libalias.ko
Проблема нету доступа в интернет у самого роутера, то есть остальные ходят в интернет сам роутер нет.

rc.conf:

Код: Выделить всё

firewall_enable="YES"
firewall_nat_enable="YES"
dummynet_enable="YES"
firewall_script="/etc/ipfw_rules.sh"
ipfw_rules.sh:

Код: Выделить всё

#!/bin/sh

################################################################################

ipfw="/sbin/ipfw -q"

################################################################################

${ipfw} flush
${ipfw} queue flush
${ipfw} pipe flush
${ipfw} nat flush
#${ipfw} table all flush
${ipfw} zero

################################################################################

${ipfw} disable one_pass
#${ipfw} enable one_pass

################################################################################

wan_if="vlan3101"
wan_ip="192.168.31.251"
wan_ip_alias0="192.168.31.252"
wan_ip_alias1="192.168.31.253"
wan_ip_alias2="192.168.31.254"


lan_if_1="vlan3201"
lan_if_2="vlan3301"
lan_if_3="vlan3401"
lan_if_4="vlan3501"

################################################################################


${ipfw} add 110 check-state


###

${ipfw} add 121 deny ip4 from 192.168.34.0/24 to 192.168.32.0/24
${ipfw} add 122 deny ip4 from 192.168.34.0/24 to 192.168.33.0/24

${ipfw} add 123 deny ip4 from 192.168.33.0/24 to 192.168.32.0/24
${ipfw} add 124 deny ip4 from 192.168.32.0/24 to 192.168.33.0/24

###


${ipfw} add 131 allow ip from any to any via ${lan_if_1}
${ipfw} add 132 allow ip from any to any via ${lan_if_2}
${ipfw} add 133 allow ip from any to any via ${lan_if_3}
${ipfw} add 134 allow ip from any to any via ${lan_if_4}

${ipfw} add 140 allow ip4 from any to me dst-port 22

${ipfw} add 150 allow ip4 from me to any
# если раскомментировать не работает NAT, но сервер выходит в интернет
#${ipfw} add 160 allow ip4 from any to me

#${ipfw} add 210 deny ip from any to 192.168.0.0/16 in recv ${wan_if}
#${ipfw} add 220 deny ip from 192.168.0.0/16 to any in recv ${wan_if}
${ipfw} add 230 deny ip from any to 172.16.0.0/12 in recv ${wan_if}
${ipfw} add 240 deny ip from 172.16.0.0/12 to any in recv ${wan_if}
${ipfw} add 250 deny ip from any to 10.0.0.0/8 in recv ${wan_if}
${ipfw} add 260 deny ip from 10.0.0.0/8 to any in recv ${wan_if}
${ipfw} add 270 deny ip from any to 169.254.0.0/16 in recv ${wan_if}
${ipfw} add 280 deny ip from 169.254.0.0/16 to any in recv ${wan_if}


###


${ipfw} pipe 1 config bw 10Mbit/s queue 60 gred 0.002/10/30/0.1 
${ipfw} queue 1 config pipe 1 queue 60 mask src-ip 0xffffffff gred 0.002/10/30/0.1

${ipfw} pipe 2 config bw 10Mbit/s queue 60 gred 0.002/10/30/0.1
${ipfw} queue 2 config pipe 2 queue 60 mask dst-ip 0xffffffff gred 0.002/10/30/0.1


###


${ipfw} nat 1 config log if ${wan_if} reset same_ports deny_in

${ipfw} nat 2 config log same_ports redirect_addr 192.168.33.101 192.168.31.252

${ipfw} nat 3 config log ip 192.168.31.253 same_ports reset deny_in

${ipfw} nat 4 config log ip 192.168.31.254 same_ports reset deny_in


###


# nat 4
${ipfw} add 310 skipto 4000 ip from 192.168.35.0/24 to any out xmit ${wan_if}
${ipfw} add 320 skipto 4130 ip from any to 192.168.31.254 in recv ${wan_if}


# nat 3
${ipfw} add 330 skipto 3000 ip from 192.168.34.0/24 to any out xmit ${wan_if}
${ipfw} add 340 skipto 3130 ip from any to 192.168.31.253 in recv ${wan_if}


# nat 2
${ipfw} add 350 skipto 2000 ip from 192.168.33.101 to any out xmit ${wan_if}
${ipfw} add 360 skipto 2130 ip from any to 192.168.31.252 in recv ${wan_if}



###


# nat 1
${ipfw} add 1110 queue 1 ip from any to any out xmit ${wan_if}
${ipfw} add 1120 nat 1 ip from any to any via ${wan_if}
${ipfw} add 1130 queue 2 ip from any to any in recv ${wan_if}

${ipfw} add 1140 allow all from any to any


###


# nat 2
${ipfw} add 2110 queue 1 ip from any to any out xmit ${wan_if}
${ipfw} add 2120 nat 2 ip from 192.168.33.101 to any out xmit ${wan_if}
${ipfw} add 2130 nat 2 ip from any to 192.168.31.252 in recv ${wan_if}
${ipfw} add 2140 queue 2 ip from any to any in recv ${wan_if}

${ipfw} add 2150 allow all from any to any


###


# nat 3
${ipfw} add 3110 queue 1 ip from any to any out xmit ${wan_if}
${ipfw} add 3120 nat 3 ip from 192.168.34.0/24 to any out xmit ${wan_if}
${ipfw} add 3130 nat 3 ip from any to 192.168.31.253 in recv ${wan_if}
${ipfw} add 3140 queue 2 ip from any to any in recv ${wan_if}

${ipfw} add 3150 allow all from any to any


###


# nat 4

${ipfw} add 4110 queue 1 ip from any to any out xmit ${wan_if}
${ipfw} add 4120 nat 4 ip from 192.168.35.0/24 to any out xmit ${wan_if}
${ipfw} add 4130 nat 4 ip from any to 192.168.31.254 in recv ${wan_if}
${ipfw} add 4140 queue 2 ip from any to any in recv ${wan_if}

${ipfw} add 4150 allow all from any to any


###


${ipfw} add 65534 deny all from any to any

loader.conf:

Код: Выделить всё

net.inet.ip.fw.default_to_accept=1
sysctl.conf:

Код: Выделить всё

net.inet.ip.fw.one_pass=1
net.inet.ip.fastforwarding=1
net.inet.tcp.nolocaltimewait=1
net.inet.ip.portrange.randomized=0
net.inet.ip.dummynet.io_fast=1
net.inet.ip.forwarding=1

usrZorg
проходил мимо
Сообщения: 5
Зарегистрирован: 2011-05-13 9:00:27

Подробное руководство по ipfw nat

Непрочитанное сообщение usrZorg » 2018-11-29 13:54:46

Всем доброго дня.
Сам спросил сам отвечаю.
Решение проблемы убрать из конфига первого NAT-а опцию deny_in
Было:

Код: Выделить всё

${ipfw} nat 1 config log if ${wan_if} reset same_ports deny_in
Стало:

Код: Выделить всё

${ipfw} nat 1 config log if ${wan_if} reset same_ports
Прошу прокоментировать насколько правильно это.
Возможно кто-то подскажет альтернативное решение?

gyurza2000
лейтенант
Сообщения: 895
Зарегистрирован: 2007-07-08 23:53:20
Откуда: SPb
Контактная информация:

Подробное руководство по ipfw nat

Непрочитанное сообщение gyurza2000 » 2020-11-28 13:47:51

Никак не пробрасывается порт на RDP на машину в локальной сети.

Код: Выделить всё

# uname -a
FreeBSD 12.1-RELEASE-p10 FreeBSD 12.1-RELEASE-p10 GENERIC  amd64
sysctl.conf

Код: Выделить всё

net.inet.ip.fw.verbose=1
net.inet.ip.fw.verbose_limit=100
net.inet.ip.fw.one_pass=0
kldstat

Код: Выделить всё

Id Refs Address                Size Name
 1   20 0xffffffff80200000  2448f20 kernel
 2    1 0xffffffff82649000     6630 ipfw_nat.ko
 3    2 0xffffffff82650000    49ba8 ipfw.ko
 4    2 0xffffffff8269a000    140c8 libalias.ko
 5    1 0xffffffff826b0000    281e0 geom_mirror.ko
 6    1 0xffffffff826d9000    262b0 fuse.ko
 7    1 0xffffffff82821000   2472e0 zfs.ko
 8    1 0xffffffff82a69000     7628 opensolaris.ko
rc.conf

Код: Выделить всё

gateway_enable="YES"
firewall_enable="YES"
firewall_script="/etc/ip.fw"
firewall_logging="YES"
firewall_nat_enable="YES"
firewall_nat_interface="igb0"
ip.fw

Код: Выделить всё

# 
${ipfw} nat 1 config log if ${LanOut} reset same_ports redirect_port tcp ${HOME}:3389 3399
# 
${ipfw} add 300 nat 1 all from any to any out via ${LanOut}
${ipfw} add 310 nat 1 all from any to any in via ${LanOut}
Что сделано не так?
Xeon X5460, RAM 8Gb, FreeBSD 13.1-RELEASE on amd64, Apache 2.4, PHP 7.3.30, MySQL 5.7, Exim 4.95_5, Dovecot 2.3.19.1

KennyMc
проходил мимо
Сообщения: 5
Зарегистрирован: 2017-06-13 20:38:25

Подробное руководство по ipfw nat

Непрочитанное сообщение KennyMc » 2020-12-04 23:16:38

На одной из тестовых машин редирект стоял такой :

Код: Выделить всё

${ipfw} nat 1 config log if ${OutIf} reset same_ports deny_in redirect_port tcp 192.168.1.6:3389 7777 redirect_port udp 192.168.1.6:3389 7777
И все работало. Не помню почему так сделали, вроде без udp как раз и не работало