FreeBSd > Система

ipfw, nat -- как заставить работать ping

(1/5) > >>

solaris:
С большим удовольствием почитал сайт. Спасибо автору за его статьи - полезные и интересные.
Может подскажет кто по следующему вопросу. А то мечтаю решить эту проблему уже несколько лет, а всё никак.  :o :'(

FreeBSD 8.2, работает гейтом и сервером.
При текущей настройке правил ping из локальной сети проходит, а из Интернета пропинговать сервер не получается.

Если после правила
${fwcmd} add nat 123 all from any to any via ${ext_if}
добавить правило с разрешением для icmp, получится ровно наоборот.

Можно убрать ключ "deny_in" из параметров nat и добавить после правила
${fwcmd} add nat 123 all from any to any via ${ext_if}
правило
${fwcmd} add allow icmp from any to any
все ping'и проходят. Но мне кажется, что это несекьюрно.

Очевидно, надо как-то отличить пакет, идущий к серверу от того, который пришел в ответ на ping изнутри сети и который надо про-nat-ить. С TCP/UDP такое же получается, а с ICMP возможно?

И вообще любые комментарии и советы по правилам горячо приветствуются.

====  Begin rc.conf  ====
ifconfig_rl0="inet 192.168.0.1 netmask 255.255.255.0"
ifconfig_rl1="inet 111.1.111.11 netmask 255.255.255.128"

int_if="rl0"         # Inside interface
ext_if="rl1"         # Outside interface

firewall_enable="YES"
firewall_logging="YES"
firewall_script="/usr/local/etc/ipfw.rules"
firewall_coscripts="/usr/local/etc/ipfw.smtp-servers /usr/local/etc/ipfw.users"

gateway_enable="YES"
firewall_nat_enable="YES"

icmp_drop_redirect="YES"        # Set to YES to ignore ICMP REDIRECT packets
icmp_log_redirect="YES"         # Set to YES to log ICMP REDIRECT packets
====  End rc.conf  ====

====  Begin ipfw.rules  ====
###  Suck in the configuration variables  ############################
if [ -z "${source_rc_confs_defined}" ]; then
   if [ -r /etc/defaults/rc.conf ]; then
      . /etc/defaults/rc.conf
      source_rc_confs
   elif [ -r /etc/rc.conf ]; then
      . /etc/rc.conf
   fi
fi


###  Set some variables  #############################################
int_ip=`ifconfig ${int_if}|grep inet|awk '{print $2}'`      # Inside ip
int_net=`ifconfig ${int_if}|grep inet|awk '{print $2 ":" $4}'`   # Inside network and netmask

ext_ip=`ifconfig ${ext_if}|grep inet|awk '{print $2}'`      # Outside ip
ext_net=`ifconfig ${ext_if}|grep inet|awk '{print $2 ":" $4}'`   # Outside network and netmask


###  Set quiet mode if requested  ####################################
case ${firewall_quiet} in [Yy][Ee][Ss])
   fwcmd="/sbin/ipfw -q"
   ;;
*)
   fwcmd="/sbin/ipfw"
   ;;
esac


###  Flush out the list before we begin  #############################
${fwcmd} -f flush


###  Rules  ##########################################################
    # Check dynamic rules
${fwcmd} add check-state

    # Stop spoofing
${fwcmd} add deny log ip from ${int_net} to any in via ${ext_if}
${fwcmd} add deny log ip from ${ext_net} to any in via ${int_if}

    # Rules for lo0
${fwcmd} add allow ip from any to any via lo0

    # Rules for VPN
${fwcmd} add allow gre from any to any keep-state

    # Rules for ppp0
#${fwcmd} add allow ip from any to any via ppp0 keep-state

    # Allow all outgoing from server
${fwcmd} add allow ip from ${ext_ip} to any keep-state
${fwcmd} add allow ip from ${int_ip} to any keep-state

    # Allow access to our services
${fwcmd} add allow ip from any to ${ext_ip} ftp\\-data,ftp,ssh,1022,smtp,smtps,domain,http,https,pop3,pop3s,ntp,imap,imaps,l2tp,pptp,xmpp\\-client,xmpp\\-server,5280,24554 keep-state
${fwcmd} add allow ip from any to ${int_ip} ftp\\-data,ftp,ssh,1022,smtp,smtps,domain,http,https,pop3,pop3s,ntp,imap,imaps,3306,     xmpp\\-client,xmpp\\-server,5280,24554 keep-state

    # Block some ICMP packets
${fwcmd} add deny log icmp from any to any icmptype 5,9,13,14,15,16,17


###  Rules for gateway only  #########################################
case ${firewall_nat_enable} in [Yy][Ee][Ss])

    # Disallow users access to our proxy
${fwcmd} add deny ip from not table\(0\) to ${int_ip} 3128

    # Disallow users access to our NAT service
${fwcmd} add deny ip from not table\(0\) to any in via ${int_if}

    # Block access to foreign smtp
${fwcmd} add deny log ip from ${int_net} to not table\(1\) smtp

    # Network Address Translation
${fwcmd} nat 123 config if ${ext_if} log deny_in same_ports
${fwcmd} add nat 123 all from any to any via ${ext_if}

    # Rules for NATed packets
${fwcmd} add allow ip from ${ext_ip} to any

    # Allow users to have Internet
${fwcmd} add allow ip from ${int_net} to any
${fwcmd} add allow ip from any to ${int_net}

esac


    # Drop all connections w/out logging: on netbios ports
${fwcmd} add deny ip from any to any 135,137,138,139,microsoft\\-ds

    # Drop all connections w/out logging: broadcast
${fwcmd} add deny ip from any to 255.255.255.255

    # Drop any other packets & log it
${fwcmd} add deny log ip from any to any
====  End ipfw.rules  ====

muff:
Будет просьба.... Брось вывод ipfw show. Хочу просмотреть счетчики да и так проще как-то смотреть правила..
Нужно разрешить входящие и исходящие icmp-запросы. Только осталось определиться, куда их разместить. Будем отталкиваться от существующих номеров правил.

Как вариант, можно последнее правило сформировать так:

--- Код: ---${fwcmd} add deny log ip from any to any via ${ext_if}
--- Конец кода ---

Тоесть запретить все не разрешенное на внешнем интерфейсе, разрешив "безобразничать" внутренней сети. А после правила для ppp0 вставим такое:

--- Код: ---${fwcmd} add allow icmp from me to any icmptypes 0,3,8,11
${fwcmd} add allow icmp from any to me icmptypes 0,3,8,11
--- Конец кода ---

Иначе - только сниферить трафик, и смотреть как ведут себя ICMP-пакеты:
1. Сначала смотрим на внешнем интерфейсе (tcpdump -ni rl1 icmp).Обращаем внимание на SRC и DST.
2. Слушаем на внутреннем интерфейсе (по аналогии). Если запросы не пробегают, добавь все таки вышеуказанные правила перед ppp0:

--- Код: ---${fwcmd} add allow icmp from me to any icmptypes 0,3,8,11
${fwcmd} add allow icmp from any to me icmptypes 0,3,8,11
--- Конец кода ---


Результаты наблюдения и соображения по этому поводу ожидаю...

solaris:

--- Цитата: muff от Марта 09, 2011, 04:38:49 pm ---Будет просьба.... Брось вывод ipfw show. Хочу просмотреть счетчики да и так проще как-то смотреть правила..

--- Конец цитаты ---

--- Код: ---00100    0      0 check-state
00200    0      0 deny log ip from 192.168.0.0/24 to any in via rl0
00300    0      0 deny log ip from 195.98.163.140/30 to any in via sk0
00400    0      0 allow ip from any to any via lo0
00500    0      0 allow gre from any to any keep-state
00501   16   1200 allow icmp from me to any icmptypes 0,3,8,11
00502   17   1260 allow icmp from any to me icmptypes 0,3,8,11
00600  993 142399 allow ip from me to any keep-state
00700    0      0 deny ip from { table(3) or table(4) or table(5) } to any
00800 1222  87155 allow ip from any to 195.98.163.142 dst-port 20,21,22,1022,53,80,443,25,465,110,995,143,993,1701,1723,5222,5269,5280,24554 keep-state
00900   22   2732 allow ip from any to 192.168.0.1 dst-port 20,21,22,1022,53,80,443,123,25,465,110,995,143,993,3306,5222,5269,5280,24554 keep-state
01000    0      0 deny log icmp from any to any icmptypes 5,9,13,14,15,16,17
01100    0      0 deny ip from not table(0) to 192.168.0.1 dst-port 3128
01200   11   3509 deny ip from not table(0) to any in via sk0
01300    0      0 deny log ip from 192.168.0.0/24 to not table(1) dst-port 25
01400   10    544 nat 123 ip from any to any via rl0
01500    3    180 allow ip from 195.98.163.142 to any
01600 1546 188638 allow ip from 192.168.0.0/24 to any
01700    4    240 allow ip from any to 192.168.0.0/24
01800    0      0 deny ip from any to any dst-port 137,138,139,445
01900    0      0 deny ip from any to 255.255.255.255
02000    0      0 deny log ip from any to any
65535    0      0 deny ip from any to any

--- Конец кода ---

--- Цитата: muff от Марта 09, 2011, 04:38:49 pm ---Нужно разрешить входящие и исходящие icmp-запросы. Только осталось определиться, куда их разместить. Будем отталкиваться от существующих номеров правил.
А после правила для ppp0 вставим такое:

--- Код: ---${fwcmd} allow icmp from me to any icmptypes 0,3,8,11
${fwcmd} allow icmp from any to me icmptypes 0,3,8,11
--- Конец кода ---

--- Конец цитаты ---
Сделал правила 501 и 502. Как и ожидалось, теперь сам сервер пингуется, а из LAN пропинговать, например, ya.ru - не получается.
Если убрать 501 и 502, сервер пинговаться не будет, а из LAN пропинговать ya.ru - получится.


--- Цитата: muff от Марта 09, 2011, 04:38:49 pm ---Как вариант, можно последнее правило сформировать так:

--- Код: ---${fwcmd} add deny log ip from any to any via ${ext_if}
--- Конец кода ---

Тоесть запретить все не разрешенное на внешнем интерфейсе, разрешив "безобразничать" внутренней сети.

--- Конец цитаты ---
Ну, во-первых, всё равно есть правило 65535 (можно, конечно, в конфиге ядре сделать default-to-accept), а во-вторых всё равно не поможет.


--- Цитата: muff от Марта 09, 2011, 04:38:49 pm ---Иначе - только сниферить трафик, и смотреть как ведут себя ICMP-пакеты:

--- Конец цитаты ---
никогда в жизни не использовал tcpdump. попробую.


--- Цитата: muff от Марта 09, 2011, 04:38:49 pm ---1. Сначала смотрим на внешнем интерфейсе (tcpdump -ni rl1 icmp).Обращаем внимание на SRC и DST.

--- Конец цитаты ---

Запускаю ping на внешнем компе и смотрю:

# tcpdump -ni rl0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on rl0, link-type EN10MB (Ethernet), capture size 96 bytes
Mar  9 21:47:19 gate kernel: rl0: promiscuous mode enabled
21:47:43.083327 IP 89.178.245.105 > 195.98.163.142: ICMP echo request, id 1, seq 11, length 40
21:47:48.083818 IP 89.178.245.105 > 195.98.163.142: ICMP echo request, id 1, seq 12, length 40
21:47:53.083193 IP 89.178.245.105 > 195.98.163.142: ICMP echo request, id 1, seq 13, length 40
^C
3 packets captured
71 packets received by filter
0 packets dropped by kernel


--- Цитата: muff от Марта 09, 2011, 04:38:49 pm ---2. Слушаем на внутреннем интерфейсе (по аналогии). Если запросы не пробегают, добавь все таки вышеуказанные правила перед ppp0:

--- Код: ---${fwcmd} allow icmp from me to any icmptypes 0,3,8,11
${fwcmd} allow icmp from any to me icmptypes 0,3,8,11
--- Конец кода ---

--- Конец цитаты ---

Запускаю ping ya.ru на компе внутри LAN, добавляю правила и смотрю:

# ipfw add 501 allow icmp from me to any icmptypes 0,3,8,11
# ipfw add 502 allow icmp from any to me icmptypes 0,3,8,11
# tcpdump -ni sk0 icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on sk0, link-type EN10MB (Ethernet), capture size 96 bytes
00:01:31.262409 IP 192.168.0.21 > 213.180.204.3: ICMP echo request, id 1, seq 175, length 40
00:01:36.116795 IP 192.168.0.21 > 213.180.204.3: ICMP echo request, id 1, seq 176, length 40
00:01:40.750203 IP 192.168.0.21 > 213.180.204.3: ICMP echo request, id 1, seq 177, length 40
^C
3 packets captured
554 packets received by filter
0 packets dropped by kernel




--- Цитата: muff от Марта 09, 2011, 04:38:49 pm ---Результаты наблюдения и соображения по этому поводу ожидаю...

--- Конец цитаты ---
Спасибо за участие! :)

P.S. На одном форуме мне посоветовали решить проблему "Через stateful firewall, создавая states для пакетов out recv $iif xmit $oif (пакеты самого роутера под такое условие не попадают),". Я сделал такое правило
ipfw add 1410 allow icmp out recv sk0 xmit rl0 keep-state
но это ничего не дало - сервер не пингуется, из LAN пропинговать ya.ru - получается.

muff:
Ok...

Кажется картина понятна... Попробуй изменить правила 501 и 502 на такие:

--- Код: ---${fwcmd} add 501 allow icmp from 111.1.111.11 to any icmptypes 0,3,8,11 out via ${ext_if}
${fwcmd} add 502 allow icmp from any to 111.1.111.11 icmptypes 0,3,8,11 in via ${ext_if}
--- Конец кода ---

где 111.1.111.11 - твой "внешний" айпишник.

solaris:
Не работает ping изнутри LAN. :(
Всё логично - пришел на роутер ответный icmp-пакет. И как ipfw поймёт, что его надо не обработать 502-м правилом, а отправить дальше, в NAT? С IP-пакетом он это определяем по порту (думаю), а в ICMP нет портов.
Очевидно, без динамического правила проблема не решаема.
Я пытался сделать 1400 динамическим, добавив в его конец keep-state, но тогда NAT вообще перестаёт работать.

Навигация

[0] Главная страница сообщений

[#] Следующая страница

Перейти к полной версии