Мой первый pf

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

Модератор: terminus

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Мой первый pf

Непрочитанное сообщение dikens3 » 2007-11-10 22:04:24

Вот состряпал тут в целях изучения.
Вобщем шлюз, 2-а интерфейса + tun0 (PPPoE:ed0 и nat на ppp).
Нужно было uTorrent сделать только для нашего нижегородского кольца, а так всё обычно. FTP - Активный.
Вобщем жду предложений и чего угодно вообще. Мой первый фаер на pf.

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

ed0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        ether 00:c0:df:f2:36:08
        media: Ethernet autoselect (10baseT/UTP)
rl0: flags=8843<UP,BROADCAST,RUNNING,SIMPLEX,MULTICAST> mtu 1500
        options=8<VLAN_MTU>
        inet 192.168.10.1 netmask 0xffffff00 broadcast 192.168.10.255
        ether 00:80:48:14:86:ee
        media: Ethernet autoselect (100baseTX)
        status: active
pflog0: flags=141<UP,RUNNING,PROMISC> mtu 33208
lo0: flags=8049<UP,LOOPBACK,RUNNING,MULTICAST> mtu 16384
        inet 127.0.0.1 netmask 0xff000000
tun0: flags=8051<UP,POINTOPOINT,RUNNING,MULTICAST> mtu 1492
        inet 89.109.49.112 --> 89.109.48.1 netmask 0xffffffff
        Opened by PID 373
cat pf.conf

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

################################################################################
# Глобальная конфигурация pf
set block-policy drop           # Действие block будет молча отбрасывать пакеты
set debug urgent                # Уровень отладки (none, urgent, misc, loud)
set fingerprints "/etc/pf.os"   # Файл с информацией для пассивного определения системы передающей пакеты
set state-policy if-bound       # Таблица состояний будет работать только на конкретном интерфейсе, с которого вошёл пакет.

################################################################################
# Интерфейсы
ext_if="tun"
lan_if="rl0"

################################################################################
# Описываем различные сети
table <my_networks> persist { 192.168.10.0/24 }
table <server_ips> persist { self }
table <server_lan_ip> persist { 192.168.10.1 }
table <dns_servers> persist { 213.177.96.1, 213.177.97.1 }
table <reserved_networks> persist { 0.0.0.0/8, 10.0.0.0/8, 172.16.0.0/12, 192.0.2.0/24, 192.168.0.0/16, 169.254.0.0/16, 224.0.0.0/3 }

# ixnn
table <ixnn_vt_block> persist { 213.177.96.6/32, 213.177.96.8/32, 213.177.96.9/32, 213.177.96.221/32, 213.177.97.26/32 }
ixnn_sandy="193.125.70.0/23, 194.190.176.0/20, 195.122.224.0/19, 217.18.52.0/23, 91.194.192.0/23"
ixnn_ads="195.98.32.0/19, 212.92.128.0/18, 217.118.93.0/24, 89.189.0.0/19"
ixnn_nts="78.40.184.0/21, 217.23.16.0/20"
ixnn_nngu="85.143.0.0/20, 89.28.199.0/24"
ixnn_nis="212.67.0.0/19"
ixnn_pss="217.25.80.0/22, 85.91.192.0/21"
ixnn_vt="82.208.64.0/18, 89.109.0.0/18, 213.177.96.0/19"

# Все ixnn таблицы в одной
table <ixnn_all> persist { $ixnn_sandy $ixnn_ads $ixnn_nts $ixnn_nngu $ixnn_nis $ixnn_pss $ixnn_vt }

################################################################################
# Списки портов и icmp типов
utorrent="{ 59034 }"
tcp_ports_out="{ 21,22,25,80,110,443,5190 }"

for_lan_icmp_types="{0,8}"
for_lan_ports_tcp="{22}"
for_lan_ports_udp="{123}"

################################################################################

# Отключаем pf для локального интерфейса
set skip on lo

# Нормализация всего входящего трафика
scrub in all

# Отправляем трафик на squid
rdr on $lan_if inet proto tcp from <my_networks> to any port 80 -> 127.0.0.1 port 3128

# Типа защита от NMAP
block in log quick from any os NMAP

# Антиспуфинг
antispoof quick for $lan_if inet

################################################################################
# Входящий/Исходящий трафик нашей сети и сервера
# icmp
pass in quick on $lan_if inet proto icmp from <my_networks> to <server_lan_ip> icmp-type $for_lan_icmp_types keep state

# tcp
pass in quick on $lan_if inet proto tcp from <my_networks> to 127.0.0.1 port 3128
pass in quick on $lan_if inet proto tcp from <my_networks> to <server_lan_ip> port $for_lan_ports_tcp keep state

# udp
pass in quick on $lan_if inet proto udp from <my_networks> to <server_lan_ip> port $for_lan_ports_udp keep state

# От сервера в сеть всё разрешено
pass out quick on $lan_if inet from <server_lan_ip> to any modulate state

################################################################################
# Входящий/Исходящий трафик нашей сети и интернет
# Блокируем зарезервированные сети (Нужные пропущены правилами выше)
block in quick on $lan_if inet from any to <reserved_networks>
block in quick on $ext_if inet from <reserved_networks> to any

# icmp
pass in quick on $lan_if inet proto icmp from <my_networks> to any icmp-type 8 keep state
pass out quick on $ext_if inet proto icmp from <my_networks> to any icmp-type 8 keep state

# tcp
# uTorrent (блокируем исключения в ixnn)
block in quick on $lan_if inet proto tcp from <my_networks> port $utorrent to <ixnn_vt_block>
block in quick on $ext_if inet proto tcp from { <ixnn_vt_block>, ! <ixnn_all> } to <my_networks> port $utorrent

# uTorrent
pass in quick on $lan_if inet proto tcp from <my_networks> port $utorrent to <ixnn_all> keep state
pass out quick on $ext_if inet proto tcp from <my_networks> port $utorrent to <ixnn_all> keep state

# Разрешённые TCP порты наружу
pass in quick on $lan_if inet proto tcp from <my_networks> to <ixnn_all> keep state
pass out quick on $ext_if inet proto tcp from <my_networks> to <ixnn_all> keep state
pass in quick on $lan_if inet proto tcp from <my_networks> to any port $tcp_ports_out keep state
pass out quick on $ext_if inet proto tcp from <my_networks> to any port $tcp_ports_out keep state

# Разрешённые TCP порты во внутрь
pass in quick on $ext_if inet proto tcp from <ixnn_all> to <my_networks> port $utorrent keep state
pass out quick on $lan_if inet proto tcp from <ixnn_all> to <my_networks> port $utorrent keep state
pass in quick on $ext_if inet proto tcp from any port 20 to <my_networks> keep state flags S/SA
pass out quick on $lan_if inet proto tcp from any port 20 to <my_networks> keep state flags S/SA

# udp
# Наш DNS
pass in quick on $lan_if inet proto udp from <my_networks> to <dns_servers> port 53 keep state
pass out quick on $ext_if inet proto udp from <my_networks> to <dns_servers> port 53 keep state

#############################################################
# Входящий/Исходящий трафик сервера и интернет

# От сервера в инет всё разрешено
pass out quick on $ext_if inet from <server_ips> to any modulate state

#############################################################
# Всякая ботва, чтобы логи не захломляли
block in quick on $ext_if inet proto { tcp , udp } from any to any port {137:139, 445}

# Убиваем всё остальное
block log-all quick all
Вывод pfctl -sr

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

scrub in all fragment reassemble
block drop in log quick from any os "NMAP" to any
block drop in quick on ! rl0 inet from 192.168.10.0/24 to any
block drop in quick inet from 192.168.10.1 to any
pass in quick on rl0 inet proto icmp from <my_networks> to <server_lan_ip> icmp-type echorep keep state (if-bound)
pass in quick on rl0 inet proto icmp from <my_networks> to <server_lan_ip> icmp-type echoreq keep state (if-bound)
pass in quick on rl0 inet proto tcp from <my_networks> to 127.0.0.1 port = 3128
pass in quick on rl0 inet proto tcp from <my_networks> to <server_lan_ip> port = ssh keep state (if-bound)
pass in quick on rl0 inet proto udp from <my_networks> to <server_lan_ip> port = ntp keep state (if-bound)
pass out quick on rl0 inet from <server_lan_ip> to any modulate state (if-bound)
block drop in quick on rl0 inet from any to <reserved_networks>
block drop in quick on tun inet from <reserved_networks> to any
pass in quick on rl0 inet proto icmp from <my_networks> to any icmp-type echoreq keep state (if-bound)
pass out quick on tun inet proto icmp from <my_networks> to any icmp-type echoreq keep state (if-bound)
block drop in quick on rl0 inet proto tcp from <my_networks> port = 59034 to <ixnn_vt_block>
block drop in quick on tun inet proto tcp from <ixnn_vt_block> to <my_networks> port = 59034
block drop in quick on tun inet proto tcp from ! <ixnn_all> to <my_networks> port = 59034
pass in quick on rl0 inet proto tcp from <my_networks> port = 59034 to <ixnn_all> keep state (if-bound)
pass out quick on tun inet proto tcp from <my_networks> port = 59034 to <ixnn_all> keep state (if-bound)
pass in quick on rl0 inet proto tcp from <my_networks> to <ixnn_all> keep state (if-bound)
pass out quick on tun inet proto tcp from <my_networks> to <ixnn_all> keep state (if-bound)
pass in quick on rl0 inet proto tcp from <my_networks> to any port = ftp keep state (if-bound)
pass in quick on rl0 inet proto tcp from <my_networks> to any port = ssh keep state (if-bound)
pass in quick on rl0 inet proto tcp from <my_networks> to any port = smtp keep state (if-bound)
pass in quick on rl0 inet proto tcp from <my_networks> to any port = http keep state (if-bound)
pass in quick on rl0 inet proto tcp from <my_networks> to any port = pop3 keep state (if-bound)
pass in quick on rl0 inet proto tcp from <my_networks> to any port = https keep state (if-bound)
pass in quick on rl0 inet proto tcp from <my_networks> to any port = aol keep state (if-bound)
pass out quick on tun inet proto tcp from <my_networks> to any port = ftp keep state (if-bound)
pass out quick on tun inet proto tcp from <my_networks> to any port = ssh keep state (if-bound)
pass out quick on tun inet proto tcp from <my_networks> to any port = smtp keep state (if-bound)
pass out quick on tun inet proto tcp from <my_networks> to any port = http keep state (if-bound)
pass out quick on tun inet proto tcp from <my_networks> to any port = pop3 keep state (if-bound)
pass out quick on tun inet proto tcp from <my_networks> to any port = https keep state (if-bound)
pass out quick on tun inet proto tcp from <my_networks> to any port = aol keep state (if-bound)
pass in quick on tun inet proto tcp from <ixnn_all> to <my_networks> port = 59034 keep state (if-bound)
pass out quick on rl0 inet proto tcp from <ixnn_all> to <my_networks> port = 59034 keep state (if-bound)
pass in quick on tun inet proto tcp from any port = ftp-data to <my_networks> flags S/SA keep state (if-bound)
pass out quick on rl0 inet proto tcp from any port = ftp-data to <my_networks> flags S/SA keep state (if-bound)
pass in quick on rl0 inet proto udp from <my_networks> to <dns_servers> port = domain keep state (if-bound)
pass out quick on tun inet proto udp from <my_networks> to <dns_servers> port = domain keep state (if-bound)
pass out quick on tun inet from <server_ips> to any modulate state (if-bound)
block drop in quick on tun inet proto tcp from any to any port 137:139
block drop in quick on tun inet proto tcp from any to any port = microsoft-ds
block drop in quick on tun inet proto udp from any to any port 137:139
block drop in quick on tun inet proto udp from any to any port = microsoft-ds
block drop log-all quick all
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

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

Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

Re: Мой первый pf

Непрочитанное сообщение Andy » 2007-11-11 9:48:28

Если идут два правила pass in/out, можно написать просто pass.
Хотя если первый раз, то конечно лучше расписать все подробнее.
http://dreamcatcher.ru/index.php?option ... 0&Itemid=5
Неплохая статья об оптимизации правил pf.
P.S: А почему ты встроенной возможностью nat в pf, не воспользовался?
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Re: Мой первый pf

Непрочитанное сообщение dikens3 » 2007-11-11 9:53:32

Andy писал(а):Если идут два правила pass in/out, можно написать просто pass.
Пробовал, никак не пойму (Озарение приходит постепенно) как можно одной строкой сделать 4 проверки. (in-out во вне и in-out во внутрь). Так что пока так удобнее.
P.S: А почему ты встроенной возможностью nat в pf, не воспользовался?
А смысл, если можно использовать ppp-шный NAT. (Позже буду им заниматься)

Вопрос такой, можно порты в одной строке сделать или никак?
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

Re: Мой первый pf

Непрочитанное сообщение Andy » 2007-11-11 10:05:14

dikens3 писал(а):
Andy писал(а):Если идут два правила pass in/out, можно написать просто pass.
Пробовал, никак не пойму (Озарение приходит постепенно) как можно одной строкой сделать 4 проверки. (in-out во вне и in-out во внутрь). Так что пока так удобнее.
P.S: А почему ты встроенной возможностью nat в pf, не воспользовался?
А смысл, если можно использовать ppp-шный NAT.
Правила не заменяются, они раскладываются ( у Евгения Миньковского хорошо объяснен этот момент)
К примеру,

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

# Наш DNS
pass in quick on $lan_if inet proto udp from <my_networks> to <dns_servers> port 53 keep state
pass out quick on $ext_if inet proto udp from <my_networks> to <dns_servers> port 53 keep state
Можно сделать так:

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

pass quick on $lan_if inet proto udp from <my_networks> to <dns_servers> port 53 keep state
Что касается ната, раз уж ты начал использовать pf, то почему бы не использовать его
возможности шире?
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Re: Мой первый pf

Непрочитанное сообщение dikens3 » 2007-11-11 10:43:37

Что касается ната, раз уж ты начал использовать pf, то почему бы не использовать его
возможности шире?
Буду использовать, когда пойму что-нибудь. Сейчас нет необходимости, и ppp-nat свою работу делает на 100% как мне нужно.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
demondem10
сержант
Сообщения: 284
Зарегистрирован: 2007-07-10 11:00:10
Откуда: kazakhstan

Re: Мой первый pf

Непрочитанное сообщение demondem10 » 2008-01-21 15:02:13

DIk салам
у меня это тоже первый PF но вот что то нихера не выходит
пытаюсь пробросить потр ssh на внутр сервер
bce0 provider (192,168,0,102) щас я на этом интерфейсе сижу типа как бы из инета коннект
em0 dmz (10,10,0,1)тут сервак стоит на который мы просимся
у него адресс 10,10,0,2
tcpdump показывает что есть коннект

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

192.168.0.213:1092 > servername.ru.ssh win 65535 <mis 1460.nop.nop.sackOk>
Знания принадлежат человечеству!!!

Аватара пользователя
dikens3
подполковник
Сообщения: 4856
Зарегистрирован: 2006-09-06 16:24:08
Откуда: Нижний Новгород
Контактная информация:

Re: Мой первый pf

Непрочитанное сообщение dikens3 » 2008-01-21 15:21:06

Нашёл кого спросить. Я пока забросил PF. Перенаправление не делал, но не думаю что это сложно.

1. Написать правило перенаправления на шлюзе.
2. Проверить, отправляется ли пакет на нужный сервер в сети?
3. Приходит на сам сервер или теряется в дороге?
4. Ответ отправляется на шлюз?
5. Шлюз ответ получает?
6. Шлюз отправляет в инет ответ от сервера?

Собственно вот примерный порядок обследования проблем, как я его вижу.
tcpdump + логи PF и думай. Я бы так поступил.
Лучше установить FreeBSD, чем потратить 30 лет на Linux'ы и выяснить какой из них хуже.

Аватара пользователя
demondem10
сержант
Сообщения: 284
Зарегистрирован: 2007-07-10 11:00:10
Откуда: kazakhstan

Re: Мой первый pf

Непрочитанное сообщение demondem10 » 2008-01-21 15:35:40

спфсибки! пойду думать
Знания принадлежат человечеству!!!