Přejít k hlavnímu obsahu

Jak jednoduše nakonfigurovat FERM firewall

Návod z roku 2013. Příkazy a verze balíčků se od té doby změnily.

Když na Raspberry Pi provozujete web nebo jiné služby, je dobré vědět, jaká komunikace na něj chodí, a mít nasazený firewall. Kdo nikdy nepsal pravidla pro iptables, ten se s nimi docela natrápí. Právě na to je FERM, nadstavba nad iptables s mnohem jednodušším zápisem pravidel. V návodu nastavíme funkční firewall pro webový server a SSH na Raspbianu.

1. Aktualizace systému

root@raspberrypi:~# apt-get update && apt-get -y upgrade

2. Instalace FERM a conntrack

root@raspberrypi:~# apt-get install ferm conntrack
Enable ferm on bootup: Yes

3. SSH na jiný port

Port 22 patří k nejčastěji napadaným. V ukázce SSH přesuneme na port 63222. Číslo vyberte z neregistrovaného rozsahu 49152-65535.

root@raspberrypi:~# nano /etc/ssh/sshd_config
# What ports, IPs and protocols we listen for
Port 63222    # default 22
...
root@raspberrypi:~# service ssh restart
[ ok ] Restarting OpenBSD Secure Shell server: sshd.

Po restartu SSH nezavírejte aktuální spojení. Nejdřív otevřete nové a vyzkoušejte, že se na nový port připojíte.

4. Konfigurace firewallu

root@raspberrypi:~# nano /etc/ferm/ferm.conf
# -*- shell-script -*-
#
# Example for ssh (63222), http, https and IPv6
#
table filter {
    chain INPUT {
        policy DROP;

        # connection tracking
        mod state state INVALID DROP;
        mod state state (ESTABLISHED RELATED) ACCEPT;

        # allow local packet
        interface lo ACCEPT;

        # respond to ping
        proto icmp ACCEPT;

        # snmp - if you need for monitoring as CACTI, ICINGA, ...
        proto udp dport snmp ACCEPT;

        # allow tcp SSH, FTP, HTTP, HTTPS, ...
        proto tcp dport (63222 http https) ACCEPT;
    }

    # outgoing connections are not limited
    chain OUTPUT {
        policy ACCEPT;
    }

    # only for a router
    chain FORWARD {
        policy DROP;
    }
}

# IPv6 rules
domain ip6 table filter {
    chain INPUT {
        policy DROP;

        # connection tracking
        mod state state INVALID DROP;
        mod state state (ESTABLISHED RELATED) ACCEPT;

        # allow local connections
        interface lo ACCEPT;

        # allow ICMP (for neighbor solicitation, like ARP for IPv4)
        proto ipv6-icmp ACCEPT;

        # allow tcp connections
        proto tcp dport (http https) ACCEPT;
    }

    # outgoing connections are not limited
    chain OUTPUT policy ACCEPT;

    # only for a router
    chain FORWARD policy DROP;
}
root@raspberrypi:~# service ferm restart
[ ok ] Reloading Firewall configuration....

5. Kontrola pravidel v iptables a aktuálních spojení

root@raspberrypi:~# iptables -nvL
Chain INPUT (policy DROP 43 packets, 5669 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 DROP       all  --  *      *       0.0.0.0/0            0.0.0.0/0            state INVALID
   27  1772 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0
    0     0 ACCEPT     udp  --  *      *       0.0.0.0/0            0.0.0.0/0            udp dpt:161
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:63222
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443

Chain FORWARD (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 23 packets, 2164 bytes)
 pkts bytes target     prot opt in     out     source               destination

Aktuální spojení:

root@raspberrypi:~# conntrack -L
tcp      6 299 ESTABLISHED src=192.168.252.119 dst=192.168.252.120 sport=51374 dport=63222 src=192.168.252.120 dst=192.168.252.119 sport=63222 dport=51374 [ASSURED] mark=0 use=1
tcp      6 431957 ESTABLISHED src=192.168.252.120 dst=192.168.252.119 sport=22 dport=50941 src=192.168.252.119 dst=192.168.252.120 sport=50941 dport=22 [ASSURED] mark=0 use=1
conntrack v1.2.1 (conntrack-tools): 2 flow entries have been shown.

6. Hotovo

Tohle je základní funkční firewall pro web na Raspberry Pi s Raspbianem. FERM umí víc: proměnné, složitější strukturu pravidel, názvy portů z /etc/services i přímo čísla portů. Další ukázky konfigurací najdete na internetu.

Zdroje: FERM, Debian Wiki