Shorewall - Инструмент конфигурирования шлюза/фаервола

Shorewall - это инструмент конфигурирования шлюза/фаервола для GNU/Linux. Обычно применяется в качестве скриптовой обертки для iptables, выполненная в виде сервиса.

Правила хождения пакетов в Shorewall используют абстракцию зон — все сети, которые вы хотите обрабатывать, надо как-то обозвать. Для начала следует определиться с названиями зон. В моем случае их будет 4: необходимая зона, содержащая сам файрволл, домашняя сетка с DHCP, провайдерская локалка и интернет через PPPoE. Не забудьте скопировать заготовку из вашего пакета! Конфиг получился примерно такой:

# nano /etc/shorewall/zones

# ZONE   TYPE    OPTIONS                 IN                      OUT
#                                       OPTIONS                 OPTIONS 

fw      firewall
bots    ipv4
net     ipv4
mysql   ipv4
mongo   ipv4  

Подробнее: http://www.shorewall.net/manpages/shorewall-zones.html

Когда вы определились с тем, какие у вас будут зоны, нужно сказать, как поделить между зонами сетевые интерфейсы (l2) и IP-сети (l3). В файле interfaces надо перечислить все обрабатываемые интерфейсы. Делается это в формате «В этой зоне будет этот интерфейс целиком», поэтому при делении интерфейса на несколько зон вместо зоны надо указать прочерк. Мой простейший вариант:

# nano /etc/shorewall/interfaces

#ZONE   INTERFACE       BROADCAST       OPTIONS
#

net     eth0            detect          tcpflags,logmartians,nosmurfs

Подробнее: http://www.shorewall.net/manpages/shorewall-interfaces.html

Когда вы разделили окружающий мир на зоны, обязательно надо сказать, кому что можно делать по умолчанию. Называется это дело политиками, лежит в файле policy, необходимо определить политики для всех возможных направлений пробегания трафика. Лучше всего в конец дописать дефолтную политику, а чуть выше — исключения:

# nano /etc/shorewall/policy

# SOURCE         DEST            POLICY          LOG LEVEL       LIMIT:BURST
#

$FW             net             ACCEPT
net             all             DROP            err

# The FOLLOWING POLICY MUST BE LAST
all             all             REJECT          err

Подробнее: http://www.shorewall.net/manpages/shorewall-policy.html

# nano /etc/shorewall/hosts

#ZONE   HOST(S)             OPTIONS
#

mysql   eth0:1.210.189.99                                              # db1.host.ru
mysql   eth0:1.210.143.80                                              # ws2.host.ru

mongo   eth0:1.210.189.99                                              # db1.host.ru
mongo   eth0:1.210.143.80                                              # ws2.host.ru

bots    eth0:1.210.181.30                                              # backup.host.ru
bots    eth0:1.210.189.99                                              # db1.host.ru
bots    eth0:1.210.189.100                                             # ws1.host.ru
bots    eth0:1.210.139.154                                             # sphinx.host.ru
bots    eth0:1.210.143.80                                              # ws2.host.ru

Подробнее: http://www.shorewall.net/manpages/shorewall-hosts.html

# nano /etc/shorewall/rules

#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK
#                                                       PORT    PORT(S)         DEST            LIMIT           GROUP

ACCEPT          net             $FW             icmp
ACCEPT          $FW             net             icmp
ACCEPT          net             $FW             tcp     80
#ACCEPT         net             $FW             tcp     8080
SSH/ACCEPT          net             $FW             tcp     22

# ftp for 1c client
ACCEPT          net             $FW             tcp     40322
ACCEPT          net             $FW             tcp     41000:42000

# all servers from hosts
ACCEPT          bots            $FW
ACCEPT          $FW             bots 

# SMTP
DNAT            $FW             $FW:62.210.189.100              tcp     25      -       46.222.222.222

ACCEPT          net             $FW             tcp     9999

Правила содержат действия, макросы их настройки. Все макросы находятся в папке /usr/share/shorewall и обозначаются как macro.[ACTION]. Пример: /usr/share/shorewall/macro.SSH, /usr/share/shorewall/macro.AMQP, /usr/share/shorewall/macro.SMTP

Разобраться с DNAT на localhost

Подробнее: http://www.shorewall.net/manpages/shorewall-rules.html

Port-forwarding

Если надо пробросить порт на внешнюю сеть, необходимо использовать DNAT, вместо ACCEPT. Для работы этого механизма надо обязательно включить в ядре поддержку перенаправления пакетов.

nano /etc/sysctl.conf.

net.ipv4.ip_forward = 1

И затем перегпузить настройки ядра командой:

linux
$ sudo sysctl -p /etc/sysctl.conf
Bsd
$ sudo sysctl /etc/sysctl.conf reload

Read more: http://plutonit.ru/view_post.php?id=87#ixzz46AKYNB8P

# nano /etc/shorewall/rules

#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK
# 
                                                      PORT    PORT(S)         DEST            LIMIT           GROUP

Firewall

# nano /etc/shorewall/rules

#ACTION         SOURCE          DEST            PROTO   DEST    SOURCE          ORIGINAL        RATE            USER/   MARK
#                                                       PORT    PORT(S)         DEST            LIMIT           GROUP

ACCEPT          net             $FW             icmp
ACCEPT          $FW             net             icmp
ACCEPT          net             $FW             tcp     22

# MySql
ACCEPT            mysql           $FW             tcp     3306

# MongoDB
ACCEPT            mongo           $FW             tcp     27017
 
ACCEPT          bots            $FW
ACCEPT          $FW             bots

При условии что mysql настроен на вешний IP адресс bind-address = 0.0.0.0

Разрешаем подключение по ssh и разрешаем все подключения из /etc/shorewall/hosts

Внести изменения в основной конфиг

# nano /etc/shorewall/shorewall.conf

  • STARTUP_ENABLED=Yes — пусть запускается
  • VERBOSITY=1 — многословность в консоли
  • SHOREWALL_COMPILER=perl — чтобы не перепуталось, если что
  • *_LOG_LEVEL — когда все заработает как надо, поставьте в none, чтобы не засоряло dmesg
  • LOG_MARTIANS — так же
  • IP_FORWARDING=On — для маскарадинга очень нужно. Можно, кончно, и в sysctl.conf это делать, но тут уместнее
  • CLAMPMSS=Yes — лучше включить, если у аплинка MTU меньше, чем у какой-нибудь из машин в домашней сетке.
    No здесь может привести к крайне неприятному багу с неработающей википедией на части компов.
  • ADMINISABSENTMINDED=Yes — не мните себя б-гом, оставьте так

ls /usr/share/shorewall/

action.A_Drop        action.SetEvent     macro.A_DropDNSrep  macro.DropUPnP      macro.IPP           macro.MongoDB     macro.Puppet   macro.SNMP        macro.Webcache
action.allowInvalid  actions.std         macro.A_DropUPnP    macro.Edonkey       macro.IPPbrd        macro.MSNP        macro.Razor    macro.SNMPTrap    macro.Webmin
action.A_Reject      action.TCPFlags     macro.AllowICMPs    macro.Finger        macro.IPPserver     macro.MSSQL       macro.Rdate    macro.SPAMD       macro.Whois
action.AutoBL        action.template     macro.Amanda        macro.FTP           macro.IPsec         macro.Munin       macro.RDP      macro.Squid       macro.Xymon
action.AutoBLL       action.Untracked    macro.AMQP          macro.Git           macro.IPsecah       macro.MySQL       macro.Redis    macro.SSH         modules
action.Broadcast     compiler.pl         macro.Auth          macro.GNUnet        macro.IPsecnat      macro.NNTP        macro.Reject   macro.Submission  modules.essential
action.DNSAmp        configfiles         macro.BGP           macro.Gnutella      macro.IRC           macro.NNTPS       macro.Rfc1918  macro.SVN         modules.extensions
action.Drop          configpath          macro.BitTorrent    macro.Goto-Meeting  macro.Jabberd       macro.NTP         macro.RIPbi    macro.Syslog      modules.ipset
action.dropInvalid   coreversion         macro.BitTorrent32  macro.GRE           macro.JabberPlain   macro.NTPbi       macro.RNDC     macro.Telnet      modules.tc
action.DropSmurfs    functions           macro.BLACKLIST     macro.HKP           macro.JabberSecure  macro.NTPbrd      macro.Rsync    macro.Telnets     modules.xtables
action.Established   getparams           macro.Citrix        macro.HTTP          macro.JAP           macro.OpenVPN     macro.SANE     macro.template    prog.footer
action.IfEvent       helpers             macro.CVS           macro.HTTPS         macro.Jetdirect     macro.OSPF        macro.Sieve    macro.Teredo      Shorewall
action.Invalid       lib.base            macro.DAAP          macro.ICPV2         macro.Kerberos      macro.PCA         macro.SIP      macro.TFTP        shorewallrc
action.New           lib.cli             macro.DCC           macro.ICQ           macro.L2TP          macro.Ping        macro.SixXS    macro.Time        version
action.NotSyn        lib.cli-std         macro.DHCPfwd       macro.ILO           macro.LDAP          macro.POP3        macro.SMB      macro.Trcrt       wait4ifup
action.Reject        lib.common          macro.Distcc        macro.IMAP          macro.LDAPS         macro.POP3S       macro.SMBBI    macro.VNC
action.Related       lib.core            macro.DNS           macro.IMAPS         macro.Mail          macro.PostgreSQL  macro.SMBswat  macro.VNCL
action.ResetEvent    macro.A_AllowICMPs  macro.Drop          macro.IPIP          macro.mDNS          macro.PPtP        macro.SMTP     macro.VRRP
action.RST           macro.ActiveDir     macro.DropDNSrep    macro.IPMI          macro.mDNSbi        macro.Printer     macro.SMTPS    macro.Web