Чего у меня ощущение, что я уже отвечал вчера вечером... Ну да ладно, попробую еще
Daywalker писал(а):
Я не гуру, я только учусь, но сделал ИМХО бы так:
Код: Выделить всё
ext_if="xl0" - внешний
int_if="xl1" - внутренний
internal_net="10.0.231.0/24" - моя домашняя сеть
me="{192.168.136.24, 10.0.231.1 }" # Etot host, router
Впринципе, если нет противопоказаний, то вместо списка me можно использовать слово self, оно включает все интерфейсы шлюза (включая локалхост). Вообщем аналог слова me в ipfw.
Daywalker писал(а):
Код: Выделить всё
1) block in all
2) pass out quick inet proto {tcp, udp} from $me to any port 80 keep state
3) pass out quick inet proto {tcp, udp} from $internal_net to any port {>=1024, <= 2024} keep state[/quote]
А где nat? Я так понимаю нужно добавить перед этими строками (так pf требует) строчку:
Код: Выделить всё
0) nat on $ext_if from $internal_net to any -> $ext_if #тут можно использовать не только внешний IP, но и имя интерфейса
Как сказанов документации к PF, трансляция происходит до фильтрации. Допустим у нас идет пакет из локалки, от 10.0.231.5 к
http://www.ru:80 Пройдя правило "0", в пакете меняется IP отправителя и попадает оно уже на под правило "3", а под правило "2".
Можно добавить в "0" слово pass:
Код: Выделить всё
nat pass on $ext_if from $internal_net to any -> $ext_if
В таком случае, судя по документации, пакет на фильтры не подается:
pass
Указывает, что пакет не должен направляться на фильтрующие правила.
Вот вроде как раз то, что надо, можно написать:
Код: Выделить всё
nat pass on $ext_if from $internal_net to any port {>=1024, <= 2024} -> $ext_if
Вместо any, если понадобится, можно указать таблицу исключений (например все, кроме вконтакте.ру).
Попробовал реализовать - вроде получилось. Понадобилось только добавить правило, чтоб пакеты идущие из локалки в инет на block-in не выпадали. Я сделал так:
Код: Выделить всё
pass in quick proto { tcp udp } from $int_net to !self keep state
pass out quick proto { tcp udp } from $int_net to !self keep state
Не уверен, что правило с out нужно, потом проверю без него. По идее пакеты должны на Nat pass вываливаться из фильтра.
На данный момент получился вот такой конфиг:
Код: Выделить всё
#Переменные
ext_tv_if = "rl0"
ext_tv_ip = "86.961.617.68"
ext_izet_if = "sk0"
ext_izet_ip = "192.168.209.230"
#ext_corbina_if=""
#ext_corbina_ip=""
int_if = "rl1"
int_ip = "192.168.143.1"
int_net ="192.168.143.0/24"
#Таблица адресов, которые не считаются интернетом. Сюда включены все используемые локалки
table <not_internet> {192.168.0.0/16, 10.196.0.0/16, 10.192.0.0/16, 10.200.0.0/16, 10.204.0.0/16 }
#Таблица локалок провайдера. От предыдущей отличается только тем, что исключена моя подсеть
table <interzet> {192.168.0.0/16, 10.196.0.0/16, 10.192.0.0/16, 10.200.0.0/16, 10.204.0.0/16, !192.168.143.0/24}
# Порты на которые может соединятся шлюз. На самом деле ftp так работать не будет, надо разрешать out на порты >1024
fw_ports = "{ 80 21 }"
set block-policy drop
set skip on lo0
#С нормализацией еще толком не разбирался, поставил просто попробовать.
scrub in all
#Заруливаем на сквид все что идет в инет (вернее в "не неинтернет" :D )
rdr on $int_if inet proto tcp from $int_net to !<not_internet> port = 80 -> 127.0.0.1 port 3128
#Пакетам идущим в инет меняем IP на внешний
nat pass on $ext_tv_if from $int_net to !<not_internet> -> $ext_tv_ip
#Пакетам идущим в локалку вторгого прова, меняем IP
nat pass on $ext_izet_if from $int_net to <interzet> -> $ext_izet_ip
#Все кругом запретить, и писать в лог
block in log-all
block out log-all
#ssh на шлюз. Кривой порт, чтоб не ломились с перебором.
pass in quick proto tcp from any to self port = 34671 keep state
#Разрешает dns запросы к шлюзу. Потом ограничу только локалкой и самим шлюзом
pass in quick proto udp from any to self port = 53 keep state
#Входящий порт для rtorrent-а висящего на шлюзе :roll:
pass in quick proto tcp from any to $ext_tv_ip port = 6981 keep state
#Разрешает пакет из локалки куда угодно, лишь бы не к шлюзу
pass in quick proto { tcp udp } from $int_net to !self keep state
pass out quick proto { tcp udp } from $int_net to !self keep state
#Разрешение собственно для шлюза
pass out quick proto udp from self to any port = 53 keep state
pass out quick proto tcp from self to any port $fw_ports keep state
Кратко о сети:
У меня инет от одного прова ($ext_tv_if) и огромная локалка от второго ($ext_izet_if).
Через некоторое время появится еще локалка от еще одного прова и vpn от него. + мой vpn, между офисами. Т.е. добавится еще 3 интерфеса.
Из того, что надо сделать - в первую очередь привязать правила к интерфейсам. Сейчас все правила написаны без учета того, на каком интерфейсе оно.
Если кто-то укажет на явные ошибки, буду благодарен.