Firehol je jeden z mnoha skriptů usnadňující vytváření pravidel pro iptables na linuxu. Nutno říci, že je jedním z nejsnadněji použitelným (můj subjektivní názor), což ale neznamená, že by ztrácel na kvalitě. Právě naopak.
Předem upozorňuji, že tento článek si neklade za cíl vysvětlit kompletní možnosti fireholu, ale chce poskytnout dobrý začátek lidem, kteří si chtějí nastavit jednoduchý a bezpečný firewall. Pro kompletní dokumentaci navštivte domácí stránku fireholu.
Instalace
Nejprve je nutné stáhnout rpm ze stránek projektu. Po instalaci balíčku příkazem
rpm -Uhv firehol*.rpm
jej přidáme mezi služby tak, aby se spouštěl automaticky při startu:
chkconfig --add firehol chkconfig firehol on
Nyní přistoupíme k vlastní konfiguraci. V oblíbeném editoru otevřeme soubor /etc/firehol/firehol.conf. Soubor začíná verzí konfigurační souboru:
version 5
Konfigurace rozhraní
Dále si definujeme několik sekcí interface, pro každé síťové rozhraní jednu:
interface eth0 NET
policy drop
protection strong
server ident reject with tcp-reset
server http accept
server icmp accept
server ssh accept src 1.2.3.4
server vnc accept src 1.2.3.4
client all accept
interface
V prvním řádku definujeme síťové rozhraní eth0 a naše pojmenování NET, které bude použito pro generování iptables řetězců (chains) a v logu (který po odladění fireholu doporučuji vypnout).
policy
Udává výchozí politiku zacházení s packety pro které nejsou definována pravidla server. Hodnoty mohou být drop – zahození packetu bez upozornění nebo reject – zahodí packet a pošle ICMP upozornění klientovi, že tu cesta nevede.
protection strong
Zabezpečení proti všem známým technikám útoků.
server
Několik řádků s definicemi pravidel pro služby. Za slovem server následuje jméno služby (buď známé nebo ručně definované) služby a její povolení parametrem accept nebo zakázání parametrem reject nebo drop.
Obvykle si vystačíme s jednoduchou definicí:
server http accept
kterou povolujeme připojení z venčí na náš webový server.
Dále je možné pomocí parametru src definovat IP, ze kterých povolíme, nebo naopak zakážeme připojení. Např:
server ssh accept src 1.2.3.4
povoluje připojení na šifrovaný terminál pouze pro vybranou IP
client
Definici podobnou službám mohou mít i klienti, kteří se snaží připojit z našeho PC ven. V drtivé většině případů si vystačíme s pouhým:
client all accept
Tím by měla být definice rozhraní hotová. Pokud má náš stroj s více síťovými rozhraními sloužit také jako router, je nutné definovat sekce router
Nastavení sekcí router
Pro každou routovací cestu (tj pro každou kombinaci síťových rozhraní, přes které mohou putovat data k dalším počítačů v sítích) je nutné vytvořit sekci router:
router LAN2NET inface eth1 outface eth0
route all accept src 192.168.5.3
route all accept src 192.168.5.4
route all accept src 192.168.5.10
route all drop
Za definicí router následuje pojmenování a definice síťových rozhraní pro vstup a výstup packetů. Opět si ve většině případů vystačíme s
route all accept
ale zde je vhodné vyjmenovat jednotlivé IP, které mají mít přístup (v tomto případě) na Internet. Opět můžeme definovat jednotlivé služby, které dané stroje mohou na Internetu využívat. V předchozím výpisu sekce router je směr ven, který obvykle neomezujeme. Naopak je potřeba si dávat pozor na směr dovnitř:
router NET2LAN inface eth0 outface eth1
route torent accept dst 192.168.5.3
route all drop
kde je velice vhodné vyjmenovat jednotlivé služby, které mohou jít dovnitř. Zde je ukázka nastavení sekce router pro přesměrování portu pro použití bittorrent klienta na jednom PC uvnitř sítě.
Přesměrování portů a NAT
Po routeru často také požadujeme překlad sítových adres (NAT) a s tím související přesměrování portů na PC v síti za routerem.
NAT celé sítě můžeme definovat v sekci interface nebo router (pak se uvažuje outface rozhraní) příkazem masquerade, ale osobně doporučuji provádět NAT pro jednotivé PC zvlášť pomocí příkazu snat:
snat to 1.2.3.4 src 192.168.5.3 snat to 1.2.3.4 src 192.168.5.4 snat to 1.2.3.4 src 192.168.5.10
kde IP 1.2.3.4 je venkovní IP adresa routeru.
Přesměrování portů pak zařídí příkaz nat to-destination:
nat to-destination 192.168.5.3 proto tcp dport 6881 dst 1.2.3.4
Známé služby
Abecední seznam fireholu známých služeb:
AH, all, amanda, any, anystateless, apcupsd, apcupsdnis, aptproxy, asterisk, cups, custom, cvspserver, darkstat, daytime, dcc, dcpp, dhcp, dhcprelay, dict, distcc, dns, echo, emule, eserver, ESP, finger, ftp, gift, giftui, gkrellmd, GRE, h323, heartbeat, http, https, hylafax, iax, iax2, icmp, ICMP, icp, ident, imap, imaps, irc, isakmp,
jabber, jabberd, ldap, ldaps, lpd, microsoft_ds, mms, ms_ds, msn, multicast, mysql, netbackup, netbios_dgm, netbios_ns, netbios_ssn, nfs, nis, nntp, nntps, ntp, nut, nxserver, oracle, OSPF, p2p, ping, pop3, pop3s, ortmap, postgres, pptp, privoxy, radius, radiusold, radiusoldproxy, radiusproxy, rdp, rndc, rsync, rtp, samba, sip, smtp, smtps, snmp, snmptrap, socks, squid, ssh, stun, submission, sunrpc, swat, syslog, telnet, tftp, time, timestamp, upnp, uucp, vmware, vmwareauth, vmwareweb, vnc, webcache, webmin, whois, xdmcp
Definice vlastních služeb
Na začátku konfiguračního souboru je možné definovat další služby pomocí proměnných server_servicename_ports a client_servicename_ports jak ukazuje následující příklad:
server_svn_ports="tcp/3690" client_svn_ports="default" server_torrent_ports="tcp/6881 udp/6881" client_torrent_ports="default"
Parametr default u klientských portů znamená rozsah 1024-65535, tedy běžný rozsah využitelný aplikacemi bez nutnosti běžet s právy roota, které bychom potřebovali pro použití portů nižších než 1024.
Omezení logování
V původním nastavení firehol zapisuje do logu mnoho informací, které běžně nepotřebujeme. Umravníme jej nastavením proměnné
FIREHOL_LOG_LEVEL="7"
v konfiguračním souboru.
Ukázka konfiguračního souboru
Ukázka malého konfiguračního souboru pro router s web serverem, několika vlastními službami, natem a přesměrováním portů pro bittorrent:
version 5
FIREHOL_LOG_LEVEL="7"
server_svn_ports="tcp/3690"
client_svn_ports="default"
server_torrent_ports="tcp/6881 udp/6881"
client_torrent_ports="default"
server_vnc_ports="tcp/5902 udp/5902"
client_vnc_ports="default"
snat to 1.2.3.4 src 192.168.5.3
snat to 1.2.3.4 src 192.168.5.4
snat to 1.2.3.4 src 192.168.5.10
nat to-destination 192.168.5.3 proto tcp dport 6881 dst 1.2.3.4
nat to-destination 192.168.5.3 proto udp dport 6881 dst 1.2.3.4
interface eth0 NET
policy drop
protection strong
server ident reject with tcp-reset
server http accept
server icmp accept
server ssh accept src 4.5.6.7
server vnc accept src 5.6.7.8
server svn accept
client all accept
interface eth1 LAN
policy reject
server all accept
client all accept
router LAN2NET inface eth1 outface eth0
route all accept src 192.168.5.3
route all accept src 192.168.5.4
route all accept src 192.168.5.10
route all drop
router NET2LAN inface eth0 outface eth1
route torrent accept dst 192.168.5.3
route all drop