IPFW
Простейшие правила IPFW
в
rc.conf
втыкаем:
firewall_enable="YES"
firewall_type="/path/to/ipfw.conf"
где ipfw.conf
- файл (не скрипт) с правилами ipfw;
создаем ipfw.conf (или скачиваем файл ниже) и кладем его в соответствующее место, согласно пути, котрый мы напишем в /etc/rc.conf
принятые обозначения
service.ip.addr
- ip адрес, на котором работает служба или jail для нее.
lo.ca.l.ne/t
- наша локалка, например 192.168.5.1/24
К примеру, у нас все шары лежат на 192.168.5.100
, WebServer крутится в jail на адресе 192.168.5.106
и transmission в jail-e на 192.168.5.107
Тогда share.ip.addr
заменяем на 192.168.5.100
, web.ip.addr
заменяем на 192.168.5.106
, а transmission.ip.addr
заменяем на 192.168.5.107
Предполагаем, что порт форвардинг на роутере настроен на соответствующие ip-адреса
Также пердполагаем, что правил для IPFW нет совсем.
Однако, до прописывания файла ipfw.conf
и изменений в rc.conf
, пробуем запустить файервол:
service ipfw onestart
Оно должно выдать нечто вроде
Flushed all rules.
00100 allow ip from any to any via lo0
00200 deny ip from any to 127.0.0.0/8
00300 deny ip from 127.0.0.0/8 to any
00400 deny ip from any to ::1
00500 deny ip from ::1 to any
00600 allow ipv6-icmp from :: to ff02::/16
00700 allow ipv6-icmp from fe80::/10 to fe80::/10
00800 allow ipv6-icmp from fe80::/10 to ff02::/16
00900 allow ipv6-icmp from any to any ip6 icmp6types 1
01000 allow ipv6-icmp from any to any ip6 icmp6types 2,135,136
Строка с номером 00100 показывает, что rc.firewall
отрабатывает как положено;
Строки с номерами 00200-00300 сделаны для пресечения попытки подключения к localhost из сети; это не мешает машине работать нормально, т.к. подключение к localhost должно происходить через внутренний интерфейс lo0
.
Строки с номерами 00400-01000 появятся в случае, если файервол настроен на работу с IPv6
Если строка
allow ip from any to any via lo0
не появилась (номер может быть не 00100, а другой), то в
ipfw.conf
надо ставить первой строкой
add 00100 allow all from any to any via lo0
Если строка allow ip from any to any via lo0
появилась, но у нее другой номер, то номера следующих строк надо выставить так, чтобы это правило имело наименьший номер
Если вылезли правила для IPv6, то рекомендуется следить за нумерацией правил, чтобы эти номера были меньше номера первого правила для IPv6
Надо иметь в виду, что номер последнего в списке правила 65530 менять не надо - пускай оно остается таким.
Simple IPFW rules
Первая строка закоментирована, так как скорее всего, она у вас появляется сама. Не появилась – снимаем знак #
вначале первой строки
- ipfw.conf
add 00100 allow all from any to any via lo0
add 00101 check-state
add 00102 allow ip from me to any out established
add 00103 allow ip from any to me in established
add 00111 allow tcp from lo.ca.l.ne/t to me in setup keep-state
add 00112 allow tcp from me to lo.ca.l.ne/t out setup keep-state
add 00115 allow udp from lo.ca.l.ne/t to { me or 255.255.255.255 } in keep-state
add 00116 allow udp from me to lo.ca.l.ne/t out keep-state
add 00121 allow udp from any to transmission.ip.addr 51413 in keep-state
add 00122 allow tcp from any to transmission.ip.addr 51413 in setup keep-state
add 00123 allow udp from transmission.ip.addr 51413 to any out keep-state
add 00124 allow tcp from transmission.ip.addr to any 1024-65535 out setup keep-state
add 00130 allow udp from me to any 53,123 out keep-state
add 00131 allow udp from me to 255.255.255.255 out keep-state
add 00140 allow udp from me 5353 to { lo.ca.l.ne/t or 224.0.0.1/24 or 255.255.255.255 } 5353 in keep-state
add 00141 allow udp from me 5353 to { lo.ca.l.ne/t or 224.0.0.1/24 } 5353 out
add 00150 allow tcp from any to web.ip.addr 80 in setup keep-state
add 00201 allow icmp from me to any icmptypes 8 out keep-state
add 00202 allow icmp from any to any icmptypes 3,0,11 keep-state
add 00203 allow tcp from me to any 80 out setup keep-state
add 65500 deny ip from any to any
Замените переменные в строках 00111, 00112, 00115, 00121, 00122, 00123, 00124, 00140, 00141, 00150 !!
Описание строк
00101 проверяет, установлено ли правило (кажется).
00102 разрешает серверу подключаться к другим машинам по уже установленным соединениям (чтобы программа фаервола не бежала дальше проверять правила)
00103 разрешает другим подключаться к серверу по уже установленным правилам
00111 устанавливает тправило, разрешающее из локалки подключаться к серверу по TCP
00112 устанавливает тправило, разрешающее серверу подключатья к локальным компам по TCP
00115 устанавливает тправило, разрешающее из локалки подключаться к серверу, включая broadcast по UDP
00116 устанавливает тправило, разрешающее серверу подключатья к локальным компам по UDP
00121 устанавливает тправило, разрешающее любой машине подключаться к службе transmission по UDP на порт 51413
00122 устанавливает тправило, разрешающее любой машине подключаться к службе transmission по TCP на порт 51413
00123 устанавливает тправило, разрешающее серверу transmission подключатья к любым торрент-машинам по UDP
00124 устанавливает тправило, разрешающее серверу transmission подключатья к любым торрент-машинам по TCP
00130 устанавливает тправило, разрешающее серверу запрашивать у чужих серверов услуги
DNS и NTP
00131 устанавливает тправило, разрешающее серверу запрашивать у broadcast по UDP сведения о том, кто вокруг нуждается в услугах сервера
00140 устанавливает тправило, разрешающее серверу объявлять о себе через Bonjour (Rendezvois) порт 5353. Чтобы работало и по IPv6, выражение { lo.ca.l.ne/t or 224.0.0.1/24 or 255.255.255.255 }
надо заменить на простое any
00141 разрешает получать запросы Bonjour (Rendezvois) порт 5353. Чтобы работало и по IPv6, выражение { lo.ca.l.ne/t or 224.0.0.1/24 }
надо заменить на простое any
00150 разрешает всем подключаться к веб-серверу
00601-00602 устанавливает тправило, разрешающее серверу пинговать и отвечать на пинги.
00203 устанавливает тправило, разрешающее серверу подключаться к тракерам и к www-серверам для загрузки с них обновлений или других файлов
Простейший фаервольский скрипт с NAT
Предполагается, что ядро собрано с опциями
options IPFIREWALL
эта строка включит поддержку пакетного фильтра TCP/IP, который нам очень понадобится.
options IPDIVERT
эта строка необходима для работы демона NAT, она позволит пакетному фильтру отправлять некоторые пакеты на “переработку”.
При необходимости пересоберите ядро. Для этого, находясь в каталоге /usr/src/sys/<ARCH>/config нужно ввести следующие команды:
config MYROUTER
cd ../../compile/MYROUTER
make depend
make
make install
Конфигурирование.
В файл /etc/rc.conf нужно дописать следующие строки:
firewall_enable="YES"
firewall_script="/usr/local/billing/rc.firewall"
natd_enable="YES"
natd_interface="rl0"
gateway_enable="YES"
Этими строчками мы укажем, что мы хотим сделать наш сервер роутером, хотим использовать NAT, и хотим использовать пакетный фильтр. В параметре firewall_script мы указываем, что при загрузке системы хотим самостоятельно сконфигурировать firewall, а значение rl0 в параметре natd_interface указывает сетевую карту, которая подключена к провайдеру (грубо говоря - c какой стороны у нас интернет подключен).
Теперь осталось только создать скрипт, который автоматически сконфигурирует пакетный фильтр при загрузке системы. Для этого нам нужно создать исполняемый файл rc.firewall с правами 0700. В файл rc.firewall запишем:
ipfw='/sbin/ipfw -q'
${ipfw} -f flush
${ipfw} add divert natd all from any to any via rl0
${ipfw} add allow all from any to any
где rl0 - наша внешняя сетевая карта.
Еще раз все проверили, и можно перезагружаться… командой shutdown -r now.
Еще одна версия IPFW + NATD
Advanced IPFW+NAT
Подробное описание IPFW