IPchains-palomuuri

Linuxin ytimessä on vakiona monipuoliset palomuuritoiminnot. Palomuuritoimintojen käyttö on suositeltavaa, mikäli koneella on käytössä verkkopalveluita ja se on kytketty julkiseen tietoverkkoon, kuten Internetiin. Palomuuri ei yksinään takaa täydellistä turvaa murtautujia vastaan, mutta oikein tehtynä se auttaa vähentämään riskejä joutua tietomurron kohteeksi.

Palomuuri ajatellaan usein loogisesti erilliseksi elementiksi, joka on sijoitettu julkisen ja sisäisen verkon väliin. Sen tarkoituksena on rajoittaa valikoivasti verkkoliikennettä siten, että ulkopuoliset eivät suoraan pääse käsiksi sisäisen verkon laitteisiin. Linux-koneessa palomuurin voi myös tehdä samaan koneeseen, johon on asennettu halutut verkkopalvelut. Täten sitä voidaan käyttää myös yksittäisen koneen suojaamiseen.

Palomuurin säätäminen toimintakuntoon ja erityisesti sen saaminen turvalliseksi ei ole yksinkertainen tehtävä. Tästä syystä seuraava esimerkki saattaa olla hyödyllinen palomuuria rakennettaessa. Siinä on huomioitu tavallisimmat turvallisuusasiat, ja sitä käyttämällä vältät myös tavalliset, aloittelijoiden tekemät virheet. Jos muokkaat tai käytät tätä esimerkkiä, ota selvää muutosten vaikutuksesta.

Vihje: Useissa levityspaketeissa voit tehdä palomuurin asennusvaiheessa. Näin esimerkiksi Redhat 7.2:ssa ja uudemmissa. Myös esimerkiksi Alan Coxin tekemä Lokkit on graafinen ohjelma, jolla voit tehdä yksinkertaisen palomuurin koneellesi.



Esimerkki 7-3. rc.firewall

#!/bin/sh
#
##################################################################
# /etc/rc.d/rc.firewall
##################################################################
#
# Esimerkkityyppinen skripti Linux kernel 2.2.x + ipchains-pohjaiseen
# palvelimeen suojaamaan palvelin toisaalta internetin suunnasta
# tulevista asiattomista yhteydenmuodostuksista ja toisaalta
# sallimaan ip-naamioidut yhteydet omasta lähiverkosta internettiin.
# 
# Ohjeen ovat koostaneet useiden netin tietoturvaohjeiden pohjalta
# Juhani Rantanen <misty@sgic.fi>
# Jussi Törhönen <jt@iki.fi>
#
# Tämä skriptin voi ajaa käynnistysvaiheessa lisäämällä
# /etc/rc.d/rc.local scriptin loppuun rivit (ilman kommenttimerkkejä!):
#
### ipchains-muurin käynnistys:
#if [ -f /etc/rc.d/rc.firewall ]; then
#    echo "Loading rc.firewall rules ..."
#    /etc/rc.d/rc.firewall
#fi
#
# Käynnistyksen jälkeen säännöt ovat nähtävissä komennolla
# 'ipchains -L -n'
#
##################################################################
#
# Oma julkinen ip-osoite internetin puoleisella eth0-verkkokortilla.
# Vaihda tähän oma kiinteä ip-osoitteesi:
ETH0IP=10.20.30.40
#
# Oman ISP:n NTP-aikapalvelin:
ISPNTP=ntp.OMAISP.fi
#
# Oman ISP:n SMTP-postipalvelimet:
ISPSMTP1=smtp1.OMAISP.fi
ISPSMTP2=smtp2.OMAISP.fi
#
PATH=/sbin
#
###########################################################################
### Disable ip spoofing:
if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then
      echo -n "Enabling IP spoofing protection..."
      for f in /proc/sys/net/ipv4/conf/*/rp_filter; do
          echo 1 > $f
      done
      echo "done."
fi
#
###########################################################################
### Disable TCP SYN attach disturbation:
if [ -w /proc/sys/net/ipv4/tcp_syncookies ]
then
        echo -n "Enabling TCP SYN Cookie Protection..."
        echo 1 > /proc/sys/net/ipv4/tcp_syncookies
        echo "done."
fi
#
###########################################################################
### Enable logging Spoofed Packets, Source Routed Packets, Redirect Packets
if [ -e /proc/sys/net/ipv4/conf/all/log_martians ]; then
      echo -n "Enable logging Spoofed, Source Routed and Redirect Packets..."
      for f in /proc/sys/net/ipv4/conf/*/log_martians; do
         echo 1 > $f
      done
      echo "done."
fi
###########################################################################
####################################################################
### FLUSH ALL RULES
### Poistetaan kaikki olemassaolevat palomuurisäännöt
ipchains -F input
ipchains -F output
ipchains -F forward
#
# Estetään kernelin ip-forwarding eli ip-pakettien reititys.
# Sallitaan myöhemmin tässä scriptissä ACCEPT tai MASQ säännöillä.
echo "0" > /proc/sys/net/ipv4/ip_forward
#
####################################################################
### ANTI-SPOOFING
# ks. ftp://ftp.funet.fi/pub/networking/documents/rfc/rfc1918.txt
### Estetään ulkoverkosta tulevat, sisäverkon osoitteella lähetetyt
### paketit. Näin verkkoosi ei pääse käsiksi ulkoverkosta
### väärennetyllä ip-osoitteella.
#
ipchains -A input -p all -l -j REJECT -s 10.0.0.0/8 -i eth0 -d $ETH0IP
ipchains -A input -p all -l -j REJECT -s 127.0.0.0/8 -i eth0 -d $ETH0IP
ipchains -A input -p all -l -j REJECT -s 192.168.0.0/16 -i eth0 -d $ETH0IP
ipchains -A input -p all -l -j REJECT -s 172.16.0.0/12 -i eth0 -d $ETH0IP
#
### FTP-DATA auki kaikille, jotta pääsisit tästä Linux-palvelimesta
### ulos internetin ftp-palvelimiin ilman ftp-asiakasohjelman passive-
### modea. Jos FTP-DATA on tukossa, passive-mode ftp:llä yhteys 
### toimii, mutta voi sitä käyttäjien narinan määrää ;-)
### Ftp-yhteys syntyy Linuxista ftp-palvelimen porttiin 21/tcp
### ja data-kanava aukeaa ftp-palvelimesta tämän Linux-purkin porttiin
### 20/tcp (ftp-data on portin nimi, ks. /etc/services).
#
ipchains -A input -p tcp -j ACCEPT -s 0/0 -i eth0 -d $ETH0IP ftp-data
#
### SMTP-portti auki kaikille, jos tässä Linux-purkissa on julkinen
### sähköpostipalvelin (sendmail, zmailer, qmail, ...) ja halutaan
### reitittää SMTP-postia internetistä tähän koneeseen asti.
### Yhden postilaatikon mailien imurointi oman ISP:n postipalvelimelta
### ei vaadi sendmailia tähän, vaan homma hoituu esim. fetchmail-
### ohjelmalla.
# 
ipchains -A input -p tcp -j ACCEPT -s 0/0 -i eth0 -d $ETH0IP smtp
#
### Vaihtoehtona em. riville voidaan sallia sisääntuleva SMTP ainoastaan
### oman ISP:n SMTP-palvelimimlle. Nimipalvelun MX-tietueet oltava
### määritelty siten, että posti kiertää ISP:n SMTP-servojen
### kautta sisään. Ks. esim. 'nslookup -type=mx iki.fi' jossa iki.fi
### voisi tukkia SMTP-palvelunsa muilta, paitsi ISP:nsä mail.clinet.fi 
### palvelimelta. Kaikki saapuva posti tulisi sisään mail.clinet.fi
### palvelimen kautta.
#
# ipchains -A input -p tcp -j ACCEPT -s $ISPSMTP1 -i eth0 -d $ETH0IP smtp
# ipchains -A input -p tcp -j ACCEPT -s $ISPSMTP2 -i eth0 -d $ETH0IP smtp
#
### NTP-portti auki ISP:n NTP-palvelimelle. Jos tässä Linux-purkissa
### pyöritellään xntpd-aikapalvelua tai halutaan ajastaa kello
### määrävälein ntpdate-koomennolla, täytyy ao. portit olla auki:
#
ipchains -A input -p udp -j ACCEPT -s $ISPNTP -i eth0 -d $ETH0IP ntp
ipchains -A input -p udp -l -j REJECT -s 0/0 -i eth0 -d $ETH0IP ntp
ipchains -A input -p tcp -j ACCEPT -s $ISPNTP -i eth0 -d $ETH0IP ntp
ipchains -A input -p tcp -l -j REJECT -s 0/0 -i eth0 -d $ETH0IP ntp
#
### auth = ident kielletään, mutta ei logata. Internetin sendmail, ftp,
### ... -palvelimet tekevät paljon ident-kyselyitä, kun niihin avataan
### yhteyksiä. Portin ei ole pakko olla auki.
#
ipchains -A input -p tcp -j REJECT -s 0/0 -i eth0 -d $ETH0IP auth
#
######################################################################
### BLOCKING 1:1023 (laitetaan oletuksena kaikki < 1024 portit tukkoon)
#
ipchains -A input -p tcp -l -j REJECT -s 0/0 -i eth0 -d $ETH0IP 1:1023
ipchains -A input -p udp -l -j REJECT -s 0/0 -i eth0 -d $ETH0IP 1:1023
#
### Oletuksena >=1024 portit ovat kaikille auki, ja yhteydet niistä
### täytyy erikseen kieltää tarvittaessa. Tässä myyräntyössä
### ovat suurena apuna komennot 'netstat -a -n' ja 'netstat -ltup -n'
#
# Squidin SNMP-moduli tukkoon (portissa 3401/udp):
ipchains -A input -p udp -l -j REJECT -s 0/0 -i eth0 -d $ETH0IP 3401
#
# Squid proxy cache tukkoon (portissa 3128/tcp):
ipchains -A input -p tcp -l -j REJECT -s 0/0 -i eth0 -d $ETH0IP 3128
#
# X11 tukkoon:
ipchains -A input -p tcp -l -j REJECT -s 0/0 -i eth0 -d $ETH0IP 6000:6100
ipchains -A input -p udp -l -j REJECT -s 0/0 -i eth0 -d $ETH0IP 6000:6100
ipchains -A input -p tcp -l -j REJECT -s 0/0 -i eth0 -d $ETH0IP 6667
ipchains -A input -p tcp -l -j REJECT -s 0/0 -i eth0 -d $ETH0IP 7000
#
#####################################################################
### FORWARD RULES
#
# Ladataan vaadittavat ip-maskausmoduulit
#

# HUOM: Lataa vain tarvittavat moduulit. Kaikki tämänhetkiset
# moduulit näkyvät alla, mutta niistä osa on kommenttiriveillä.
#
# Tämä moduuli tukee ftp-siirtoyhteyttä, kun ip-maskaus on päällä 

modprobe ip_masq_ftp

#
# Tukee ip-maskausta Realaudion UDP-siirron kanssa. Ilman tätä 
# Realaudio toimii, mutta käyttää TCP-protokollaa siirtoon.  
# Tämä voi heikentää äänenlaatua. 
#

modprobe ip_masq_raudio

#
### Tukee IRC-protokollan DCC-protokollan mukaista tiedostonsiirtoa
# modprobe ip_masq_irc
#
# Tukee Quaken/Quakeworldin käyttämien protokollien maskausta
# Jälkimmäinen esimerkki tukee kaikkia Quaken versioita
### Quake I / QuakeWorld (portit 26000 ja 27000)
# modprobe ip_masq_quake
#
### Quake I/II/III / QuakeWorld (portit 26000, 27000, 27910, 27960)
# modprobe ip_masq_quake ports=26000,27000,27910,27960
#
### Tukee CuSeeMe-videoneuvotteluohjelman maskausta
# modprobe ip_masq_cuseeme
#
### Tukee VDO-live-videoneuvotteluohjelman maskausta
# modprobe ip_masq_vdolive
#
### TÄRKEÄÄ: sallitaan ip-pakettien reititys, koska se kiellettiin aiemmin
#
#           Redhat Users:  you may try changing the options in
#           /etc/sysconfig/network from:
#
#                       FORWARD_IPV4=false
#                             to
#                       FORWARD_IPV4=true
#
echo "1" > /proc/sys/net/ipv4/ip_forward
#
### Dynaamisen IP:n käyttäjät


#   Jos haet ip-osoitteesi dynaamisesti PPP- tai DHCP-protokollalla,
#   salli seuraava optio. 
#
#   If you get your IP address dynamically from SLIP, PPP, or DHCP, 
#   enable this following option.  This enables dynamic-ip address 
#   hacking in IP MASQ, making the life
#   with Diald and similar programs much easier.
#
# echo "1" > /proc/sys/net/ipv4/ip_dynaddr
#
### MASQ timeouts
#
#   2 hrs timeout for TCP session timeouts
#  10 sec timeout for traffic after the TCP/IP "FIN" packet is received
#  160 sec timeout for UDP traffic (Important for MASQ'ed ICQ users)
#
ipchains -M -S 7200 10 160
#
### DHCP:  For people who receive their external IP address from either 
#          DHCP or BOOTP
#          such as ADSL or Cablemodem users, it is necessary to use the
#          following
#          before the deny command.  The "bootp_client_net_if_name" should
#          be replaced
#          the name of the link that the DHCP/BOOTP server will put an
#          address on to?
#          This will be something like "eth0", "eth1", etc.
#
#          This example is currently commented out.
#
#
# ipchains -A input -j ACCEPT -i bootp_clients_net_if_name \
# -s 0/0 67 -d 0/0 68 -p udp
#
### Enable simple IP forwarding and Masquerading
#
#  NOTE:  The following is an example for an internal LAN address in the
#         192.168.0.x
#         network with a 255.255.255.0 or a "24" bit subnet mask.
#
#         Please change this network number and subnet mask to match 
#         your internal LAN setup
#
ipchains -P forward DENY
#
### Jos sisäverkossa on kaksi verkkokorttia ja niissä omat
### aliverkkonsa (eth1: 192.168.0.0/24 ja eth2: 192.168.1.0/24)
### sallitaan tässä ip-forwarding eli ip-reititys ilman ip-naamiointia.
# ipchains -A forward -i eth1 -d 192.168.1.0/24
# ipchains -A forward -i eth2 -d 192.168.0.0/24
#
### Sallitaan sisäverkon private network -verkoista ip-naamioidut
### yhteydet internettiin. Private-verkoista kannattaa lukea
### ftp://ftp.funet.fi/pub/networking/documents/rfc/rfc1918.txt
#
ipchains -A forward -p all -s 10.0.0.0/8 -j MASQ
ipchains -A forward -p all -s 172.16.0.0/12 -j MASQ
ipchains -A forward -p all -s 192.168.0.0/24 -j MASQ
#
### Jos sisäverkossa on kaksi verkkokorttia ja niissä omat
### aliverkkonsa (eth1: 192.168.0.0/24 ja eth2: 192.168.1.0/24)
### sallitaan tässä ip-forwarding eli ip-reititys ilman ip-naamiointia
### ko. verkkojen välillä:
#
# ipchains -A forward -i eth1 -d 192.168.1.0/24
# ipchains -A forward -i eth2 -d 192.168.0.0/24
#
## Set telnet, www and FTP for minimum delay -
# This section manipulates the Type Of Service (TOS) bits of the
# packet. For this to work, you must have CONFIG_IP_ROUTE_TOS enabled
# in your kernel
#
ipchains -A output -p tcp -d 0/0 www -t 0x01 0x10
ipchains -A output -p tcp -d 0/0 telnet -t 0x01 0x10
ipchains -A output -p tcp -d 0/0 ftp -t 0x01 0x10
#
# Set ftp-data for maximum throughput
ipchains -A output -p tcp -d 0/0 ftp-data -t 0x01 0x08
#
#####################################################################
#
### The End.