Introduksjon til iptables
iptables er et
kommandolinjeprogram for brukerområdet som brukes til å konfigurere
Linux 2.4 og nyere regelsett for kjernepakkefiltrering.
Denne pakken er kjent for å bygge og fungere riktig ved å bruke en
LFS 12.1 plattform.
Pakkeinformasjon
iptables Avhengigheter
Valgfri
libpcap-1.10.4 (kreves for BPFkompilator eller
nfsynproxy støtte), bpf-utils (kreves for
støtte for Berkeley Packet Filter), libnfnetlink
(kreves for connlabel støtte), libnetfilter_conntrack
(kreves for connlabel støtte), og nftables
Kjernekonfigurasjon
En brannmur i Linux oppnås gjennom netfilter grensesnittet. For å
bruke iptables til å konfigurere
netfilter Følgende kjernekonfigurasjonsparametere kreves:
[*] Networking support ---> [NET]
Networking options --->
[*] Network packet filtering framework (Netfilter) ---> [NETFILTER]
[*] Advanced netfilter configuration [NETFILTER_ADVANCED]
Core Netfilter Configuration --->
<*/M> Netfilter connection tracking support [NF_CONNTRACK]
<*/M> Netfilter Xtables support (required for ip_tables)
... [NETFILTER_XTABLES]
<*/M> LOG target support [NETFILTER_XT_TARGET_LOG]
IP: Netfilter Configuration --->
<*/M> IP tables support (required for filtering/masq/NAT)
... [IP_NF_IPTABLES]
Inkluder eventuelle tilkoblingssporingsprotokoller som vil bli
brukt, så vel som eventuelle protokoller du ønsker å bruke for
matchende støtte under "Core Netfilter Configuration" delen.
Alternativene ovenfor er nok for kjøre Opprette
en Personlig Brannmur med iptables under.
Installasjon av iptables
Note
Installasjonen nedenfor inkluderer ikke å bygge noen
spesialiserte utvidelsesbiblioteker som krever de rå
deklarasjonene i Linux
kildekoden. Hvis du ønsker å bygge ekstra utvidelser (hvis du
ikke er sikker, så trenger du sannsynligvis ikke det), du kan se
på INSTALL
filen for å se et
eksempel på hvordan å endre KERNEL_DIR=
parameteren til å peke
på Linux kildekoden. Merk at
hvis du oppgradere kjerneversjonen, kan det hende at du også må
kompilere iptables på nytt og at
BLFS teamet ikke har testet ved hjelp av rå kjernedeklarasjoner.
Installer iptables ved å kjøre
følgende kommandoer:
./configure --prefix=/usr \
--disable-nftables \
--enable-libipq &&
make
Denne pakken kommer ikke med en testpakke.
Nå, som root
bruker:
make install
Parameterforklaringer
--disable-nftables
: Denne
bryteren deaktiverer bygging av nftables kompatibilitet.
--enable-libipq
: Denne
bryteren gjør det mulig å bygge libipq.so
som kan brukes av noen pakker utenfor
BLFS.
--enable-nfsynproxy
: Denne bryteren
muliggjør installasjon av nfsynproxy SYNPROXY konfigurasjonsverktøy.
Konfigurere iptables
Note
I følgende eksempelkonfigurasjoner, LAN1 brukes for det interne LAN
grensesnittet, og WAN1 brukes til det ytre
grensesnittet koblet til Internett. Du må erstatte disse verdiene
med passende grensesnittnavn for systemet ditt.
Personlig Brannmur
En Personlig Brannmur er designet for å gi deg tilgang til alle
tjenester som tilbys på Internett mens du holder datamaskinen
sikker og dataene dine private.
Nedenfor er en litt modifisert versjon av Rusty Russells
anbefaling fra
Linux 2.4 Packet Filtering HOWTO. Det gjelder fortsatt for
Linux 6.x kjernene.
install -v -dm755 /etc/systemd/scripts
cat > /etc/systemd/scripts/iptables << "EOF"
#!/bin/sh
# Begin /etc/systemd/scripts/iptables
# Insert connection-tracking modules
# (not needed if built into the kernel)
modprobe nf_conntrack
modprobe xt_LOG
# Enable broadcast echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Disable Source Routed Packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/default/accept_source_route
# Enable TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Disable ICMP Redirect Acceptance
echo 0 > /proc/sys/net/ipv4/conf/default/accept_redirects
# Do not send Redirect Messages
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# Drop Spoofed Packets coming in on an interface, where responses
# would result in the reply going out a different interface.
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
# Log packets with impossible addresses.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/conf/default/log_martians
# be verbose on dynamic ip-addresses (not needed in case of static IP)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr
# disable Explicit Congestion Notification
# too many routers are still ignorant
echo 0 > /proc/sys/net/ipv4/tcp_ecn
# Set a known state
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# These lines are here in case rules are already in place and the
# script is ever rerun on the fly. We want to remove all rules and
# pre-existing user defined chains before we implement new rules.
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
# Allow local-only connections
iptables -A INPUT -i lo -j ACCEPT
# Free output on any interface to any ip for any service
# (equal to -P ACCEPT)
iptables -A OUTPUT -j ACCEPT
# Permit answers on already established connections
# and permit new connections related to established ones
# (e.g. port mode ftp)
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
# Log everything else.
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "
# End /etc/systemd/scripts/iptables
EOF
chmod 700 /etc/systemd/scripts/iptables
Dette skriptet er ganske enkelt, det dropper all trafikk som
kommer inn til datamaskinen din som ikke ble startet fra
datamaskinen din, men så lenge du bare surfer på Internett er det
usannsynlig at du overskride sine grenser.
Hvis du ofte møter visse forsinkelser ved tilgang til FTP
servere, ta en titt på BusyBox with iptables example number
4.
Selv om du har nisser eller tjenester som kjører på systemet
ditt, vil disse være utilgjengelige overalt bortsett fra
datamaskinen selv. Hvis du vil tillate tilgang til tjenester på
maskinen din, som f.eks ssh eller ping, se på Opprette
BusyBox med iptables.
Maskering
av Ruter
En nettverksbrannmur har to grensesnitt, ett koblet til et
intranett, i dette eksemplet LAN1, og en koblet til
Internett, her WAN1.
For å gi maksimal sikkerhet for selve brannmuren, sørg for at det
ikke er unødvendige servere som kjører på den, f.eks X11. Som et generelt prinsipp skal selve
brannmuren ikke ha tilgang til enhver upålitelig tjeneste (tenk
på en ekstern server som gir et svar som får en nisse på systemet
til å krasjer, eller enda verre, som implementerer en orm via et
buffer-overflow.
install -v -dm755 /etc/systemd/scripts
cat > /etc/systemd/scripts/iptables << "EOF"
#!/bin/sh
# Begin /etc/systemd/scripts/iptables
echo
echo "You're using the example configuration for a setup of a firewall"
echo "from Beyond Linux From Scratch."
echo "This example is far from being complete, it is only meant"
echo "to be a reference."
echo "Firewall security is a complex issue, that exceeds the scope"
echo "of the configuration rules below."
echo "You can find additional information"
echo "about firewalls in Chapter 4 of the BLFS book."
echo "https://www.linuxfromscratch.org/blfs"
echo
# Insert iptables modules (not needed if built into the kernel).
modprobe nf_conntrack
modprobe nf_conntrack_ftp
modprobe xt_conntrack
modprobe xt_LOG
modprobe xt_state
# Enable broadcast echo Protection
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# Disable Source Routed Packets
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
# Enable TCP SYN Cookie Protection
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Disable ICMP Redirect Acceptance
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
# Don't send Redirect Messages
echo 0 > /proc/sys/net/ipv4/conf/default/send_redirects
# Drop Spoofed Packets coming in on an interface where responses
# would result in the reply going out a different interface.
echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter
# Log packets with impossible addresses.
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
# Be verbose on dynamic ip-addresses (not needed in case of static IP)
echo 2 > /proc/sys/net/ipv4/ip_dynaddr
# Disable Explicit Congestion Notification
# Too many routers are still ignorant
echo 0 > /proc/sys/net/ipv4/tcp_ecn
# Set a known state
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
# These lines are here in case rules are already in place and the
# script is ever rerun on the fly. We want to remove all rules and
# pre-existing user defined chains before we implement new rules.
iptables -F
iptables -X
iptables -Z
iptables -t nat -F
# Allow local connections
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
# Allow forwarding if the initiated on the intranet
iptables -A FORWARD -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD ! -i WAN1 -m conntrack --ctstate NEW -j ACCEPT
# Do masquerading
# (not needed if intranet is not using private ip-addresses)
iptables -t nat -A POSTROUTING -o WAN1 -j MASQUERADE
# Log everything for debugging
# (last of all rules, but before policy rules)
iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT "
iptables -A FORWARD -j LOG --log-prefix "FIREWALL:FORWARD "
iptables -A OUTPUT -j LOG --log-prefix "FIREWALL:OUTPUT "
# Enable IP Forwarding
echo 1 > /proc/sys/net/ipv4/ip_forward
# The following sections allow inbound packets for specific examples
# Uncomment the example lines and adjust as necessary
# Allow ping on the external interface
#iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT
#iptables -A OUTPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
# Reject ident packets with TCP reset to avoid delays with FTP or IRC
#iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
# Allow HTTP and HTTPS to 192.168.0.2
#iptables -A PREROUTING -t nat -i WAN1 -p tcp --dport 80 -j DNAT --to 192.168.0.2
#iptables -A PREROUTING -t nat -i WAN1 -p tcp --dport 443 -j DNAT --to 192.168.0.2
#iptables -A FORWARD -p tcp -d 192.168.0.2 --dport 80 -j ACCEPT
#iptables -A FORWARD -p tcp -d 192.168.0.2 --dport 443 -j ACCEPT
# End /etc/systemd/scripts/iptables
EOF
chmod 700 /etc/systemd/scripts/iptables
Med dette skriptet skal intranettet ditt være rimelig sikkert mot
ytre angrep. Ingen skal kunne sette opp en ny tilkobling til en
hvilken som helst intern tjeneste, og hvis den er maskert, gjør
intranettet ditt usynlig for Internett. Videre, brannmuren din
skal være relativt trygg fordi det ikke finnes noen tjenester som
kjører som en angriper kunne angripe.
BusyBox
Dette scenariet er ikke så forskjellig fra Opprette Maskering av Ruter med
iptables, men tilbyr i tillegg noen tjenester til intranettet
ditt. Eksempler på dette kan være når du ønsker å administrere
brannmuren fra en annen vert på intranettet ditt eller bruke det
som en proxy eller en navneserver.
Note
Å skisserer spesifikt hvordan du beskytter en server som tilbyr
tjenester på Internett går langt utover omfanget av dette
dokumentet. Se referansene i the
section called “Ekstra Informasjon” for mer informasjon.
Vær forsiktig. Hver tjeneste du har aktivert gjør oppsettet ditt
mer komplekst og brannmuren din mindre sikker. Du er utsatt for
risikoen for feilkonfigurerte tjenester eller kjører en tjeneste
med en utnyttbar feil. En brannmur bør generelt ikke kjøre noen
ekstra tjenester. Se introduksjonen til Opprette Maskering av Ruter med iptables
for flere detaljer.
Hvis du ønsker å legge til tjenester som intern Samba eller
navneservere som ikke trenger tilgang til Internett selv,
tilleggsutsagnene er ganske enkle og bør fortsatt være
akseptabelt fra et sikkerhetssynspunkt. Bare legg til følgende
linjer inn i skriptet før
loggingsreglene.
iptables -A INPUT -i ! WAN1 -j ACCEPT
iptables -A OUTPUT -o ! WAN1 -j ACCEPT
Hvis nisser, for eksempel squid, må få tilgang til Internett, kan
du åpne OUTPUT generelt og begrense INPUT.
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -j ACCEPT
Det er imidlertid generelt ikke tilrådelig å forlate OUTPUT
ubegrenset. Du mister all kontroll over trojanere som vil "ringe
hjem", og litt redundans i tilfelle du har (feil-)konfigurert en
tjeneste slik at den kringkaster dens eksistens til verden.
For å oppnå dette bør du begrense INPUT og OUTPUT på alle porter
unntatt de som er absolutt nødvendig å ha åpen. Hvilke porter du
må åpne avhenger av dine behov: stort sett finner du dem ved å se
etter mislykkede tilganger i loggfilene dine.
Ta en Titt på Følgende Eksempler:
-
Squid mellomlagrer nettet:
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --sport 80 -m conntrack --ctstate ESTABLISHED \
-j ACCEPT
-
Din mellomlagrings navneserver (f.eks. named) gjør sine
oppslag via UDP:
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
-
Du vil ha mulighet å pinge datamaskinen for å sikre at den
fortsatt er i live:
iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
-
Hvis du ofte
bruker FTP servere eller liker å chatte, kan du merke
forsinkelser fordi noen implementeringer av disse nissene
spør en identd nisse på systemet ditt for å få brukernavn.
Selv om det egentlig er lite skade i dette, å ha en identd
kjørende er ikke anbefalt fordi mange sikkerhetseksperter
føler tjenesten gir ut for mye tilleggsinformasjon.
For å unngå disse forsinkelsene kan du avvise forespørslene
med et 'tcp-reset' svar:
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
-
For å logge og droppe ugyldige pakker (pakker som kom inn
etter netfilters tidsavbrudd eller noen typer
nettverksskanninger) sett inn disse reglene øverst i
kjeden:
iptables -I INPUT 0 -p tcp -m conntrack --ctstate INVALID \
-j LOG --log-prefix "FIREWALL:INVALID "
iptables -I INPUT 1 -p tcp -m conntrack --ctstate INVALID -j DROP
-
Alt som kommer utenfra skal ikke ha en privat adresse,
dette er et vanlig angrep kalt IP-spoofing:
iptables -A INPUT -i WAN1 -s 10.0.0.0/8 -j DROP
iptables -A INPUT -i WAN1 -s 172.16.0.0/12 -j DROP
iptables -A INPUT -i WAN1 -s 192.168.0.0/16 -j DROP
Det er andre adresser du kanskje også vil droppe:
0.0.0.0/8, 127.0.0.0/8, 224.0.0.0/3 (multicast og
eksperimentell), 169.254.0.0/16 (Koble til lokale
nettverk), og 192.0.2.0/24 (IANA definert testnettverk).
-
Hvis brannmuren din er en DHCP klient, må du tillate disse
pakkene:
iptables -A INPUT -i WAN1 -p udp -s 0.0.0.0 --sport 67 \
-d 255.255.255.255 --dport 68 -j ACCEPT
-
For å forenkle feilsøking og være rettferdig mot alle som
vil ha tilgang til en tjeneste du har deaktivert, med vilje
eller ved en feiltakelse, du kan AVVISE (REJECT) de pakkene
som blir droppet.
Åpenbart må dette gjøres direkte etter logging på siste
linjer før pakkene droppes av retningslinjer::
iptables -A INPUT -j REJECT
Dette er bare eksempler for å vise deg noen av egenskapene til
brannmurkoden i Linux. Ta en titt på mansiden til iptables. Der
finner du mye mer informasjon. Portnumrene som trengs for dette
finner du i /etc/services
, i
tilfelle du ikke fant dem ved prøving og feiling i loggfilen din.
Systemd Enhet
For å sette opp iptables brannmuren ved oppstart, installer
iptables.service
enheten inkludert
i blfs-systemd-units-20240205
pakken.
make install-iptables