pf 2 ipfw

Обсуждаем OS FreeBSD и сервисы на ней.

pf 2 ipfw

Сообщение Андрей » 29 окт 2009, 09:18

Приветствую всех.
Столкнулся с проблемой, что надо перейти от pf к ipfw. Проблема в том, что с ipfw я мало работал и толкового мануала в хендбуке не нашел. (Точнее нашел, но он не переведен).
Помогите перевести правила pf в ipfw:
Код: Выделить всё
$ cat pf.conf
table <rfcnets> {10.0.0.0/8, !192.168.1.0/24, 192.168.0.0/16, !172.16.0.0/24, 172.16.0.0/12 }
table <vpn>     persist
#table <vpn>    {172.16.0.0/24}
table <me>      { self, 172.16.0.1}
# Options: tune the behavior of pf, default values are given.
set timeout { interval 10, frag 30 }
set timeout { tcp.first 120, tcp.opening 30, tcp.established 86400 }
set timeout { tcp.closing 900, tcp.finwait 45, tcp.closed 5 }
set timeout { udp.first 60, udp.single 30, udp.multiple 60 }
set timeout { icmp.first 20, icmp.error 10 }
set timeout { other.first 60, other.single 30, other.multiple 60 }
set timeout { adaptive.start 0, adaptive.end 0 }
set limit { states 50000, frags 5000 }
set loginterface none
#set optimization normal
set block-policy drop
set require-order yes
set fingerprints "/etc/pf.os"
#set state-policy if-bound
# Normalization: reassemble fragments and resolve or reduce traffic ambiguities.
scrub in all
nat on em0 from 172.16.0.0/16 to any -> em0
pass quick on lo from any to any
block in quick on em0 from <rfcnets> to any

# icmp
pass in quick inet proto icmp from any to <me> icmp-type echoreq keep state
# ssh
pass in quick proto tcp from any to <me> port ssh flags S/SA keep state
# http,https
pass in quick proto tcp from any to 10.10.0.2  port {443, 80} flags S/SA keep state
# dns
pass in quick proto {tcp, udp} from any to <me> port domain flags S/SA keep state
# pptp
pass in quick proto tcp from any to <me> port 1723 flags S/SA keep state
# GRE наружу
pass in quick proto gre from any to <me> keep state
pass in quick proto tcp from any to <me> port 11758 flags S/SA keep state
# MPD
pass in quick proto tcp from any to <me> port 5006 flags S/SA keep state
#SNMP
pass in quick proto udp from 10.10.10.99 to <me> port 161 keep state
block in quick from any to <me>
block quick from 172.16.0.0/16 to 172.16.0.0/16
pass in quick inet from <vpn> to any
pass in quick inet from any to <vpn>
block in quick all
block out quick on em0 from <rfcnets> to any
pass out quick from <me> to any keep state
pass out quick from <rfcnets> to <rfcnets>
pass out quick from any to <vpn>
pass out quick from <vpn> to any

block out quick all



Если не трудно - отпишите на явные баги.
Заранее благодарен.

ЗЫ em0 - внешний ифейс, em1 - внутренний.
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: pf 2 ipfw

Сообщение root » 29 окт 2009, 18:23

привет

Андрей писал(а):Столкнулся с проблемой, что надо перейти от pf к ipfw

это не проблема, а твое желание ;)

Андрей писал(а):Проблема в том, что с ipfw я мало работал и толкового мануала в хендбуке не нашел

а посмотри сюда:
Код: Выделить всё
man ipfw

самое толковое описание, которое тока может быть

Андрей писал(а):(Точнее нашел, но он не переведен)

ну в инете есть свободные переводы мануала
вот как этот например: Черновой перевод "man ipfw" (freebsd ipfw)
достаточно было просто спросить гугл

Андрей писал(а):Помогите перевести правила pf в ipfw

не правильно стоит "вопрос"
все же форум не для "Сделайте за меня мою работу", а для того, чтобы "Я прочитал тут, тут и тут, сделал так так и так, не понял это, это и это"
решил переходить ? нивопрос, переходи, но ты сам должен с этим разобраться.
кто нить м.б. и сделает все твои правила для ipfw, но ты до конца никогда и не поймешь почему так, а не иначе, т.к. сам не прошел весь "путь"
ты почтай, попробуй, приведи свои правила ipfw, а вот потом спрашивай ;)
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1894
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia

Re: pf 2 ipfw

Сообщение Андрей » 30 окт 2009, 06:27

В принципе синтаксис понятен. Меня беспокоит только то - как запустить ng_nat (в pf мне это нравилось тем, что можно задать это правилами).
читал это http://subnets.ru/blog/?p=779
не ясно
Для примера будем NAT`ить подсеть 172.16.5.96/27 через IP-адрес 192.168.20.8 на внешнем интерфейсе fxp0.

Я так понял натиться будет сеть с какого-то ифейса на fxp0 или с fxp0 на какой-то?
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: pf 2 ipfw

Сообщение root » 30 окт 2009, 10:56

через IP-адрес 192.168.20.8 на внешнем интерфейсе fxp0.

за каким интерфейсом находится посеть, которую нужно натить, абсолютно все равно
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1894
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia

Re: pf 2 ipfw

Сообщение Андрей » 30 окт 2009, 13:05

Вопрос такой у меня.
В pf можно было описать машину, скажем, как me.
Вот так:
Код: Выделить всё
table <me>      { self, 172.16.0.1}

Как это сделать в pf? описывать каждый мой ip? или же можно как массив задать?

Вот с горем пополам начал пропичывать строки:
Код: Выделить всё
#!/bin/sh
cmd="/sbin/ipfw"
lan="em0"
int="em1"
iplan="10.10.254.249"
ipint="1.1.1.1"
netint="30"
netlan="10.0.0.0"
ks="keep-state"

$cmd -f flush

#ssh
$cmd 203 allow tcp from any to $iplan 22 via $lan


Вопрос такой. Следует ли описывать еще и deny правила для ифейса Int?
или же можно по принципу "что не описали - блокируем"?
В pf это выглядело так:
Код: Выделить всё
block out quick all

как это в ipfw?
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: pf 2 ipfw

Сообщение root » 30 окт 2009, 13:41

Андрей писал(а):В pf можно было описать машину, скажем, как me.

в IPFW так же есть слово "me", которое означает все IP-адреса, всех интерфейсов системы, например:
Код: Выделить всё
ipfw add allow ip from me to any

читается: "разрешить все от меня ко всем"

Андрей писал(а):или же можно как массив задать?

в IPFW, как и в PF это называется таблицами (table)
ipfw table number add addr[/masklen] [value]
ipfw table number delete addr[/masklen]
ipfw table {number | all} flush
ipfw table {number | all} list


Андрей писал(а):Следует ли описывать еще и deny правила для ифейса Int?

на этот вопрос можешь ответить только ты
так тебе виднее, что ты хочешь получить на выходе
как мы можем сказать, что блокировать, а что нет ? например, некоторые блокируют порты 25, 80, 8080 и т.п., а другие нет

Андрей писал(а):или же можно по принципу "что не описали - блокируем"?

есть два типа фаирвола:
    открытого типа
    закрытого типа

открытый тип, последнее правило:
Код: Выделить всё
allow ip from any to any

разрешать все что не запрещено

закрытого типа:
Код: Выделить всё
deny ip from any to any

запрещать все что не разрешено

каждый вибирает свой вариант

Андрей писал(а):Код: Выделить всё
block out quick all

Код: Выделить всё
deny ip from any to any out

но при использовании "указателей" in или out лучше всегда указывать имя интерфейса, что бы не получить неожиданный результат
например:
Код: Выделить всё
ipfw add deny ip from any to any via IFACE_NAME out


так же, используя IPFW, нужно всегда помнить, что правила обрабатываются по порядку, сверху вниз, исходя из номеров правил
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1894
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia

Re: pf 2 ipfw

Сообщение Андрей » 30 окт 2009, 15:10

Хотел описать запрет локальных сетей на внешнем ифейсе:
Код: Выделить всё
$cmd 150 deny from 10.0.0.0/8 to any via $int
$cmd 151 deny from 192.168.0.0/16 to any via $int
$cmd 152 deny from 172.16.0.0/8 to any via $int


Система ругается:
Код: Выделить всё
ipfw: unrecognised option [-1] from
ipfw: unrecognised option [-1] from
ipfw: unrecognised option [-1] from

В чем ошибка - не могу понять.
Может и не стоит писать эти правила? В конце я все равно добавил:
Код: Выделить всё
$cmd 65535 deny ip from any to any via $int out
$cmd 65535 deny ip from any to any via $lan in


И еще вопрос.
В pf у меня была инструкция:
Код: Выделить всё
table <vpn>     persist
...
# Разрешаем ВПН
pass in quick inet from <vpn> to any
pass in quick inet from any to <vpn>

Что прописать для Ipfw в данном случае?

Заранее благодарю.
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: pf 2 ipfw

Сообщение root » 30 окт 2009, 16:00

Андрей писал(а):Система ругается:

и правильно делает, что ругается, ты не соблюдаешь синтаксис команд:
Код: Выделить всё
RULE FORMAT
     The format of ipfw rules is the following:

           [rule_number] [set set_number] [prob match_probability] action
           [log [logamount number]] [altq queue] [{tag | untag} number] body

     where the body of the rule specifies which information is used for fil-
     tering packets, among the following:

        Layer-2 header fields                 When available
        IPv4 and IPv6 Protocol                TCP, UDP, ICMP, etc.
        Source and dest. addresses and ports
        Direction                             See Section PACKET FLOW
        Transmit and receive interface        By name or address
        Misc. IP header fields                Version, type of service, data-
                                              gram length, identification,
                                              fragment flag (non-zero IP off-
                                              set), Time To Live
        IP options
        IPv6 Extension headers                Fragmentation, Hop-by-Hop
                                              options, Routing Headers, Source
                                              routing rthdr0, Mobile IPv6
                                              rthdr2, IPSec options.
        IPv6 Flow-ID
        Misc. TCP header fields               TCP flags (SYN, FIN, ACK, RST,
                                              etc.), sequence number, acknowl-
                                              edgment number, window
        TCP options
        ICMP types                            for ICMP packets
        ICMP6 types                           for ICMP6 packets
        User/group ID                         When the packet can be associ-
                                              ated with a local socket.
        Divert status                         Whether a packet came from a
                                              divert socket (e.g., natd(8)).
        Fib annotation state                  Whether a packet has been tagged
                                              for using a specific FIB (rout-
                                              ing table) in future forwarding
                                              decisions.

ты пропускаешь описание того что ты хочешь запретить, TCP/UDP/ICMP/IP
deny ЧТО ?
если тебе нуна убить все, то используем слово IP:
Код: Выделить всё
$cmd 150 deny ip from 10.0.0.0/8 to any via $int
$cmd 151 deny ip from 192.168.0.0/16 to any via $int
$cmd 152 deny ip from 172.16.0.0/8 to any via $int

под ip подразумевается и tcp и udp и icmp вообщем весь ip трафик.

Андрей писал(а):Что прописать для Ipfw в данном случае?

Код: Выделить всё
table 0 add xx.xx.xx.0/24 0
table 0 add ......

и т.д. адреса или подсети
потом сами правила:
Код: Выделить всё
ipfw add XXXX allow ip from "table(0)" to any
ipfw add XXXX allow ip from any to "table(0)"

или с указанием интерфейса:
Код: Выделить всё
ipfw add XXXX allow ip from "table(0)" to any via IFACE in
ipfw add XXXX allow ip from any to "table(0)" via IFACE in

IFACE - имя нужно интерфейса

прочти про использование таблиц в ipfw
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1894
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia

Re: pf 2 ipfw

Сообщение Андрей » 02 ноя 2009, 08:27

Привет.
Чет у меня с ним ничего не плоучается.

пишу:
Код: Выделить всё
# cat ipfw.sh
#!/bin/sh
cmd="/sbin/ipfw -q add "
lan="em0"
int="em1"
iplan="10.10.254.249"
ipint="1.1.1.1"
netint="30"
netlan="10.0.0.0"
ks="keep-state"

/sbin/ipfw -f flush

$cmd 10 allow all from any to any via lo

# block LAN on out interface
$cmd 150 deny all from 10.0.0.0/8 to any via $int
$cmd 151 deny all from 192.168.0.0/16 to any via $int
$cmd 152 deny all from 172.16.0.0/8 to any via $int

#icmp
$cmd 201 allow icmp from any to 10.10.254.249 via $lan
$cmd 202 allow icmp from any to any via $int
#ssh
$cmd 203 allow tcp from any to $iplan 22 via $lan
#http,https
$cmd 204 allow tcp from any to $iplan 80 via $lan
$cmd 205 allow tcp from any to $iplan 443 via $lan
#MPD console
$cmd 206 allow tcp from any to $iplan 5006 via $lan

#out clients
#$cmd 300 allow any to $vpn
#$cmd 301 allow $vpn to any

#$cmd 65531 deny all from any to any via $int out
#$cmd 65532 deny all from any to any via $int in
#$cmd 65533 deny all from any to any via $lan out
#$cmd 65534 deny all from any to any via $lan in
$cmd 65534 deny all from any to any

и все соединения рубятся.
убираю строку
Код: Выделить всё
$cmd 65534 deny all from any to any

получаю:
Код: Выделить всё
# ipfw list
00010 allow ip from any to any via lo
00150 deny ip from 10.0.0.0/8 to any via em1
00151 deny ip from 192.168.0.0/16 to any via em1
00152 deny ip from 172.0.0.0/8 to any via em1
00201 allow icmp from any to 10.10.254.249 via em0
00202 allow icmp from any to any via em1
00203 allow tcp from any to 10.10.254.249 dst-port 22 via em0
00204 allow tcp from any to 10.10.254.249 dst-port 80 via em0
00205 allow tcp from any to 10.10.254.249 dst-port 443 via em0
00206 allow tcp from any to 10.10.254.249 dst-port 5006 via em0
65535 allow ip from any to any


В rc.conf прописано:
Код: Выделить всё
# Firewall
firewall_enable="YES"
firewall_type="closed"


как-то можно служебную строку изменить?
.ı|ı..ı|ı.
Андрей
местный житель
 
Сообщения: 1028
Зарегистрирован: 14 янв 2009, 13:37
Откуда: Оренбургская область

Re: pf 2 ipfw

Сообщение root » 02 ноя 2009, 10:24

Андрей писал(а):и все соединения рубятся.

ессно рубятся
ты ж правила написал тока в одну сторону, а в другую ?
когда что то рубится смотри по
Код: Выделить всё
ipfw show
какие правила deny отрабатываются и уже думай, почему пакет под него попал
если ты юзаешь фаирвол закрытого типа (последняя строка "deny all from any to any") то будь добр описать разрешающие правила и на вход и на выход, т.к. связь это двух сторонняя вещь :)
есть ещё возможность логировать отработку правил в log
если ты решил сделать фаирвол закрытого типа, то последнее правило с deny делаешь с опцией log
Код: Выделить всё
ipfw add 65534 deny log ip from any to any

при опции log все отброшенные пакеты будет записаны в файл /var/log/security
но кол-во записей ограничено, по умолчанию 1000 пакетов (помоему)
что бы увеличить эту цифру нуна в правило добавить опцию logamount
Код: Выделить всё
ipfw add 65534 deny log logamount 10000 ip from any to any

таким образом я увеличил кол-во отброшенных пакетов на запись в лог до 10000

соответственно зри в /var/log/security, какие пакеты отбрасываются и смотри по своим правилам, почему они не попали под allow если должны были попасть.

Андрей писал(а):В rc.conf прописано:

есть дефолтовый rc.conf
Код: Выделить всё
cat /etc/defaults/rc.conf | grep firewall

### Basic network and firewall/security options: ###
firewall_enable="NO" # Set to YES to enable firewall functionality
firewall_script="/etc/rc.firewall" # Which script to run to set up the firewall
firewall_type="UNKNOWN" # Firewall type (see /etc/rc.firewall)
firewall_quiet="NO" # Set to YES to suppress rule display
firewall_logging="NO" # Set to YES to enable events logging
firewall_flags="" # Flags passed to ipfw when type is a file
firewall_client_net="192.0.2.0/24" # Network address for "client" firewall.
firewall_simple_iif="ed1" # Inside network interface for "simple"
# firewall.
firewall_simple_inet="192.0.2.16/28" # Inside network address for "simple"
# firewall.
firewall_simple_oif="ed0" # Outside network interface for "simple"
# firewall.
firewall_simple_onet="192.0.2.0/28" # Outside network address for "simple"
# firewall.
firewall_myservices="" # List of TCP ports on which this host
# offers services for "workstation" firewall.
firewall_allowservices="" # List of IPs which have access to
# $firewall_myservices for "workstation"
# firewall.
firewall_trusted="" # List of IPs which have full access to this
# host for "workstation" firewall.
firewall_logdeny="NO" # Set to YES to log default denied incoming
# packets for "workstation" firewall.
firewall_nologports="135-139,445 1026,1027 1433,1434" # List of TCP/UDP ports
# logged for "workstation" firewall.
firewall_nat_enable="NO" # Enable kernel NAT (if firewall_enable == YES)
firewall_nat_interface="" # Public interface or IPaddress to use
firewall_nat_flags="" # Additional configuration parameters
natd_enable="NO" # Enable natd (if firewall_enable == YES).
ipv6_firewall_enable="NO" # Set to YES to enable IPv6 firewall
ipv6_firewall_script="/etc/rc.firewall6" # Which script to run to set up the IPv6 firewall
ipv6_firewall_type="UNKNOWN" # IPv6 Firewall type (see /etc/rc.firewall6)
ipv6_firewall_quiet="NO" # Set to YES to suppress rule display
ipv6_firewall_logging="NO" # Set to YES to enable events logging
ipv6_firewall_flags="" # Flags passed to ip6fw when type is a file


Андрей писал(а):как-то можно служебную строку изменить?

соответственно типы фаирвола описаны в скрипте /etc/rc.firewall и изменить можно там

так же дефолтовое правило системы с номером 65535 можно с deny изменить на permit пересобрав ядро с опцией:
Код: Выделить всё
options IPFIREWALL_DEFAULT_TO_ACCEPT

тогда последнее правило будет всегда звучать:
Код: Выделить всё
65535 allow ip from any to any


либо не использовать пред.установки вовсе, а использовать свой конфиг
пример такого использования есть в статье "Выпускаем локальную сеть в Интернет используя сервер на FreeBSD и NATD"
1. отредактировать файл /etc/rc.conf добавив:

firewall_enable="YES"
firewall_script="/etc/rc.firewall»
firewall_type="/usr/local/etc/firewall.conf"
firewall_quiet="YES"
firewall_logging="YES"
firewall_flags=""


2. написать наши правила в /usr/local/etc/firewall.conf:

add 100 allow ip from me to me via lo0
add 105 deny ip from any to any via lo0
add 300 divert 8668 ip from any to 10.10.1.2
add 310 divert 8668 ip from 192.168.1.0/24 to any
add 350 allow ip from any to 192.168.1.0/24
add 360 allow ip from 192.168.1.0/24 to any
add 65000 allow ip from any to any

соответственно правило 65000 будет идти до дефолтового 65535 deny ip from any to any и все пакеты будут разрешены
С уважением, root

Изображение
------------
www.mega-net.ru - IT аутсорсинг
Аватара пользователя
root
Site Admin
 
Сообщения: 1894
Зарегистрирован: 11 июн 2008, 13:05
Откуда: Moscow, Russia

След.

Вернуться в FreeBSD

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18