RelaxДом

RelaxДом (https://forum.relaxdom.net/index.php)
-   Unix (https://forum.relaxdom.net/forumdisplay.php?f=158)
-   -   Настройка файрволла IPFW в FreeBSD (https://forum.relaxdom.net/showthread.php?t=55920)

FreeSky 28.04.2010 19:53

Настройка файрволла IPFW в FreeBSD
 
Вложений: 1
Итак, добрались у меня руки и до фряхи. Естественно, файрволл на серваке нужен. Почитав немного информации из Google и lissyara.su настроил файрволл, но со своими поправками. Предлагаю здесь свой вариант настройки файрволла IPFW.

1. Конфигурирование ядра
Для использования IPFW надо пересобрать ядро системы, т.к. по умолчанию поддержка файрволла в ядре выключена. Все делается очень просто. Если у вас установлены исходные коды ядра FreeBSD, то можете пропустить следующий подраздел.

1.1. Установка исходного кода ядра
Вставьте установочный диск FreeBSD в привод и запустите sysinstall:
Код:

# sysinstall
В появившемся меню выберите пункт Configure, затем пункт Distributions и наконец src. Во вновь появившемся списке отметьте пункт sys. Далее выходите из всех меню и дождитесь окончания установки, после чего закройте sysinstall. На этом установка исходников ядра завершена.

1.2. Конфигурация нового ядра
Теперь настало время включить поддержку IPFW в ядре. Переходим в папку с исходниками (на примере ядра для i386):
Код:

# cd /usr/src/sys/i386/conf
Скопируем старый конфиг в новый файл:
Код:

# cp GENERIC GENERIC_FW
Открываем новый файл конфига:
Код:

# ee GENERIC_FW
Исправляем в этом файле некоторые опции. У вас может быть другое содержание файла, я не увидел смысла приводить все опции и привел фактически только заголовок конфига, нужные опции выделены другим шрифтом:
Код:

cpu            I486_CPU
cpu            I586_CPU
cpu            I686_CPU
ident          GENERIC_FW

# To statically compile in device wiring instead of /boot/device.hints
#hints          "GENERIC_FW.hints"        # Default places to look for devices.

makeoptions    DEBUG=-g                # Build kernel with gdb(1) debug symbols

options        SCHED_4BSD              # 4BSD scheduler
options        PREEMPTION              # Enable kernel thread preemption
options        INET                    # InterNETworking
options        INET6                  # IPv6 communications protocols
options        SCTP                    # Stream Control Transmission Protocol
options        FFS                    # Berkeley Fast Filesystem
options        SOFTUPDATES            # Enable FFS soft updates support
options        UFS_ACL                # Support for access control lists
options        UFS_DIRHASH            # Improve performance on big directories
options        UFS_GJOURNAL            # Enable gjournal-based UFS journaling
options        MD_ROOT                # MD is a potential root device
options        NFSCLIENT              # Network Filesystem Client
options        NFSSERVER              # Network Filesystem Server
options        NFS_ROOT                # NFS usable as /, requires NFSCLIENT
options        MSDOSFS                # MSDOS Filesystem
options        CD9660                  # ISO 9660 Filesystem
options        PROCFS                  # Process filesystem (requires PSEUDOFS)
options        PSEUDOFS                # Pseudo-filesystem framework
options        GEOM_PART_GPT          # GUID Partition Tables.
options        GEOM_LABEL              # Provides labelization
options        COMPAT_43TTY            # BSD 4.3 TTY compat [KEEP THIS!]
options        COMPAT_FREEBSD4        # Compatible with FreeBSD4
options        COMPAT_FREEBSD5        # Compatible with FreeBSD5
options        COMPAT_FREEBSD6        # Compatible with FreeBSD6
options        SCSI_DELAY=5000        # Delay (in ms) before probing SCSI
options        KTRACE                  # ktrace(1) support
options        SYSVSHM                # SYSV-style shared memory
options        SYSVMSG                # SYSV-style message queues
options        SYSVSEM                # SYSV-style semaphores
options        _KPOSIX_PRIORITY_SCHEDULING # POSIX P1003_1B real-time extensions
options        KBD_INSTALL_CDEV        # install a CDEV entry in /dev
options        ADAPTIVE_GIANT          # Giant mutex is adaptive.
options        STOP_NMI                # Stop CPUS using NMI instead of IPI
options        AUDIT                  # Security event auditing
# Firewall options
options        IPFIREWALL # файрволл
options        IPFIREWALL_VERBOSE # включаем возможность лога пакетов
options        IPFIREWALL_VERBOSE_LIMIT=5 # ограничение повторяющихся логов
options        IPFIREWALL_FORWARD # подключаем возможность форвардинга
options        IPDIVERT # подключаем возможности управления NAT'ом
options        DUMMYNET # включаем управление сетевым трафиком
options        IPFIREWALL_DEFAULT_TO_ACCEPT # политика файрволла по умолчанию - разрешать все
... # остальные опции

Обратите внимание на то, что все встречающиеся в файле строки GENERIC надо заменить на GENERIC_FW. Всё, сохраняем файл и выходим из редактора.

1.3. Сборка нового ядра
Теперь можно приступать к сборке ядра. Выходи на три каталога выше:
Код:

# cd /usr/src
и собираем ядро:
Код:

# make buildkernel KERNCONF=GENERIC_FW && make installkernel KERNCONF=GENERIC_FW
Дождитесь окончания сборки и установки нового ядра а затем перезагрузитесь:
Код:

# shutdown -r now
2. Конфигурация IPFW
Не буду вдаваться в основы написания правил IPFW; хотя это и относится к данной теме, но для этого лучше почитать специальную литературу, которой полно в гугле, в частности не мешало бы почитать основы функционирования сетей. Но сейчас не об этом :) Напишем скрипт, через который можно полностью управлять нашим файрволлом. Пусть он будет лежать в /usr/local/bin для простоты доступа. Итак, создаем сам файл скрипта (в моем примере это /usr/local/bin/ipfwset):
Код:

#!/bin/sh
# нужные переменные
fw="/sbin/ipfw -q" # путь к исполняемому файлу IPFW; дополнительно отключаем вывод результатов выполнения команд
ip="192.168.1.4" # ip-адрес нашей машины
iface="vr0" # сетевой интерфейс
o_subnet="192.168.1.0/24" # указываем нашу подсеть
l_subnet="127.0.0.0/8" # указываем подсеть на локальнйо машине

# настройка интерфейса обратной петли
setup_loopback() {
    ${fw} add deny log all from any to ${l_subnet}
    ${fw} add deny log all from ${l_subnet} to any
    ${fw} add allow all from any to any via lo0
}

# разрешаем сервисы dns, icmp, ping...
setup_resolv() {
    ${fw} add allow icmp from any to any via ${iface}
    ${fw} add allow udp from any 53 to any via ${iface}
}

# функция настройки правил файрволла
start_fw() {
    # системные настройки
    ${fw} -f flush # очищаем старые правила
    ${fw} add check-state # включаем контроль за флагами состояний пакетов
    setup_loopback # настраиваем обратную петлю
    ${fw} add allow all from any to any established # разрешить использование установленных соединений
    ${fw} add allow all from me to any out # разрешить отправку пакетов с данного компьютера
    setup_resolv # настраиваем системные сервисы
   
    # дополнительная настройка сервисов
    ${fw} add allow tcp from any to ${ip} 21 via ${iface} # ftp
    ${fw} add allow tcp from any to ${ip} 49152-65535 via ${iface} # диапазон портов ftp для пассивного режима, узнается вот так: # sysctl net.inet.ip.portrange.first и # sysctl net.inet.ip.portrange.last
    ${fw} add allow tcp from any to ${ip} 22 via ${iface} # ssh
    ${fw} add allow tcp from any to ${ip} 80 via ${iface} # www
    ${fw} add allow udp from any 123 to ${ip} via ${iface} # ntp
    ${fw} add allow tcp from ${o_subnet} to ${ip} 137,138,139,445 # samba tcp
    ${fw} add allow udp from ${o_subnet} to ${ip} 137,138,139,445 # samba udp
    ${fw} add allow tcp from any 8245 to ${ip} via ${iface} # no-ip tcp
    ${fw} add allow udp from any 8245 to ${ip} via ${iface} # no-ip udp
   
    ${fw} add deny log all from any to any via ${iface} # закрываем другие порты
}

# вводим дополнительный функционал
case "$1" in
start) # старт файрволла
    echo -n "Starting firewall: "
    start_fw
    if [ "$?" = 0 ]; then
        echo "ok.";
    else
        echo "failed. Error code: $?.";
    fi
    ;;
stop) # остановка файрволла
    echo -n "Stopping firewall: "
    ${fw} -f flush
    if [ "$?" = 0 ]; then
        echo "ok.";
    else
        echo "failed. Error code: $?.";
    fi
    ;;
restart) # перезапуск файрволла
    echo -n "Restarting firewall: "
    ${fw} -f flush
    start_fw
    if [ "$?" = 0 ]; then
        echo "ok.";
    else
        echo "failed. Error code: $?.";
    fi
    ;;
list) # показать список правил
    echo "Firewall rules:"
    ${fw} show
    ;;
*) # во всех других случаях...
    echo "Usage: $0 start|stop|restart|list"
    ;;
esac

exit 0

3. Настройка автозапуска файрволла
Делаем наш скрипт исполнимым:
Код:

# chmod +x /usr/local/bin/ipfwset
и добавляем его в запуск при старте системы:
Код:

# ee /etc/rc
Перейдите в конец файла и перед строкой exit 0 вставьте следующее:
Код:

/usr/local/bin/ipfwset start
Сохраняем файл и выходим.

Всё, наш файрволл настроен. Перезагружаемся и проверяем :)
P.S.: тем, кому лень что-либо писать, могут скачать скрипт из аттача


Часовой пояс GMT +4, время: 18:40.

Powered by vBulletin® Version 3.8.2
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot