Это конфиг Packet Filter на FreeBSD 9.В нем я хочу:
1) Выпускать конкретных юзеров <users> в интернет, при этом он должен пускать на конкретные TCP порты (tcp_services) и UDP порты (udp_services).
2) Выпускать конкретные IP на внешний FTP сервер в пассивном режиме. Сделать хочу через FTP Proxy, чтобы не открывать кучу лишних портов.
3) Банить всяких доссеров на www, ftp & pop3 трафик.
4) Раздавать на 8 клиентов 100-мегабитный канал, по 20 Мбит на каждого.
Код:==========================================================
ext_if = "nfe0" ## внешний интерфейс
int_if = "rl0" ## локальный интерфейс
lan="192.168.1.0/24"## локальная подсеть
## tcp порты использующиеся на сервере
tcp_services="{ 20, 21, 22, 25, 80, 53, 110, 143, 443, 3306, 8080 }"
## udp порты использующиеся на сервере
udp_services="{ 53, 514 }"
## эти IP выходят в интернет
table <users> {192.168.1.2}
table <ftpuser> {192.168.1.2}
## сюда пишем доссеров
table <ddos> persist
## сюда пишем ломящихся на почту
table <pop3> persist
##сбрасываем соединение грубо
set block-policy drop
## полностью пропускаем проверку на петле
set skip on lo0
## полностью пропускаем проверку на интерфейсе
set skip on $int_if
## включаем логирование на интерфейсе
set loginterface $ext_if
## оптимизация
set optimization normal
## нормализуем все входящие пакеты на всех интерфейсах
scrub in all
#нормализация трафика на
#внешнем интерфейсе, генерируется случайная последовательность в поле
#идентификации IP-пакета, устанавливается величина TTL=128, производится
#"дефрагментация" IP-пакетов, а также нормализация TCP соединений.
scrub on $ext_if all random-id no-df min-ttl 128 fragment reassemble reassemble tcp
# Очередь на внешнем интерфейсе для Upload
altq on $ext_if cbq bandwidth 40Mb queue {upload}
queue upload bandwidth 4.5Mb priority 2 cbq ( default )
# Очередь на локальном интерфейсе для Download
altq on $int_if cbq bandwidth 90Mb queue {download}
queue download bandwidth 18Mb priority 2 cbq ( default )
## проброс NAT внутри сеть
nat on $ext_if inet proto tcp from <users> to any port $tcp_services -> ($ext_if)
nat on $ext_if inet proto udp from <users> to any port $udp_services -> ($ext_if)
# icmp разрешим весь
nat on $ext_if inet proto icmp from <users> to any -> ($ext_if)
rdr-anchor "ftp-proxy/*"
rdr on $int_if proto tcp from <ftpuser> to !(self) port ftp -> 127.0.0.1 port 8021
anchor "ftp-proxy/*"
## правило для антиспуфинга
antispoof quick for $ext_if
## политика по умолчанию
block all
## разрешаем петлю
pass quick on lo0 all
## блочим всех кто попался в таблицу ddos
block in quick on $ext_if from <ddos> to any
## блочим всех кто попался в таблицу pop3
block in quick on $ext_if from <pop3> to any
## собираем в таблицу доссеров WWW трафика
pass in on $ext_if proto tcp to $ext_if port www flags S/SA keep state \(max-src-conn-rate 5/2, overload <ddos> flush)
## собираем в таблицу доссеров FTP трафика
pass in on $ext_if proto tcp to $ext_if port ftp flags S/SA keep state \( max-src-conn 400, max-src-conn-rate 400/2, overload <ddos> flush)
## собираем в таблицу доссеров POP3 трафика
pass in on $ext_if proto tcp from any to $ext_if port pop3 flags S/SA keep state (max-src-conn-rate 15/60, overload <pop3> flush)
## разрешаем внешний трафик на открытые tcp порты
pass in on $ext_if proto tcp from <users> to $ext_if port $tcp_services flags S/SA keep state
## разрешаем внешний трафик на открытые udp порты
pass in on $ext_if proto tcp from <users> to $ext_if port $udp_services keep state
## чистим траф www от SYN flood
pass in on $ext_if proto tcp from <users> to $ext_if port www flags S/SA synproxy state
## Применяем к юзерам ограничение скорости
pass in on $int_if from <users> to any queue (upload) modulate state
pass in on $int_if from $int_if:network to $int_if queue (download) modulate state
## разрешаем все модуляции для исходящих tcp соединений
pass out on $ext_if proto tcp all modulate state flags S/SA
## разрешаем исходящие протоколы
pass out on $ext_if proto {tcp, udp, icmp } all keep state
=============================================================
1. Мне не удается намертво отключить всех юзеров от внешнего мира, кроме внесенных в <users>.
Клиент имеет IP адрес - 192.168.1.3
Правила разрешают выходить в интернет только IP - 192.168.1.2
После применения правил у клиента (192.168.1.3) работает skype - это tcp и какой-то порт.
А так же обновляется 50\50 страница vk.com и gmail.com. Я подозреваю что эти сайты как-то хитро отдают информацию по разным протоколам.
2. Мне не удалось открыть доступ с клиентской машине на внешний FTP-сервер в пассивном режиме.
Что я делал:
1. в rc.conf
Код:==========================================================
ftpproxy_enable="YES"
ftpproxy_flags="-v -D 7"
=============================================================
2. в pf.conf
Код:==========================================================
rdr-anchor "ftp-proxy/*"
rdr on $int_if proto tcp from <ftpuser> to !(self) port ftp -> 127.0.0.1 port 8021
anchor "ftp-proxy/*"
=============================================================
Теперь ftp-proxy сам должен создавать правила для входящих. В обоих случаях !(self) - на случай ftp на самом шлюзе.
FileZilla в пассивном режиме (проверил в конфиге) пишет такой лог:
Код:==========================================================
Статус: Соединяюсь с 195.248.235.167:21...
Статус: Соединение установлено, ожидание приглашения...
Ответ: 220 ProFTPD 1.3.4 Server ready.
Команда: USER xxxxx@xxxxxxxxxxx.com
Ответ: 331 Password required for xxxxx@xxxxxxxxxxx.com
Команда: PASS ********
Ответ: 230 User xxxxx@xxxxxxxxxxx.com logged in
Статус: Server does not support non-ASCII characters.
Статус: Соединение установлено
Статус: Получение списка каталогов...
Команда: PWD
Ответ: 257 "/" is the current directory
Команда: TYPE I
Ответ: 200 Type set to I
Команда: PASV
Ответ: 227 Entering Passive Mode (195,248,235,167,139,2).
Команда: MLSD
Ошибка: Превышено время ожидания соединения
Ошибка: Не могу получить список каталогов!
=============================================================
То есть коннект есть, а списка директорий нету, хотя 20-й и 21-й порт проброшен.