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

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
usrZorg
проходил мимо
Сообщения: 3
Зарегистрирован: 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/
Выделенные сервера, Россия, Москва, от 2520 рублей (8 CPU, 8Gb RAM, 2x500Gb HDD, RAID 3ware 9750):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/