Интернет шлюз ipfw

Поскольку основная часть системы 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

Вот и всё.

unix-way