дырявый IPFW, кривые руки или мистика?..

Проблемы установки, настройки и работы Правильной Операционной Системы

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
DarkAGeS
мл. сержант
Сообщения: 75
Зарегистрирован: 2009-05-30 14:07:28

дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение DarkAGeS » 2009-05-30 14:24:28

в общем был сегодня очень удивлен следующим. привожу правила ipfw как есть. особенно обратите внимания на правила SSH и FTP - как видно они закомментированы. проблема в следующем - ssh и ftp извне доступны и прекрасно работают. причем я так подозреваю доступно вообще всё - просто только на этих портах сидят демоны, которые отвечают. т.е. если поставить вебсервер и почтовик - то будут отвечать и их демоны тоже - где дырка??? причем такая ситуация на двух машинах. я в шоке...

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

# /bin/sh /etc/rc.fw

fwcmd="/sbin/ipfw -q"

ext_if="fxp0"
ext_ip="1.1.1.105"
ext_net="1.1.1.104"
ext_mask="29"

int_if="em0"
int_ip="10.10.100.200"
int_net="10.0.0.0"
int_mask="8"

admin="10.10.10.34,10.10.100.10"
dnsserver="10.10.10.201"

vpn_net="10.10.150.248"
vpn_mask="29"

${fwcmd} -f flush

# LOOPBACK
${fwcmd} add allow all from any to any via lo0
${fwcmd} add deny all from any to 127.0.0.0/8
${fwcmd} add deny ip from 127.0.0.0/8 to any

# ANTISPOOFING
${fwcmd} add deny ip from any to any not verrevpath in

# anti-hack from outside
${fwcmd} add deny ip from me to any in via ${ext_if}

# DENY NETBIOS
${fwcmd} add deny ip from any 137-139 to any
${fwcmd} add deny ip from any to any 137-139

# SSH
#${fwcmd} add allow tcp from any to ${ext_ip} 22 in via ${ext_if}

# FTP
#${fwcmd} add allow tcp from any to ${ext_ip} 21 in via ${ext_if}

# VPN-connect
${fwcmd} add allow tcp from any to ${ext_ip} 1723 in via ${ext_if}

# GRE for MPD5
${fwcmd} add allow gre from any to any

# VPN-LAN
${fwcmd} add allow all from ${vpn_net}/${vpn_mask} to ${int_net}/${int_mask}
${fwcmd} add allow all from ${int_net}/${int_mask} to ${vpn_net}/${vpn_mask}

# Firewall Traffic OUT
${fwcmd} add allow ip from ${ext_ip} to any out via ${ext_if}
${fwcmd} add allow ip from ${int_ip} to any out via ${int_if}

# INTERNET TO LOCAL
#${fwcmd} add allow tcp from any 80 to ${admin} via ${int_if}
#${fwcmd} add allow tcp from any 443 to ${admin} via ${int_if}
#${fwcmd} add allow tcp from any 25 to ${admin} via ${int_if}
#${fwcmd} add allow tcp from any 110 to ${admin} via ${int_if}
${fwcmd} add allow tcp from any 5190,5191 to ${admin} via ${int_if}
#${fwcmd} add allow tcp from any 21 to ${admin} via ${int_if}
#${fwcmd} add allow tcp from any 22 to ${admin} via ${int_if}
#${fwcmd} add allow tcp from any 23 to ${admin} via ${int_if}
#${fwcmd} add allow tcp from any 5060 to ${admin} via ${int_if}
#${fwcmd} add allow udp from any 5060 to ${admin} via ${int_if}

# LOCAL
${fwcmd} add allow ip from ${admin} to ${int_ip} in via ${int_if}
# dns_server
${fwcmd} add allow ip from ${dnsserver} to ${int_ip} in via ${int_if}

# NAT
${fwcmd} nat 123 config ip ${ext_ip}
# vpn_nat
${fwcmd} add nat 123 ip from ${vpn_net}/${vpn_mask} to not ${int_net}/${int_mask}
# local_nat
${fwcmd} add nat 123 ip from ${admin} to any out via ${ext_if}
${fwcmd} add nat 123 ip from any to ${ext_ip} in via ${ext_if}

# ICMP
${fwcmd} add deny icmp from any to any frag
${fwcmd} add allow icmp from any to any icmptypes 0,3,4,8,10,11,30

# LOCAL TO INTERNET
${fwcmd} add allow tcp from ${admin} to any 80 setup keep-state
${fwcmd} add allow tcp from ${admin} to any 443 setup keep-state
${fwcmd} add allow tcp from ${admin} to any 25 setup keep-state
${fwcmd} add allow tcp from ${admin} to any 110 setup keep-state
${fwcmd} add allow tcp from ${admin} to any 5190,5191
#${fwcmd} add allow tcp from ${admin} to any 5190,5191 setup keep-state
${fwcmd} add allow tcp from ${admin} to any 20 setup keep-state
${fwcmd} add allow tcp from ${admin} to any 21 setup keep-state
${fwcmd} add allow tcp from ${admin} to any 22 setup keep-state
${fwcmd} add allow tcp from ${admin} to any 23 setup keep-state
${fwcmd} add allow udp from ${admin} to any 5060 keep-state
${fwcmd} add allow tcp from ${admin} to any 4899,48999 keep-state

# VPN-LAN to OUT
${fwcmd} add allow ip from any to ${vpn_net}/${vpn_mask}

# DENY ALL
${fwcmd} add deny log logamount 3000 all from any to any

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

princeps
майор
Сообщения: 2684
Зарегистрирован: 2007-09-25 10:20:59
Откуда: Сочи, Москва
Контактная информация:

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение princeps » 2009-05-30 16:37:54

А ты уверен, что у тебя вообще работает фаервол? ipfw show смотрел?
Deus quos vult perdere dementat prius
http://www.itforum-sochi.ru

Аватара пользователя
DarkAGeS
мл. сержант
Сообщения: 75
Зарегистрирован: 2009-05-30 14:07:28

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение DarkAGeS » 2009-05-30 16:49:36

конечно уверен, все работает четко - и сам шлюз и nat и vpn mpd5

princeps
майор
Сообщения: 2684
Зарегистрирован: 2007-09-25 10:20:59
Откуда: Сочи, Москва
Контактная информация:

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение princeps » 2009-05-30 16:53:43

так дай лучше вывод ipfw show, он будет более нагляден, чем скрипт фаера.
Deus quos vult perdere dementat prius
http://www.itforum-sochi.ru

Аватара пользователя
DarkAGeS
мл. сержант
Сообщения: 75
Зарегистрирован: 2009-05-30 14:07:28

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение DarkAGeS » 2009-05-30 16:57:28

привожу ipfw show (изменен только внешний ip-адрес). обратите внимание на правило под номером 800 - создал его специально - только в этом случае не видны снаружи порты 21 и 22. если это правило закоментить - порты видны и отвечают, хотя НЕ ДОЛЖНЫ. или где я не прав???

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

00100    0      0 allow ip from any to any via lo0
00200    0      0 deny ip from any to 127.0.0.0/8
00300    0      0 deny ip from 127.0.0.0/8 to any
00400  238  23027 deny ip from any to any not verrevpath in
00500    0      0 deny ip from me to any in via fxp0
00600 2397 291206 deny ip from any 137-139 to any
00700    1     48 deny ip from any to any dst-port 137-139
00800    6    332 deny ip from any to 1.1.1.105 dst-port 21,22 in via fxp0
00900   31   2004 allow tcp from any to 1.1.1.105 dst-port 1723 in via fxp0
01000 3761 751798 allow gre from any to any
01100 2727 301334 allow ip from 10.10.150.248/29 to 10.0.0.0/8
01200 2796 885114 allow ip from 10.0.0.0/8 to 10.10.150.248/29
01300   98   4728 allow ip from 1.1.1.105 to any out via fxp0
01400    2    144 allow ip from 10.10.100.200 to any out via em0
01500    0      0 allow tcp from any 5190,5191 to 10.10.10.34,10.10.100.10 via em0
01600    0      0 allow ip from 10.10.10.34,10.10.100.10 to 10.10.100.200 in via em0
01700    2    306 allow ip from 10.10.10.201 to 10.10.100.200 in via em0
01800    0      0 allow ip from 10.10.10.3 to 10.10.100.200 in via em0
01900    2    656 nat 123 ip from 10.10.150.248/29 to not 10.0.0.0/8
02000    0      0 nat 123 ip from 10.10.10.34,10.10.100.10 to any out via fxp0
02100   39   5720 nat 123 ip from any to 1.1.1.105 in via fxp0
02200    0      0 deny icmp from any to any frag
02300    0      0 allow icmp from any to any icmptypes 0,3,4,8,10,11,30
02400    0      0 allow tcp from 10.10.10.34,10.10.100.10 to any dst-port 80 setup keep-state
02500    0      0 allow tcp from 10.10.10.34,10.10.100.10 to any dst-port 443 setup keep-state
02600    0      0 allow tcp from 10.10.10.34,10.10.100.10 to any dst-port 25 setup keep-state
02700    0      0 allow tcp from 10.10.10.34,10.10.100.10 to any dst-port 110 setup keep-state
02800    0      0 allow tcp from 10.10.10.34,10.10.100.10 to any dst-port 5190,5191
02900    0      0 allow tcp from 10.10.10.34,10.10.100.10 to any dst-port 20 setup keep-state
03000    0      0 allow tcp from 10.10.10.34,10.10.100.10 to any dst-port 21 setup keep-state
03100    0      0 allow tcp from 10.10.10.34,10.10.100.10 to any dst-port 22 setup keep-state
03200    0      0 allow tcp from 10.10.10.34,10.10.100.10 to any dst-port 23 setup keep-state
03300    0      0 allow udp from 10.10.10.34,10.10.100.10 to any dst-port 5060 keep-state
03400    0      0 allow tcp from 10.10.10.34,10.10.100.10 to any dst-port 4899,48999 keep-state
03500    0      0 allow ip from any to 10.10.150.248/29
03600  963 119320 deny log logamount 3000 ip from any to any
65535    0      0 allow ip from any to any

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение paradox » 2009-05-30 17:17:00

а кто мешает отдебажить и разобраться самому через какое правило оно проходит и почему?

Аватара пользователя
DarkAGeS
мл. сержант
Сообщения: 75
Зарегистрирован: 2009-05-30 14:07:28

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение DarkAGeS » 2009-05-30 18:50:19

paradox писал(а):а кто мешает отдебажить и разобраться самому через какое правило оно проходит и почему?
поэкспериментировал... если правило, запрещающее 21 и 22 порты, поставить после правила NAT - то порты открываются. следовательно трафик проходит по правилу

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

02100   39   5720 nat 123 ip from any to 1.1.1.105 in via fxp0
собственно только по нему он и мог проходить...
а теперь давайте разберемся, господа, что же получается:
NAT ловит пакет, смотрит к себе в таблицу, НЕ НАХОДИТ в таблице записи, о том, что этот пакет является ответным пакетом кому-то за НАТом, после чего, не подменяя соответственно ip получателя, отправляет пакет в чистом виде прямиком в систему???
или я туплю? :st:

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение paradox » 2009-05-30 18:56:39

упрости фаер
что бы было минимум правил с которыми можно повторить баг
и пиши баг репорт

Аватара пользователя
DarkAGeS
мл. сержант
Сообщения: 75
Зарегистрирован: 2009-05-30 14:07:28

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение DarkAGeS » 2009-05-31 15:54:24

упростил
fxp0 - внешний интерфейс
1.1.1.105 - внешний ip
em0 - внутренний интерфейс
10.0.0.0/8 - внутренняя сеть
10.10.100.200 - внутренний ip
10.10.10.201 - dns сервер в локалке
10.10.100.10 - комп в локалке, которому разрешен NAT
10.10.150.248/29 - vpn-подсеть

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

00100    allow ip from any to any via lo0
00200    deny ip from any to 127.0.0.0/8
00300    deny ip from 127.0.0.0/8 to any
00400    deny ip from any to any not verrevpath in
00500    deny ip from me to any in via fxp0
00600    deny ip from any 137-139 to any
00700    deny ip from any to any dst-port 137-139
00800    allow tcp from any to 1.1.1.105 dst-port 1723 in via fxp0
00900    allow gre from any to any
01000    allow ip from 10.10.150.248/29 to 10.0.0.0/8
01100    allow ip from 10.0.0.0/8 to 10.10.150.248/29
01200    allow ip from 1.1.1.105 to any out via fxp0
01300    allow ip from 10.10.100.200 to any out via em0
01400    allow ip from 10.10.100.10 to 10.10.100.200 in via em0
01500    allow udp from 10.10.10.201 to 10.10.100.200 in via em0
01600    nat 123 ip from 10.10.150.248/29 to not 10.0.0.0/8
01700    nat 123 ip from 10.10.100.10 to any out via fxp0
01800    nat 123 ip from any to 1.1.1.105 in via fxp0
01900    deny icmp from any to any frag
02000    allow icmp from any to any icmptypes 0,3,4,8,10,11,30
02100    allow udp from 10.10.100.10 to any keep-state
02200    allow tcp from 10.10.100.10 to any keep-state
02300    allow ip from any to 10.10.150.248/29
02400    deny ip from any to any
65535    allow ip from any to any
как я и думал, после установки апача, снаружи открылся еще и 80 порт :(
еще раз вкраце опишу проблему - с привидённым листингом правил ipfw снаружи открываются порты, на которых сидят демоны - в частности - 21, 22 и 80. открываются они правилом

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

01800    nat 123 ip from any to 1.1.1.105 in via fxp0
если до него поставить правило

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

01750    deny ip from any to 1.1.1.105 dst-port 21,22,80 in via fxp0
то порты эти соответственно закрываются.
Вывод - kernel NAT пропускает в систему все подряд, другими словами ipfw с привидённым листингом правил - дырявый

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение paradox » 2009-05-31 15:57:46

ммда уж
упростил
упростить - имелось ввиду до 2-3 правил

пиши баг репорт
а то так и останеться дыра

Аватара пользователя
terminus
майор
Сообщения: 2305
Зарегистрирован: 2007-10-29 11:27:35
Откуда: Рига

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение terminus » 2009-05-31 17:42:33

топикстартер, почитайте вот этот монументальный труд: http://nuclight.livejournal.com/124348.html
Подобное выведение пакета из обработки ipfw в другую подсистему - не уникально
для divert, это общая схема работы в стеке FreeBSD. Например, действия pipe и
queue в dummynet, передача пакета в netgraph (а также появившийся в 7.0
ipfw nat) действуют по тому же принципу. Отличие, однако, в том, что в этих
подсистемах пакет остается внутри ядра, никакому демону не передается.
Поэтому, во-первых, подсистемы вместо номера правила сохраняют на него полный
указатель, и пакет вернется непосредственно в следующее правило, даже если оно
имеет тот же номер. Во-вторых, для таких подсистем действует настройка one_pass
в соответствующем sysctl - если она включена, то при повторном входе пакета в
ipfw после возврата из подсистемы dummynet (netgraph), ipfw_chk() сразу
вернется без прохода по правилам, как если бы к пакету был применен allow
.
Это поведение позволяет упростить правила файрвола, когда известно, что если
пакет попал в трубу, то он уже точно отправляется дальше, и не требуется после
каждого pipe вставлять allow (чтобы пакет не попал в следующие правила и
следующие pipe/queue). Если же конфигурация требует сначала ограничить трафик,
а потом уже разбираться по замысловатым требованиям, что из него разрешить, а
что запретить, то упрощению правил наоборот будет способствовать отключенный
one_pass - поскольку с ним вместо allow, расположенных до pipe, пришлось бы
делать skipto.
Модель: AST-PM-105/0044; Тип: Универсальный, ремонтный; Название: Терминус; Род повреждения: Распад функций; Выводы: Сдать на слом.

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение paradox » 2009-05-31 17:49:29

надо будет себя заставить прочитать это...
хотя в ядре one_pass выглядит вполне безобидно....

Аватара пользователя
DarkAGeS
мл. сержант
Сообщения: 75
Зарегистрирован: 2009-05-30 14:07:28

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение DarkAGeS » 2009-05-31 18:37:36

terminus писал(а):топикстартер, почитайте вот этот монументальный труд: http://nuclight.livejournal.com/124348.html
почитал, спасибо, очень полезная статья. а также прочитал вот это :) http://www.freebsd.org/cgi/man.cgi?query=ipfw&sektion=8 - что есть ни что иное, как ман ipfw... В нем также есть объяснения по этому поводу. В частности:
net.inet.ip.fw.one_pass: 1
When set, the packet exiting from the dummynet pipe or from
ng_ipfw(4) node is not passed though the firewall again. Other-
wise, after an action, the packet is reinjected into the firewall
at the next rule.
В общем путей решения проблемы 2:
1) оставить как есть, просто закрывать нужные порты соответствующим правилом, идущим до правил с NAT
2) поменять переменную SYSCTL "net.inet.ip.fw.one_pass: 1" на "net.inet.ip.fw.one_pass: 0". Но в этом случае, как я понял, будет небольшая морока с составлением правил, если используются трафик шейпер

Но блин.. все равно это реально подстава со стороны FreeBSD :) Хорошо, что вовремя увидел..

CrazyPilot
ст. сержант
Сообщения: 321
Зарегистрирован: 2008-08-14 9:17:58
Откуда: Санкт-Петербург
Контактная информация:

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение CrazyPilot » 2009-06-01 11:44:20

Еще один xD

Я таким же образом себя подставил :)

Нат можно сконфигурить c deny_in. Тогда пакеты, которые пришли к нему, но для них у него нет соответствия - будет выкидывать вообще.

Но меня такой вариант не устроил, я все переделал с one_pass = 0

paradox
проходил мимо
Сообщения: 11620
Зарегистрирован: 2008-02-21 18:15:41

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение paradox » 2009-06-01 11:47:16

тоесть напрашиваеться вывод
фаервол ipfw в бсд поламали
и еще будут ламать - судя по ссылке?
))
значит все на pf !

CrazyPilot
ст. сержант
Сообщения: 321
Зарегистрирован: 2008-08-14 9:17:58
Откуда: Санкт-Петербург
Контактная информация:

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение CrazyPilot » 2009-06-01 11:55:49

paradox писал(а):тоесть напрашиваеться вывод
фаервол ipfw в бсд поламали
Не не не. Он работает именно так, как написано в мане. А кривые руки админов - не удел разработчиков :-D

Другое дело, что допереть до схемы работы ната без вдумчивого чтения манов трудно.
Каково же было мое удивление, когда я запустил nmap на свой сервак :-D :-D :-D

sch
сержант
Сообщения: 282
Зарегистрирован: 2009-05-28 14:36:50
Откуда: Кишинев

Re: дырявый IPFW, кривые руки или мистика?..

Непрочитанное сообщение sch » 2009-06-01 12:29:42

Выключи one_pass и управляй входящими пакетами через правила allow после правил nat. Если хочется one_pass, тогда нарисуй блок правил для доступа к сервисам шлюза до команды NAT.
Логика модуля NAT проста - пришел пакет на внешний интерфейс, направлен в подсистему NAT, если в таблице нет правил соответствия для замены адреса назначения, то адрес назначения остается равным внешнему адресу сервера, и пакет обрабатывается сетевым стеком ОС как обычно.
Если выключен one_pass, тогда входящий пакет после NAT пойдет дальше по файерволу и все в руках (в голове) админа.
Ничего не поломано.