introduktion
Firewalld är en brandväggshanteringslösning tillgänglig för många Linux-distributioner som fungerar som en frontend för iptables paketfiltreringssystem som tillhandahålls av Linux-kärnan. I den här guiden kommer vi att täcka hur du ställer in en brandvägg för din server och visa dig grunderna för att hantera brandväggen med administrationsverktyget firewall-cmd
(om du hellre vill använda iptables
med CentOS, följ den här guiden).
notera: Det finns en chans att du kanske arbetar med en nyare version av firewalld än vad som var tillgängligt vid skrivandet, eller att din server var inställd något annorlunda än exempelservern som används i den här guiden. Således kan beteendet hos några av de kommandon som förklaras i den här guiden variera beroende på din specifika konfiguration.
grundläggande begrepp i Firewalld
innan vi börjar prata om hur man faktiskt använder verktyget firewall-cmd
för att hantera din brandväggskonfiguration, bör vi bekanta oss med några grundläggande begrepp som verktyget introducerar.
zoner
firewalld
– demonen hanterar grupper av regler med hjälp av enheter som kallas ”zoner”. Zoner är i grunden uppsättningar regler som dikterar vilken trafik som ska tillåtas beroende på vilken nivå av förtroende du har i de nätverk din dator är ansluten till. Nätverksgränssnitt tilldelas en zon för att diktera beteendet som brandväggen ska tillåta.
för datorer som kan flytta mellan nätverk ofta (som bärbara datorer), ger denna typ av flexibilitet en bra metod för att ändra dina regler beroende på din miljö. Du kan ha strikta regler som förbjuder mest trafik när du arbetar på ett offentligt WiFi-nätverk, samtidigt som du tillåter mer avslappnade begränsningar när du är ansluten till ditt hemnätverk. För en server är dessa zoner inte lika omedelbart viktiga eftersom nätverksmiljön sällan, om någonsin, ändras.
oavsett hur dynamisk din nätverksmiljö kan vara, är det fortfarande användbart att känna till den allmänna tanken bakom var och en av de fördefinierade zonerna för firewalld
. I ordning från minst betrodda till mest betrodda är de fördefinierade zonerna inom firewalld
:
- släpp: Den lägsta nivån av förtroende. Alla inkommande anslutningar tappas utan svar och endast utgående anslutningar är möjliga.
- block: liknar ovanstående, men istället för att helt enkelt släppa anslutningar avvisas inkommande förfrågningar med ett meddelande
icmp-host-prohibited
ellericmp6-adm-prohibited
. - public: representerar offentliga, otillförlitliga nätverk. Du litar inte på andra datorer men kan tillåta valda inkommande anslutningar från fall till fall.
- extern: externa nätverk om du använder brandväggen som din gateway. Den är konfigurerad för Nat-Maskering så att ditt interna nätverk förblir privat men kan nås.
- intern: den andra sidan av den externa zonen, som används för den inre delen av en gateway. Datorerna är ganska pålitliga och vissa ytterligare tjänster finns tillgängliga.
- dmz: används för datorer som finns i en DMZ (isolerade datorer som inte har tillgång till resten av ditt nätverk). Endast vissa inkommande anslutningar är tillåtna.
- arbete: används för arbetsmaskiner. Lita på de flesta datorerna i nätverket. Några fler tjänster kan tillåtas.
- hem: en hemmiljö. Det innebär i allmänhet att du litar på de flesta andra datorer och att några fler tjänster kommer att accepteras.
- trusted: lita på alla maskiner i nätverket. Den mest Öppna av de tillgängliga alternativen och bör användas sparsamt.
för att använda brandväggen kan vi skapa regler och ändra egenskaperna för våra zoner och sedan tilldela våra nätverksgränssnitt till de zoner som är mest lämpliga.
Regelpermanens
i firewalld kan Regler betecknas som antingen permanenta eller omedelbara. Om en regel läggs till eller ändras, ändras som standard beteendet hos den nuvarande brandväggen. Vid nästa start kommer de gamla reglerna att återställas.
de flesta firewall-cmd
operationer kan ta flaggan --permanent
för att indikera att den icke-efemära brandväggen ska riktas in. Detta kommer att påverka regeluppsättningen som laddas om vid start. Denna separation innebär att du kan testa regler i din active firewall-instans och sedan ladda om det finns problem. Du kan också använda flaggan --permanent
för att bygga ut en hel uppsättning regler över tid som alla kommer att tillämpas på en gång när reload-kommandot utfärdas.
installera och aktivera din brandvägg för att starta vid start
firewalld
installeras som standard på vissa Linux-distributioner, inklusive många bilder av CentOS 7. Det kan dock vara nödvändigt för dig att installera firewalld själv:
- sudo yum install firewalld
när du har installerat firewalld
kan du aktivera tjänsten och starta om servern. Tänk på att om du aktiverar firewalld kommer tjänsten att starta vid start. Det är bästa praxis att skapa dina brandväggsregler och ta chansen att testa dem innan du konfigurerar detta beteende för att undvika potentiella problem.
- sudo systemctl enable firewalld
- sudo reboot
när servern startas om ska din brandvägg tas upp, dina nätverksgränssnitt ska sättas in i de zoner du konfigurerade (eller falla tillbaka till den konfigurerade standardzonen) och alla regler som är associerade med zonen(erna) kommer att tillämpas på de associerade gränssnitten.
vi kan verifiera att tjänsten körs och nås genom att skriva:
- sudo firewall-cmd --state
outputrunning
detta indikerar att vår brandvägg är igång med standardkonfigurationen.
bekanta dig med de nuvarande brandväggsreglerna
innan vi börjar göra ändringar bör vi bekanta oss med standardmiljön och reglerna som tillhandahålls av demonen.
utforska standardinställningarna
vi kan se vilken zon som för närvarande är vald som standard genom att skriva:
- firewall-cmd --get-default-zone
outputpublic
eftersom vi inte har gett firewalld
några kommandon för att avvika från standardzonen, och inget av våra gränssnitt är konfigurerade för att binda till en annan zon, kommer den zonen också att vara den enda ”aktiva” zonen (zonen som styr trafiken för våra gränssnitt). Vi kan verifiera det genom att skriva:
- firewall-cmd --get-active-zones
outputpublic interfaces: eth0 eth1
här kan vi se att vår exempelserver har två nätverksgränssnitt som styrs av brandväggen (eth0
och eth1
). De hanteras båda för närvarande enligt de regler som definieras för den offentliga zonen.
Hur vet vi vilka regler som är associerade med den offentliga zonen? Vi kan skriva ut standardzonens konfiguration genom att skriva:
- sudo firewall-cmd --list-all
outputpublic (default, active) target: default icmp-block-inversion: no interfaces: eth0 eth1 sources: services: ssh dhcpv6-client ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
vi kan berätta från utgången att den här zonen är både standard och aktiv och att gränssnitten eth0
och eth1
är associerade med denna zon (vi visste redan allt detta från våra tidigare förfrågningar). Vi kan dock också se att den här zonen möjliggör normala operationer associerade med en DHCP-klient (för IP-adresstilldelning) och SSH (för fjärradministration).
utforska alternativa zoner
nu har vi en bra uppfattning om konfigurationen för standard och aktiv zon. Vi kan också ta reda på information om andra zoner.
för att få en lista över tillgängliga zoner, skriv:
- firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work
vi kan se den specifika konfigurationen som är associerad med en zon genom att inkludera parametern --zone=
i vårt --list-all
– kommando:
- sudo firewall-cmd --zone=home --list-all
outputhome interfaces: sources: services: dhcpv6-client ipp-client mdns samba-client ssh ports: masquerade: no forward-ports: icmp-blocks: rich rules:
du kan mata ut alla zondefinitioner med alternativet --list-all-zones
. Du kommer förmodligen vill Pipa utgången till en personsökare för enklare visning:
- sudo firewall-cmd --list-all-zones | less
välja zoner för dina gränssnitt
om du inte har konfigurerat dina nätverksgränssnitt annars kommer varje gränssnitt att placeras i standardzonen när brandväggen startas.
ändra zon för ett gränssnitt
du kan överföra ett gränssnitt mellan zoner under en session med parametern --zone=
i kombination med parametern --change-interface=
. Som med alla kommandon som ändrar brandväggen måste du använda sudo
.
till exempel kan vi övergå vårt eth0
– gränssnitt till” hem ” – zonen genom att skriva detta:
- sudo firewall-cmd --zone=home --change-interface=eth0
outputsuccess
när du övergår ett gränssnitt till en ny zon, var medveten om att du förmodligen ändrar de tjänster som kommer att fungera. Till exempel flyttar vi till ”hem” – zonen, som har SSH tillgängligt. Det betyder att vår anslutning inte ska sjunka. Vissa andra zoner har inte SSH aktiverat som standard och om din anslutning tappas när du använder en av dessa zoner kan du inte logga in igen.
vi kan verifiera att detta lyckades genom att be om de aktiva zonerna igen:
- firewall-cmd --get-active-zones
outputhome interfaces: eth0public interfaces: eth1
justera standardzonen
om alla dina gränssnitt bäst kan hanteras av en enda zon är det förmodligen lättare att bara välja den bästa standardzonen och sedan använda den för din konfiguration.
du kan ändra standardzonen med parametern --set-default-zone=
. Detta kommer omedelbart att ändra alla gränssnitt som hade fallit tillbaka på standard till den nya zonen:
- sudo firewall-cmd --set-default-zone=home
outputsuccess
ange regler för dina applikationer
det grundläggande sättet att definiera brandväggsundantag för de tjänster du vill göra tillgängliga är enkelt. Vi går igenom grundtanken här.
lägga till en tjänst i dina zoner
den enklaste metoden är att lägga till de tjänster eller portar du behöver i de zoner du använder. Återigen kan du få en lista över tillgängliga tjänster med alternativet --get-services
:
- firewall-cmd --get-services
outputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
du kan få mer information om var och en av dessa tjänster genom att titta på deras associerade .xml
– fil i katalogen /usr/lib/firewalld/services
. Till exempel definieras SSH-tjänsten så här:
<?xml version="1.0" encoding="utf-8"?><service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/></service>
du kan aktivera en tjänst för en zon med parametern --add-service=
. Åtgärden riktar sig till standardzonen eller vilken zon som helst som anges av parametern --zone=
. Som standard justerar detta bara den aktuella brandväggsessionen. Du kan justera den permanenta brandväggskonfigurationen genom att inkludera flaggan --permanent
.
om vi till exempel kör en webbserver som serverar konventionell HTTP-trafik kan vi tillåta denna trafik för gränssnitt i vår” offentliga ” zon för den här sessionen genom att skriva:
- sudo firewall-cmd --zone=public --add-service=http
du kan utelämna --zone=
om du vill ändra standardzonen. Vi kan verifiera att operationen lyckades genom att använda operationerna --list-all
eller --list-services
:
- sudo firewall-cmd --zone=public --list-services
outputdhcpv6-client http ssh
när du har testat att allt fungerar som det ska kommer du förmodligen att ändra de permanenta brandväggsreglerna så att din tjänst fortfarande kommer att vara tillgänglig efter en omstart. Vi kan göra vår” offentliga ” zonändring permanent genom att skriva:
- sudo firewall-cmd --zone=public --permanent --add-service=http
outputsuccess
du kan verifiera att detta lyckades genom att lägga till flaggan --permanent
i åtgärden --list-services
. Du måste använda sudo
för alla --permanent
– operationer:
- sudo firewall-cmd --zone=public --permanent --list-services
outputdhcpv6-client http ssh
din” offentliga ” zon tillåter nu HTTP – webbtrafik på port 80. Om din webbserver är konfigurerad att använda SSL/ TLS, vill du också lägga till tjänsten https
. Vi kan lägga till det i den aktuella sessionen och den permanenta regeln-genom att skriva:
- sudo firewall-cmd --zone=public --add-service=https
- sudo firewall-cmd --zone=public --permanent --add-service=https
vad händer om ingen lämplig tjänst är tillgänglig?
brandväggstjänsterna som ingår i firewalld-installationen representerar många av de vanligaste kraven för program som du kanske vill tillåta åtkomst till. Det kommer dock sannolikt att finnas scenarier där dessa tjänster inte passar dina krav.
i den här situationen har du två alternativ.
öppna en Port för dina zoner
det enklaste sättet att lägga till stöd för din specifika applikation är att öppna portarna som den använder i lämpliga zoner. Det här är lika enkelt som att ange port-eller portintervallet och det tillhörande protokollet för de portar du behöver öppna.
till exempel, om vår applikation körs på port 5000 och använder TCP, kan vi lägga till detta i den ”offentliga” zonen för den här sessionen med parametern --add-port=
. Protokoll kan vara antingen tcp
eller udp
:
- sudo firewall-cmd --zone=public --add-port=5000/tcp
outputsuccess
vi kan verifiera att detta lyckades med --list-ports
– operationen:
- sudo firewall-cmd --zone=public --list-ports
output5000/tcp
det är också möjligt att ange ett sekventiellt intervall av portar genom att separera början och slutporten i intervallet med ett streck. Till exempel, om vår applikation använder UDP-portar 4990 till 4999, kan vi öppna dessa på ”public” genom att skriva:
- sudo firewall-cmd --zone=public --add-port=4990-4999/udp
efter testning skulle vi sannolikt vilja lägga till dessa i den permanenta brandväggen. Du kan göra det genom att skriva:
- sudo firewall-cmd --zone=public --permanent --add-port=5000/tcp
- sudo firewall-cmd --zone=public --permanent --add-port=4990-4999/udp
- sudo firewall-cmd --zone=public --permanent --list-ports
outputsuccesssuccess5000/tcp 4990-4999/udp
att definiera en tjänst
att öppna portar för dina zoner är enkelt, men det kan vara svårt att hålla reda på vad var och en är till för. Om du någonsin avvecklar en tjänst på din server kan du ha svårt att komma ihåg vilka portar som har öppnats fortfarande krävs. För att undvika denna situation är det möjligt att definiera en tjänst.
tjänster är helt enkelt samlingar av portar med tillhörande namn och beskrivning. Att använda tjänster är lättare att administrera än portar, men kräver lite arbete på förhand. Det enklaste sättet att börja är att kopiera ett befintligt skript (finns i /usr/lib/firewalld/services
) till katalogen /etc/firewalld/services
där brandväggen letar efter icke-standardiserade definitioner.
till exempel kan vi kopiera SSH-tjänstedefinitionen för att använda för vår ”exempel” – tjänstedefinition så här. Filnamnet minus suffixet .xml
kommer att diktera namnet på tjänsten i listan över brandväggstjänster:
- sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/example.xml
nu kan du justera definitionen som finns i filen du kopierade:
sudo vi /etc/firewalld/services/example.xml
för att starta innehåller filen SSH-definitionen som du kopierade:
<?xml version="1.0" encoding="utf-8"?><service> <short>SSH</short> <description>Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.</description> <port protocol="tcp" port="22"/></service>
majoriteten av denna definition är faktiskt metadata. Du vill ändra kortnamnet för tjänsten inom taggarna <short>
. Detta är ett mänskligt läsbart namn för din tjänst. Du bör också lägga till en beskrivning så att du har mer information om du någonsin behöver granska tjänsten. Den enda konfiguration du behöver göra som faktiskt påverkar tjänstens funktionalitet kommer sannolikt att vara portdefinitionen där du identifierar portnummer och protokoll du vill öppna. Detta kan anges flera gånger.
för vår” exempel ” – tjänst, föreställ dig att vi måste öppna port 7777 för TCP och 8888 för UDP. Genom att gå in i INSERT-läge genom att trycka på i
kan vi ändra den befintliga definitionen med något så här:
<?xml version="1.0" encoding="utf-8"?><service> <short>Example Service</short> <description>This is just an example service. It probably shouldn't be used on a real system.</description> <port protocol="tcp" port="7777"/> <port protocol="udp" port="8888"/></service>
tryck på ESC
och ange sedan :x
för att spara och stänga filen.
ladda om din brandvägg för att få tillgång till din nya tjänst:
- sudo firewall-cmd --reload
du kan se att det nu är bland listan över tillgängliga tjänster:
- firewall-cmd --get-services
outputRH-Satellite-6 amanda-client amanda-k5-client bacula bacula-client bitcoin bitcoin-rpc bitcoin-testnet bitcoin-testnet-rpc ceph ceph-mon cfengine condor-collector ctdb dhcp dhcpv6 dhcpv6-client dns docker-registry dropbox-lansync elasticsearch example freeipa-ldap freeipa-ldaps freeipa-replication freeipa-trust ftp ganglia-client ganglia-master high-availability http https imap imaps ipp ipp-client ipsec iscsi-target kadmin kerberos kibana klogin kpasswd kshell ldap ldaps libvirt libvirt-tls managesieve mdns mosh mountd ms-wbt mssql mysql nfs nrpe ntp openvpn ovirt-imageio ovirt-storageconsole ovirt-vmconsole pmcd pmproxy pmwebapi pmwebapis pop3 pop3s postgresql privoxy proxy-dhcp ptp pulseaudio puppetmaster quassel radius rpc-bind rsh rsyncd samba samba-client sane sip sips smtp smtp-submission smtps snmp snmptrap spideroak-lansync squid ssh synergy syslog syslog-tls telnet tftp tftp-client tinc tor-socks transmission-client vdsm vnc-server wbem-https xmpp-bosh xmpp-client xmpp-local xmpp-server
du kan nu använda den här tjänsten i dina zoner som vanligt.
skapa dina egna zoner
medan de fördefinierade zonerna förmodligen kommer att vara mer än tillräckligt för de flesta användare, kan det vara till hjälp att definiera dina egna zoner som är mer beskrivande för deras funktion.
du kanske till exempel vill skapa en zon för din webbserver, kallad ”publicweb”. Du kanske dock vill ha en annan zon konfigurerad för DNS-tjänsten du tillhandahåller i ditt privata nätverk. Du kanske vill ha en zon som heter ”privateDNS” för det.
när du lägger till en zon måste du lägga till den i den permanenta brandväggskonfigurationen. Du kan sedan ladda om för att få konfigurationen till din löpande session. Till exempel, vi kunde skapa de två zonerna vi diskuterade ovan genom att skriva:
- sudo firewall-cmd --permanent --new-zone=publicweb
- sudo firewall-cmd --permanent --new-zone=privateDNS
du kan verifiera att dessa finns i din permanenta konfiguration genom att skriva:
- sudo firewall-cmd --permanent --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work
som tidigare nämnts kommer dessa inte att vara tillgängliga i den aktuella instansen av brandväggen än:
- firewall-cmd --get-zones
outputblock dmz drop external home internal public trusted work
ladda om brandväggen för att få dessa nya zoner i den aktiva konfigurationen:
- sudo firewall-cmd --reload
- firewall-cmd --get-zones
outputblock dmz drop external home internal privateDNS public publicweb trusted work
nu kan du börja tilldela lämpliga tjänster och portar till dina zoner. Det är vanligtvis bra att justera den aktiva instansen och sedan överföra dessa ändringar till den permanenta konfigurationen efter testning. Till exempel, för zonen” publicweb”, kanske du vill lägga till SSH -, HTTP-och HTTPS-tjänsterna:
- sudo firewall-cmd --zone=publicweb --add-service=ssh
- sudo firewall-cmd --zone=publicweb --add-service=http
- sudo firewall-cmd --zone=publicweb --add-service=https
- sudo firewall-cmd --zone=publicweb --list-all
outputpublicweb target: default icmp-block-inversion: no interfaces: sources: services: ssh http https ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
på samma sätt kan vi lägga till DNS-tjänsten i vår” privateDNS ” – zon:
- sudo firewall-cmd --zone=privateDNS --add-service=dns
- sudo firewall-cmd --zone=privateDNS --list-all
outputprivateDNS interfaces: sources: services: dns ports: masquerade: no forward-ports: icmp-blocks: rich rules:
vi kan sedan ändra våra gränssnitt över till dessa nya zoner för att testa dem:
- sudo firewall-cmd --zone=publicweb --change-interface=eth0
- sudo firewall-cmd --zone=privateDNS --change-interface=eth1
vid denna tidpunkt har du möjlighet att testa din konfiguration. Om dessa värden fungerar för dig Vill du lägga till samma regler i den permanenta konfigurationen. Du kan göra det genom att åter tillämpa reglerna med --permanent
flagga:
- sudo firewall-cmd --zone=publicweb --permanent --add-service=ssh
- sudo firewall-cmd --zone=publicweb --permanent --add-service=http
- sudo firewall-cmd --zone=publicweb --permanent --add-service=https
- sudo firewall-cmd --zone=privateDNS --permanent --add-service=dns
när du har tillämpat dessa regler permanent kan du starta om ditt nätverk och ladda om din brandväggservice:
- sudo systemctl restart network
- sudo systemctl reload firewalld
bekräfta att rätt zoner har tilldelats:
- firewall-cmd --get-active-zones
outputprivateDNS interfaces: eth1publicweb interfaces: eth0
och bekräfta att lämpliga tjänster är tillgängliga för båda zonerna:
- sudo firewall-cmd --zone=publicweb --list-services
outputhttp https ssh
- sudo firewall-cmd --zone=privateDNS --list-services
outputdns
du har lyckats skapa dina egna zoner! Om du vill göra en av dessa zoner till standard för andra gränssnitt, kom ihåg att konfigurera det beteendet med parametern --set-default-zone=
:
sudo firewall-cmd --set-default-zone=publicweb
slutsats
du bör nu ha en ganska god förståelse för hur du administrerar firewalld-tjänsten på ditt CentOS-system för daglig användning.
firewalld-tjänsten låter dig konfigurera underhållbara regler och regeluppsättningar som tar hänsyn till din nätverksmiljö. Det låter dig sömlöst övergå mellan olika brandväggspolicyer genom användning av zoner och ger administratörer möjlighet att abstrahera porthanteringen till mer vänliga servicedefinitioner. Att förvärva en fungerande kunskap om detta system gör att du kan dra nytta av den flexibilitet och kraft som detta verktyg ger.