Поскольку основная часть системы IPFW, с помощью которого мы собираемся разруливать наш трафик, то есть соберем интернет шлюз для выхода сотрудников в интернет, находится в ядре, необходимо пересобрать ядро. Для того, чтобы пересобрать ярдо системы необходимо из портов установить исходники ядра. Для этого под правами суперпользователя:
# sysinstall Configure -> Distributions -> src -> sys |
Отметить пакет "sys" и установить его.
После установки зайти в каталог /usr/src/sys/i386/conf/
# cd /usr/src/sys/i386/conf/ |
Создаем тут файл конфигурации ядра (назовём его GATE):
include GENERIC options NETGRAPH options NETGRAPH_ASYNC options NETGRAPH_BPF options NETGRAPH_ECHO options NETGRAPH_ETHER options NETGRAPH_HOLE options NETGRAPH_IFACE options NETGRAPH_KSOCKET options NETGRAPH_L2TP options NETGRAPH_LMI options NETGRAPH_MPPC_ENCRYPTION options NETGRAPH_ONE2MANY options NETGRAPH_PPP options NETGRAPH_PPPOE options NETGRAPH_PPTPGRE options NETGRAPH_RFC1490 options NETGRAPH_SOCKET options NETGRAPH_TEE options NETGRAPH_TTY options NETGRAPH_UI options NETGRAPH_VJC options SYSVMSG options MSGMNB=8192 # max # of bytes in a queue options MSGMNI=40 # number of message queue identifiers options MSGSEG=512 # number of message segments per queue options MSGSSZ=64 # size of a message segment options MSGTQL=2048 # max messages in system options IPFIREWALL options IPFIREWALL_VERBOSE options IPFIREWALL_FORWARD options IPFIREWALL_DEFAULT_TO_ACCEPT options IPFIREWALL_VERBOSE_LIMIT=100 options IPFIREWALL_NAT options LIBALIAS options IPDIVERT options IPFILTER options IPFILTER_LOG options IPSTEALTH options IPSEC options IPSEC_DEBUG options DUMMYNET device crypto device vlan |
Некоторые опции:
-
options IPFIREWALL - собственно файрволл
-
options IPFIREWALL_VERBOSE - логгинг пакетов, если в правиле написано `log`
-
options IPFIREWALL_VERBOSE_LIMIT - ограничение логов (повторяющихся) - на случай атак типа флудинга
-
options IPFIREWALL_FORWARD - перенаправление (форвардинг) пакетов например, для прозрачного прокси
-
options IPDIVERT - если нужен NAT (трансляция адресов)
-
options DUMMYNET - если понадобится ограничивать скорость инета пользователям
-
options IPFIREWALL_DEFAULT_TO_ACCEPT - дефолтовое правило (последнее) будет разрешающим (во всех других) случаях - запрещающее
Далее пересборка ядра:
# config GATE # cd /usr/src/sys/i386/compile/GATE/ # make depend # make # make install |
Если все команды выполнились без ошибок, то перезагружаем сервер и получаем новое ядро с поддержкой файрвола ipfw и механизма IPDivert-"заворачивание" пакетов на дополнительную обработку.
Добавляем в файл /etc/rc.conf следующие строки:
sshd_enable="YES" gateway_enable="YES" ifconfig_sk0="inet 217.73.116.210 netmask 255.255.255.248" ifconfig_sk1="inet 192.168.20.1 netmask 255.255.255.0" defaultrouter="217.73.116.209" hostname="exim.local" openvpn_enable="YES" openvpn_if="tun" openvpn_flags="--log /var/log/openvpn/openvpn.log" openvpn_dir="/usr/local/etc/openvpn" firewall_enable="YES" firewall_type="/etc/rc.firewall" firewall_logging="YES" natd_enable="YES" natd_interface="sk0" natd_flags="-m -u -s" |
Настройки firewall ipfw находятся в файле /etc/rc.firewall.
Рабочие правила выглядят следующим образом:
#!/bin/sh - fwcmd="/sbin/ipfw -q add" natcmd="/sbin/ipfw nat" skip="skipto 500" ks="keep-state" good_tcpo = "21,22,25,37,53,80,110,123,143,443" # set these to your VPN interface network and ip vifm="tun0" vipm="77.108.89.72" # outside interface network and netmask and ip oif="sk0" oip="217.73.116.210" # inside interface network and netmask iif="sk1" inet="192.168.20.0/24" iip="192.168.20.1"
# flush all rules /sbin/ipfw -f flush
# Exclude Lan traffic ${fwcmd} 20 allow all from ${oip} to any out via ${oif} setup $ks ${fwcmd} 21 allow all from any to any via lo0 ${fwcmd} 22 allow all from any to any via ${iif} #${fwcmd} 23 allow icmp from any to any via ${oif}
#VPN openVPN ${fwcmd} 63 allow all from any to any via ${vifm}
# Allow SSH access ${fwcmd} 82 allow tcp from any to ${oip} 22 setup $ks
${fwcmd} 90 allow icmp from any to any in via ${oif} icmptype 0,1,3,4,8,11,12
# NAT in ${fwcmd} 100 divert natd all from any to ${oip} in via ${oif} ${fwcmd} 101 check-state #${fwcmd} 100 nat 510 ip from any to ${oip} in via ${oif} #${fwcmd} 101 check-state
# Authorized outbound packets ${fwcmd} 119 $skip udp from any to any 53 out via ${oif} setup $ks ${fwcmd} 121 $skip udp from any to any 123 out via ${oif} setup $ks ${fwcmd} 122 $skip tcp from any to any ${good_tcpo} out via ${oif} setup $ks ${fwcmd} 124 $skip tcp from any to any 49152-65535 out via ${oif} setup $ks ${fwcmd} 125 $skip icmp from any to any out via ${oif} icmptype 0,1,3,4,8,11,12
${fwcmd} 400 deny tcp from any to any established in via ${oif} ${fwcmd} 401 deny tcp from any to any setup via ${oif}
# This is skipto location for outbound stateful rules ${fwcmd} 500 divert natd ip from any to any out via ${oif} ${fwcmd} 510 allow ip from any to any # This is skipto location for outbound stateful rules #${fwcmd} 500 nat 510 ip from ${inet} to any out via ${oif} #${natcmd} 510 config ip ${oip} log
#${fwcmd} 520 allow all from any to any
# Everything else is denied by default # deny and log all packets that fell through to see what they are ${fwcmd} 999 deny log all from any to any |
Вот и всё.