Ipfw

Настройка сетевых служб, маршрутизации, фаерволлов. Проблемы с сетевым оборудованием.
Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Tekron
проходил мимо
Сообщения: 9
Зарегистрирован: 2019-10-30 21:23:18

Ipfw

Непрочитанное сообщение Tekron » 2021-02-10 12:19:33

Приветствую форумчане !
Прошу помощи не могу понять почему к FTP в DMZ не могу подключится из интернета ((

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

#!/bin/sh

# reset rules
ipfw -q -f flush

######################## MAIN ########################
ext="em0"
int="em1"
dmz="em2"
cmd="ipfw -q add"
skip="skipto 3000"

######################## REDIRECT PORT ########################
ipfw -q nat 1 config if em0 same_ports unreg_only \
redirect_port tcp 168.17.16.2:21 21 \
redirect_port tcp 168.17.16.2:20 20 \
redirect_port tcp 168.17.16.2:30000-31000 30000-31000 \
redirect_port tcp 168.17.16.3:25 25 \
redirect_port tcp 78.89.70.72:70000 70000

######################## LAN OUT NETWORK ########################
# anti spoofing
$cmd 01 deny ip from any to any not verrevpath in

# allow root ssh
$cmd 05 allow tcp from $ssha to me 7899 in via $ext setup limit src-addr 2

# ban unfriendly icmp
$cmd 025 deny icmp from any to any in via $ext

# enable loopback and local traffic
$cmd 035 allow ip4 from any to any via lo0
$cmd 036 allow ip4 from any to any via $int

# unnat incoming traffic
$cmd 037 nat 1 ip4 from any to any in via $ext

# allow exchange traffic to lan
$cmd 040 allow tcp from any to 78.89.70.65 443

# allow nto traffic to lan
$cmd 046 allow tcp from any to 78.89.70.72 70000

######################## LAN IN NETWORK ########################
$cmd 050 check-state

# nat
$cmd 0200 $skip tcp from any to any out via $ext setup keep-state
$cmd 0210 $skip icmp from any to any out via $ext keep-state
$cmd 0220 $skip udp from any to any out via $ext keep-state

# allow exchange traffic to ext
$cmd 0223 $skip tcp from 78.89.70.65 443 to any

# allow nto traffic to ext
$cmd 0230 $skip tcp from 78.89.70.72 70000 to any

######################## DMZ RULES ########################
# from ext to dmz ftp
$cmd 0240 $skip tcp from any to 168.17.16.2 20,21,30000-31000 in via em0 keep-state

# from ext to dmz exchange edge
$cmd 0241 $skip tcp from any to 168.17.16.3 25 in via em0 keep-state

# from int to dmz ftp
$cmd 0242 allow tcp from any to 168.17.16.2 20,21,30000-31000 keep-state
$cmd 0243 allow tcp from 78.89.70.140 to 168.17.16.2 22 keep-state
$cmd 0244 allow icmp from any to 168.17.16.2 keep-state
$cmd 0245 deny all from 10.0.0.0/8 to 168.17.16.2

# from int to dmz exchange edge
$cmd 0250 allow tcp from 78.89.70.200 to 168.17.16.3 25,50636 keep-state
$cmd 0251 allow tcp from 100.50.40.201 to 168.17.16.3 25,50636 keep-state
$cmd 0252 allow tcp from 78.89.70.140 to 168.17.16.3 3389 keep-state
$cmd 0253 allow icmp from any to 168.17.16.3 keep-state
$cmd 0254 deny all from 10.0.0.0/8 to 168.17.16.3

# from dmz to int ftp
$cmd 0260 deny all from 168.17.16.2 to 10.0.0.0/8

# from dmz to int exchange edge
$cmd 0270 allow tcp from 168.17.16.3 to 78.89.70.65 25 keep-state
$cmd 0271 allow tcp from 168.17.16.3 to 100.50.40.222 25 keep-state
$cmd 0272 allow icmp from 168.17.16.3 to 78.89.70.65 keep-state
$cmd 0273 allow icmp from 168.17.16.3 to 100.50.40.222 keep-state
$cmd 0274 deny all from 168.17.16.3 to 10.0.0.0/8

# from dmz to ext ftp
$cmd 0280 $skip tcp from 168.17.16.2 to any 20,21,53,80,443 in via em2 keep-state
$cmd 0281 $skip udp from 168.17.16.2 to any 53 in via em2 keep-state

# from dmz to ext exchange edge
$cmd 0290 $skip tcp from 168.17.16.3 to any 25,53,80,443 in via em2 setup keep-state
$cmd 0291 $skip udp from 168.17.16.3 to any 53 in via em2 keep-state

######################## DENY RULES ########################
# deny gray networks
$cmd 0300 deny all from 224.0.0.0/3 to any in via $ext
$cmd 0301 deny all from 204.152.64.0/23 to any in via $ext
$cmd 0302 deny all from 192.0.2.0/24 to any in via $ext
$cmd 0303 deny all from 169.254.0.0/16 to any in via $ext
$cmd 0304 deny all from 0.0.0.0/8 to any in via $ext
$cmd 0305 deny all from 10.0.0.0/8 to any in via $ext
$cmd 0306 deny all from 172.16.0.0/12 to any in via $ext
$cmd 0306 deny all from 192.168.0.0/16 to any in via $ext

# deny fragmented packets
$cmd 0310 deny all from any to any frag in via $ext

# deny netbios ports
$cmd 0400 deny tcp from any to any 81 in via $ext
$cmd 0401 deny tcp from any to any 113 in via $ext
$cmd 0402 deny tcp from any to any 137 in via $ext
$cmd 0403 deny tcp from any to any 138 in via $ext
$cmd 0404 deny tcp from any to any 139 in via $ext

# deny all
$cmd 0500 deny log all from any to any in via $ext
$cmd 0510 deny log all from any to any out via $ext

# nat out point
$cmd 3000 nat 1 ip from any to any out via em0
$cmd 5000 allow ip from any to any

# deny all other
$cmd 6000 deny log all from any to any
[code]

Хостинговая компания 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/

Demis
ст. сержант
Сообщения: 396
Зарегистрирован: 2015-05-25 14:36:32

Ipfw

Непрочитанное сообщение Demis » 2021-02-11 20:35:47

Смотрите:
Tekron писал(а):
2021-02-10 12:19:33
ext="em0"
Tekron писал(а):
2021-02-10 12:19:33
skip="skipto 3000"
Tekron писал(а):
2021-02-10 12:19:33
ipfw -q nat 1 config if em0 same_ports unreg_only \ redirect_port tcp 168.17.16.2:21 21 \ redirect_port tcp 168.17.16.2:20 20 \
Tekron писал(а):
2021-02-10 12:19:33
# from ext to dmz exchange edge $cmd 0241 $skip tcp from any to 168.17.16.3 25 in via em0 keep-state
Tekron писал(а):
2021-02-10 12:19:33
# nat out point $cmd 3000 nat 1 ip from any to any out via em0
Tekron писал(а):
2021-02-10 12:19:33
$cmd 036 allow ip4 from any to any via $int # unnat incoming traffic $cmd 037 nat 1 ip4 from any to any in via $ext
Если я правильно увидел то, что написано, то не совсем догоняю некоторые моменты:
1. где происходит установка входящего пакета на фтп.
2. насколько понимаю адрес 168.17.16.2 является белым.
Тогда зачем его вообще гнать через нат?
Достаточно прямую перекидку пакетов сделать ДО ната.
Что-то вроде:

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

$cmd 036 tcp from any to 168.17.16.2 20,21,30000-31000 in via em0
Вы уверены, что подключающийся из вне клиент (когда будет качать к себе) будет сидеть в диапазоне 30000-31000?
Только 036 переписать нужно, у Вас уже забит этот номер. Ну и остальные, обратные, пакеты проработать.

Tekron
проходил мимо
Сообщения: 9
Зарегистрирован: 2019-10-30 21:23:18

Ipfw

Непрочитанное сообщение Tekron » 2021-02-12 11:02:19

Спасибо за ответ.
168.17.16.2 это ip сети DMZ, это не внешний ip.
У DMZ и LAN сетей один внешний ip предположим, что 111.111.111.111 сидит он на ext=em0 интерфейсе и за выход в инет отвечает # nat out point $cmd 3000 nat 1 ip from any to any out via em0

Фишка в том я хочу добиться того чтобы DMZ сеть вообще не стучалась никак в LAN сетку и и у нее был интернет строго через ext=em0
Во всяком я представляю так себе DMZ, что это отдельная глухая сеть без общения с другими сетями исключение это только Exchange ну или Skype Server.

Вы уверены, что подключающийся из вне клиент (когда будет качать к себе) будет сидеть в диапазоне 30000-31000?
Ну да так задумано было изначально и настроено у клиентов

Demis
ст. сержант
Сообщения: 396
Зарегистрирован: 2015-05-25 14:36:32

Ipfw

Непрочитанное сообщение Demis » 2021-02-12 13:17:43

Tekron писал(а):
2021-02-12 11:02:19
168.17.16.2 это ip сети DMZ, это не внешний ip.
"не внешний ip" - внешний ip или не внешний ip не суть важно, важно что это белый университетский IP который маршрутизируется в сети Интернет. https://search.arin.net/rdap/?query=168.17.16.2
И это важно понимать и помнить при построении правил доступа из вне (Вы-же помните что написали "
Tekron писал(а):
2021-02-10 12:19:33
почему к FTP в DMZ не могу подключится из интернета
").
Если-бы это был IP из серой сетки, например 192.168.17.16, вопросов-бы не возникло.
А так пакеты из внешнего мира будут идти по общим правилам маршрутизации для сети 168.17.16 .
Не суть.
Сказал-бы что архитектурно должно быть примерно так:

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

09100     27826      1731952 allow tcp from any 1024-65535 to 111.111.111.11 dst-port 80
11000  15380283   2314586288 divert 8668 ip from 192.168.5.0/24,192.168.2.0/24,192.168.3.2,192.168.4.0/24 to any out via em0
11050  34300842  24034149466 divert 8668 ip from any to 111.111.111.11 in via em0
15070     14526       581136 allow tcp from any to 192.168.5.22 dst-port 80 via em0
21520     11955       592164 allow tcp from any 1024-65535 to 192.168.6.23 dst-port 80
... и т.д.
при этом 111.111.111.11 это em0
и 192.168.5.0/24,192.168.2.0/24,192.168.3.2,192.168.4.0/24 это em1
И нат прописан по классике в /etc/rc.conf

Важно помнить, что изначально построение на методике "скипто, кипстейт" это примерно как с известным крепким напитком, с клапаном на горлышке, т.е. в рюмку льется, а обратно никак.
И чтобы залить обратно нужно сверлить дырку.

В Вашем случает что-то вроде:

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

        # Allow access to our WWW
        ${fwcmd} add pass tcp from any to me 80 setup
из раздела SIMPLE ([Ss][Ii][Mm][Pp][Ll][Ee]) чудо файлика ee /etc/rc.firewall
Который есть на всех современных FreeBSD по дефолту.
Там-же есть и примеры входящих пакетов.
Вообще много чего есть почитать интересного.
Но также учесть, что там многое построено по принципу вызовов подпрограмм.
И просто нужно корректно составить их последовательность вызова для получения понимания "а как это они делают и для чего".

Именно отсутствие "tcp from any to me 80 setup" мной имелось ввиду
под фразой "1. где происходит установка входящего пакета на фтп.".
Ну понятно, что в примере 80 порт, сути не меняет, замените.

Лично меня неоднозначность прохождения пакетов после "массы установок" бесит.
Технических проблем нет, все четко.
А вот логические (в голове), когда ищешь камень преткновения, есть.
Никак не ожидаешь, что "а вот оно куда на самом деле ушло, блин, но это-же совсем не то, что я думал когда делал".
Поэтому давно отошел от оного.

Если
Tekron писал(а):
2021-02-12 11:02:19
DMZ сеть вообще не стучалась никак в LAN сетку
, то лучше вешать на отдельный интерфейс.
Если все висит на одном, то стучаться будет всегда.
Хотя можно и существенно подрезать.
Но точно не с помощью метода "сетуп, скипто, кипстейт", посколько будет создаваться масса "автосозданных правил" и они нивелируют до нельзя то, что хочется получить.

Тут тогда (на мой взгляд) нужно применять, условно, "шести правильный" метод.
Когда у нас два интерфейса.

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

em0 - внешка.
em1 - нутрянка.

tcp allow from any to 111.111.111.11 80 in recv em0
tcp allow from 111.111.111.11 80 to any  out xmit em0

tcp allow from any to IP_DMZ 80 in recv em1
tcp allow from IP_DMZ 80 to any  out xmit em1

tcp allow from 111.111.111.11 80 to IP_DMZ out xmit em1
tcp allow from IP_DMZ 111.111.111.11 80 to IP_DMZ in recv em1
Составил на память (и это без ната), мог ошибиться.
Очень рекомендую почитать статью Вадима Гончарова https://nuclight.livejournal.com/124348.html и ее продолжение https://nuclight.livejournal.com/125453.html

По поводу DMZ (Вашего "
Tekron писал(а):
2021-02-12 11:02:19
DMZ, что это отдельная глухая сеть без общения с другими сетями
"), это демилитаризованная зона.
Суть термина DMZ именно в том, что это открытая зона, а не защищенная, хотя и ее мы тоже пытаемся прикрывать по возможности.

Пришлось понаписать кучу "воды", вместо конкретного ответа на Ваш вопрос. Простите...
М.б. еще кто, что напишет про желаемое ТС в варианте "сетуп, скипто, кипстейт"???

Tekron
проходил мимо
Сообщения: 9
Зарегистрирован: 2019-10-30 21:23:18

Ipfw

Непрочитанное сообщение Tekron » 2021-02-12 23:18:29

Спасибо за ответ

Все Ip вымышленные )
Так если быть точным у меня есть сетка локалка и я хочу сделать еще dmz и туда поместить edge и ftp.
У интернета есть пять белых адресов.

Внешняя сеть (интернет) em 0
111.111.111.1
111.111.111.2
111.111.111.3
111.111.111.4
111.111.111.5

Локальная сеть со всеми компами em 1
192.168.50.0/24

Сеть DMZ em2
172.140.70.0/24

VPN tun0
192.168.100.0/24

Ну конечно компилированное ядро freebsd 12.1 с включением nat (не natd) и ipfw
# ipfw
options IPFIREWALL
options IPFIREWALL_NAT
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
options LIBALIAS
options DUMMYNET
options ROUTETABLES=3

rc.conf

# Gateway mode
gateway_enable="YES"
# IPFW mode
firewall_enable="YES"
firewall_nat_enable="YES"
firewall_script="/etc/ipfw.rules"

sysctl
net.inet.ip.fw.one_pass=0

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

#!/bin/sh
# reset rules
ipfw -q -f flush
######################## MAIN ########################
ext="em0"
int="em1"
dmz="em2"
vpn="tun0"
cmd="ipfw -q add"
skip="skipto 3000"
ssha="192.168.50.10"
######################## REDIRECT PORT ########################
ipfw -q nat 1 config if em0 same_ports unreg_only \
redirect_port tcp 172.140.70.2:21 21 \
redirect_port tcp 172.140.70.2:20 20 \
redirect_port tcp 172.140.70.2:30000-31000 30000-31000 \
redirect_port tcp 172.140.70.3:25 25 \
redirect_port tcp 192.168.50.20:443 443
######################## LAN OUT NETWORK em 1 ########################
# anti spoofing
$cmd 01 deny ip from any to any not verrevpath in

# allow root ssh
$cmd 05 allow tcp from $ssha to me 7899 in via $ext setup limit src-addr 1

# allow openvpn
$cmd 011 allow all from any to any via $vpn
$cmd 012 allow udp from any to me 1194
$cmd 013 allow udp from me 1194 to any

# ban unfriendly icmp
$cmd 025 deny icmp from any to any in via $ext

# drop ipv6
$cmd 030 deny ip6 from any to any
$cmd 031 deny udp from any to any dst-port 546
$cmd 032 deny udp from any to any dst-port 547

# enable loopback and local traffic
$cmd 035 allow ip4 from any to any via lo0
$cmd 036 allow ip4 from any to any via $int

# unnat incoming traffic
$cmd 037 nat 1 ip4 from any to any in via $ext

# allow exchange traffic to lan
$cmd 040 allow tcp from any to 192.168.50.20 443
######################## LAN IN NETWORK em 1 ########################
$cmd 050 check-state
# nat
$cmd 0200 $skip tcp from any to any out via $ext setup keep-state
$cmd 0210 $skip icmp from any to any out via $ext keep-state
$cmd 0220 $skip udp from any to any out via $ext keep-state

# allow exchange traffic to ext
$cmd 0223 $skip tcp from 192.168.50.20 443 to any
######################## DMZ RULES em 2 ########################
# from ext to dmz
# edge
$cmd 0250 skipto 3000 tcp from any to 172.140.70.3 25 in via $ext
# ftp
$cmd 0251 skipto 3000 tcp from any to 172.140.70.2 20,21,22,30000-31000 in via $ext

# from int to dmz
#edge
$cmd 0252 allow tcp from 192.168.50.20 to 172.140.70.3 25
$cmd 0253 allow tcp from 192.168.50.20 to 172.140.70.3 50636
$cmd 0254 allow icmp from any to 172.140.70.3
#ftp
$cmd 0255 allow tcp from any to 172.140.70.2 20,21,22,30000-31000
$cmd 0256 allow icmp from any to 172.140.70.2

# from dmz to int
#edge
$cmd 0257 allow tcp from 172.140.70.3 to 192.168.50.20 25
#ftp
$cmd 0258 allow tcp from 172.140.70.2 to any 20,21,22,30000-31000

# from dmz to ext
#edge
$cmd 0260 skipto 3000 tcp from 172.140.70.3 to any 25,53,80,443 in via $dmz
$cmd 0264 skipto 3000 udp from 172.140.70.3 to any 53 in via $dmz
#ftp
$cmd 0266 skipto 3000 tcp from 172.140.70.2 to any 20,21,22,30000-31000 in via $dmz
$cmd 0270 skipto 3000 udp from 172.140.70.2 to any 53 in via $dmz

######################## DENY RULES ########################
# deny gray networks
$cmd 0300 deny all from 224.0.0.0/3 to any in via $ext
$cmd 0301 deny all from 204.152.64.0/23 to any in via $ext
$cmd 0302 deny all from 192.0.2.0/24 to any in via $ext
$cmd 0303 deny all from 169.254.0.0/16 to any in via $ext
$cmd 0304 deny all from 0.0.0.0/8 to any in via $ext
$cmd 0305 deny all from 10.0.0.0/8 to any in via $ext
$cmd 0306 deny all from 172.16.0.0/12 to any in via $ext
$cmd 0306 deny all from 192.168.0.0/16 to any in via $ext

# deny fragmented packets
$cmd 0310 deny all from any to any frag in via $ext

# deny netbios ports
$cmd 0400 deny tcp from any to any 81 in via $ext
$cmd 0401 deny tcp from any to any 113 in via $ext
$cmd 0402 deny tcp from any to any 137 in via $ext
$cmd 0403 deny tcp from any to any 138 in via $ext
$cmd 0404 deny tcp from any to any 139 in via $ext

# deny all
$cmd 0500 deny log all from any to any in via $ext
$cmd 0510 deny log all from any to any out via $ext

# nat out point
$cmd 3000 nat 1 ip from any to any out via em0
$cmd 5000 allow ip from any to any

# deny all other
$cmd 6000 deny log all from any to any

Demis
ст. сержант
Сообщения: 396
Зарегистрирован: 2015-05-25 14:36:32

Ipfw

Непрочитанное сообщение Demis » 2021-02-13 3:46:37

Если все Ваши внешние IP 111.111.111.1-5 корректно прописаны и висят на одном интерфейсе em0, тогда
предположим, что IP 111.111.111.2 для внешнего ftp, а IP 172.140.70.2 для внутреннего (из dmz 172.140.70.0/24)

То Ваши правила должны быть по последовательности примерно такие:

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

allow tcp from any 1024-65535 to 111.111.111.2 80 (обязательно до диверта !)
divert 8668 ip from 172.140.70.0/24,192.168.50.0/24,192.168.100.0/24 to any out via em0
divert 8668 ip from any to 111.111.111.2 in via em0
allow tcp from any 1024-65535 to 172.140.70.2 80
allow tcp from 111.111.111.2 to any dst-port 1024-65535 out xmit em0
Порт 80 можно заменить на 21 - не проблема.
С портом 20 немного сложнее.
По сути все тоже самое, что и для 21-го, но есть фишечка, если я правильно помню,
то когда устанавливается соединение на скачивание файла по 20-ке - обязательно должен выделиться "верхний" сокет.

Т.е. помимо пакетов вида 99.99.99.99:56345 -> 111.111.111.2:20
запустится передача собственно данных по новому каналу 111.111.111.2:54678 -> 99.99.99.99:57890
В Вашем случае, если у Вас действительно жестко и правильно настроены клиенты это будет примерно так:

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

172.140.70.2:30000-31000 -> 99.99.99.99:30000-31000
(ну естественно работать будет один какой-то порт из диапазона 30000-31000)

Все эти моменты Вы можете самостоятельно узреть через tcpdump

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

tcpdump -ni em0 host 111.111.111.2 
tcpdump -ni em1 host 172.140.70.2
tcpdump -ni em0 host 111.111.111.2 and port 80
Посмотреть какой сокет в сетевом стеке занял нат можно так

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

netstat -an | grep div4
div4       0      0 *.123                  *.*
div4       0      0 *.8668                 *.*
или так

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

ipfw -d show
ipfw -d show|grep div
8668 - это классический нат. Вполне возможно, что еще придется раскидывать роутинг по правилам, поскольку у Вас
Tekron писал(а):
2021-02-12 23:18:29
options ROUTETABLES=3
А ни одного правила для таблиц роутинга в Вашем ipfw я не увидел.

Tekron
проходил мимо
Сообщения: 9
Зарегистрирован: 2019-10-30 21:23:18

Ipfw

Непрочитанное сообщение Tekron » 2021-02-24 10:43:13

А возможно ли вообще реализовать dmz без divert?
C настройками ядра:
options IPFIREWALL
options IPFIREWALL_NAT
options IPFIREWALL_VERBOSE
options IPFIREWALL_VERBOSE_LIMIT=100
options LIBALIAS
options DUMMYNET
options ROUTETABLES=3

options ROUTETABLES=3
Табеля у меня добавлены на всякий случай если мне это понадобится.

Если у кого то есть рабочий конфиг с dmz поделитесь пожалуйста я уже переправлю под себя.
Можно самый простой.

Demis
ст. сержант
Сообщения: 396
Зарегистрирован: 2015-05-25 14:36:32

Ipfw

Непрочитанное сообщение Demis » 2021-02-24 21:08:37

Tekron писал(а):
2021-02-24 10:43:13
А возможно ли вообще реализовать dmz без divert?
можно

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

allow tcp from any 1024-65535 to 111.111.111.2 20,21,80
allow tcp from 111.111.111.2 20,21,80 to any 1024-65535
allow tcp from 111.111.111.2 30000-31000 to any 30000-31000
allow tcp from any 30000-31000 to 111.111.111.2 30000-31000
divert 8668 ip from 192.168.50.0/24,192.168.100.0/24 to any out via em0
divert 8668 ip from any to 111.111.111.2 in via em0
Приводил-же пример

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

# Allow access to our WWW
${fwcmd} add pass tcp from any to me 80 setup
В том-же файлике есть и другие варианты.

У Вас, самого, прописано правило "05" для ssh.
Оно, как пример, уже показывает как "устанавливается" коннект.
=============================================
Ну тут вроде не все так сложно, хотя бывает, что сразу и не врубиться.
Вариантов, как всегда, много, но видимо требуются некие комментарии.
Единственное что требуется - соблюдать общие правила для сетей.
Но одно дело - теория и совсем другое - практика.
Понимаю Ваше желание сделать "быстро и в одну строчку, мне тут подскажут".
Но тусовка заключается в том, что такое получается тогда, когда уже есть примерное понимание "как это работает".
(И тут не важна система, юникс, винда, линукс или еще что-то...).
Опять-же основной костяк у Вас уже создан, поэтому примеры не особо нужны.
И единственное, что требуется от Вас (и тут мы подскажем), это подправить Ваши правила в соответствие с тем, что нужно.

Поскольку мне не совсем ясна картина по предоставлению Вам Ваших IP адресов:
Заменю 172.140.70.0/24 на 222.222.222.0/24 (на самом деле это не принципиально и не обязательно, но мне так удобнее).

Обращу Ваше внимание, что у Вас сначала писалось про "У DMZ и LAN сетей один внешний ip предположим, что 111.111.111.111 сидит он на ext=em0 интерфейсе", т.е. вижу один внешний IP.
Потом Ваше хозяйство поменялось на несколько внешних IP

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

 "Внешняя сеть (интернет) em 0
111.111.111.1
111.111.111.2
111.111.111.3
111.111.111.4
111.111.111.5"
Т.е. уже два разных варианта построения сетей.

Это не значит, что так не будет работать,
но это важно помнить при построении сети/сетей
и выработке Ваших правил для обеспечения работоспособности оных.

Вариант "$cmd 036 tcp from any to 168.17.16.2 20,21,30000-31000 in via em0" (для первого варианта Вашего конфига) Вы даже не попробовали.
Либо пробовали, но об этом никто не знает...

Даже если вспомнить Ваш вариант правила для ssh, то чем он отличается от www, не задумывались?
Что мешало пойти по аналогии?
Какой подвох у этого правила?

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

$cmd 05 allow tcp from $ssha to me 7899 in via $ext setup limit src-addr 2
$cmd 06 allow tcp from any to me 80 in via $ext setup
Не думаю, что подумать об этом было-бы сверх сложно.

Бывают разные методы построения сетевых систем, например:
А. Провайдер выделил один белый, внешний, IP адрес (111.111.111.1/32 и Вы прописали его на em0).
Б. Провайдер выделил несколько белых, внешних IP адресов (111.111.111.1-5 и Вы прописали их на em0).
В. Провайдер выделил один серый IP адрес (10.0.0.1), для Вас он внешний (на em0), но пробросил на этот адрес один (или несколько) белых адресов (на em0).
Г. Провайдер выделил один белый, внешний IP адрес вида 111.111.111.1/32 (а точнее речь о 252-ая маске), Вы прописали его на em0, и он-же пробросил через него Вам белую сетку 222.222.222.0/24 и Вы прописали ее/их ip на em1.
Д. Что-то еще...
Методов может быть великое множество (Д, Е, Ж, З, ... и т.д.).
Всех Ваших методов мне не угадать.
Мы также помним, что серые адреса НЕ маршрутизируюся в сети Интернет,
во многом остальном серые адреса практически похожи с белыми.

Предположим, это метод "А", тогда:
Вариант 1

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

allow tcp from any 1024-65535 to 111.111.111.1 20,21,80,30000-31000 (обязательно до диверта !)
allow tcp from 111.111.111.1 20,21,80,30000-31000 to any 1024-65535 (обязательно до диверта !)
divert 8668 ip from 192.168.50.0/24,192.168.100.0/24 to any out via em0
divert 8668 ip from any to 111.111.111.1 in via em0
... остальные правила "для дивертов".
Очень рекомендую на время проверок правил ipfw вместо 30000-31000 использовать 1024-65535.
Это даст Вам возможность понять такой момент в настройке:
"ага, при установленном 30000-31000 все перестало работать.
Почему? М.б. это уже не проблема ipfw, а проблема приложения клиента для ftp?"
.

Вариант 2
...
Не понимаю, стоит-ли продолжать методы и варианты?

Вообще, в ipfw, лучше придерживаться некоего "золотого сечения да винчи", только для сетей,
в такой последовательности:
0. Сброс всего и вся.
1. Начинаем правила всегда с лупбека (127.0.0.1)
2. Первичные ограничения всякой явной левизны.
3. Собственно нужные правила, до диверта.
4. Диверт.
5. Остальные нужные правила, после диверта.
6. Всех в сад (запретить все остальное).

Пример по ссылке https://www.lissyara.su/articles/freebsd/tuning/ipfw/ четко следует этим простым правилам.
Ваш пример - нет (у Вас это правила 035, 036 из Вашего второго варианта правил).
Ссылка на форум viewtopic.php?t=277
Не смотря, на лохматость написанного в 2006 году, логика четкая (в новых FreeBSD чуть-чуть поменялись макрокоманды, но принцип остался тот-же).

Еще ссылка http://www.lissyara.su/articles/freebsd ... if_bridge/
И еще ссылка https://www.lissyara.su/articles/freebs ... /ipfw_nat/
И еще ссылка networks-f4/podrobnoe-rukovodstvo-po-ip ... 18967.html
И еще ссылка https://www.opennet.ru/openforum/vsluhf ... 74874.html

Еще, это добавил-бы, такой момент, но не факт, что это Вам понадобится.
Достаточно часто в последнее десятилетие попадаются "многоголовые" сетевые карты, т.е. имеют много портов.
Выработал для себя такое построение логики для таких физических адаптеров:
1. em0 (или аналоги) - это всегда назначать локальную сетку.
2. em1-3 - это все остальное и не важно подключаются это внутренние сети, внешние сети или еще что-либо.
Для вариантов, когда карточки разные, т.е. обе нулевки (em0 и fxp0), использовать description (в rc.conf пишем ifconfig_em0="inet 33.33.33.33 netmask 255.255.255.240 descr \"WAN1 Internet\"").
Но это мое, частное, мнение. Мне так удобно дробить на логические участки и потом легче вспомнить "что" и "зачем" сделано...

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

$cmd 050 check-state
находится на 50-ом месте...
Хотя его суть "проверить-статус", т.е. сразу посмотреть было-ли "устанавливающее" правило и мигом перейти к его ответочке...
https://docs.freebsd.org/ru_RU.KOI8-R/b ... -ipfw.html смотри п.26.6.5.1.3.
Есть вопросы? Задавайте...

Аватара пользователя
Alex Keda
стреляли...
Сообщения: 35315
Зарегистрирован: 2004-10-18 14:25:19
Откуда: Made in USSR
Контактная информация:

Ipfw

Непрочитанное сообщение Alex Keda » 2021-04-02 20:49:20

лучше нумерацию вообще уберите.
пусть сам нумерует, зато правила будете писать в том же порядке как они в реальности
очень помогает для понимания почему так работает а иначе нет.

ибо может оказаться что в конфиге с номерами порядок написания правил - как бык поссал, в реальном файрволле он другой.
а подсознательно во время написания будете на порядок смотреть а не на цифры с номером правила
Убей их всех! Бог потом рассортирует...