Tulemüüri skriptimine09. May '15

Linuxi tulemüüri reeglitega majandamine klassikalisel kujul a'la iptables-save/restore on paras peavalu, mistõttu on mõistlik see oma ülesandepüstituse tarbeks ära abstraheerida Bash funktsioonide abil

##############################
### Tulemüüri lähtestamine ###
##############################

function nf_reset() {
    iptables -F -t filter
    iptables -F -t nat
    iptables -F -t mangle

    # Sea vaikimisi poliitikaks DROP ning luba väljaminevad ühendused
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT

    # Luba väljaminevate TCP ja UDP ühenduste koosseisus tagasi tulevad paketid
    iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

    # Luba alati kohalikust masinast
    iptables -A INPUT -i lo -j ACCEPT
}

###############################################
### Ligipääsu lubamine kohalikku teenusesse ###
###############################################

function nf_allow() {
    if [ -z $3 ]; then
        iptables -A INPUT -p $1 --dport $2 -j ACCEPT
    else
        iptables -A INPUT -p $1 --dport $2 -i $3 -j ACCEPT
    fi
}


##########################
### Pingimise lubamine ###
##########################

function nf_allow_ping() {
    if [ -z $1 ]; then
        iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
    else
        iptables -A INPUT -i $1 -p icmp --icmp-type 8 -j ACCEPT
    fi
}


##########################
### Interneti jagamine ###
##########################

function nf_masquerade() {
    # Markeeri NAT-itavad paketid
    iptables -A FORWARD -t mangle -i $1 -o $2 -j MARK --set-mark 0x55

    # Luba esimeselt võrguliideselt teisele minevad paketid
    iptables -A FORWARD -i $1 -o $2 -j ACCEPT

    # Luba tagasi tulevad paketid
    iptables -A FORWARD -o $1 -i $2 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

    # Tee maskeraadi ainult markeeritud pakettidele
    iptables -A POSTROUTING -t nat -m mark --mark 0x55 -o $2 -j MASQUERADE
}


########################
### Pordi edastamine ###
########################

function nf_port_forward() {
    if [ -z $4 ]; then
        iptables -A PREROUTING -t nat -p $1 --dport $2 -j DNAT --to $3:$2
        iptables -A FORWARD -i $WAN_INTERFACE -o $LAN_INTERFACE -d $3 -p $1 --dport $2 -j ACCEPT
    else
        iptables -A PREROUTING -t nat -p $1 --dport $2 -j DNAT --to $3:$4
        iptables -A FORWARD -i $WAN_INTERFACE -o $LAN_INTERFACE -d $3 -p $1 --dport $4 -j ACCEPT
    fi
}


#############################################
### Luba liiklus kahe võrguliidese vahel, ###
### eeldab õigeid marsruutimistabeleid    ###
#############################################

function nf_bridge() {
    iptables -A FORWARD -i $1 -o $2 -j ACCEPT
    iptables -A FORWARD -i $2 -o $1 -j ACCEPT
}


###############################################################
### Silumise lihtsustamine,                                 ###
### saad konkreetse "Destination port unreachable" veateate ###
###############################################################

function nf_debug() {
    nf_allow_ping
    iptables -A INPUT -j REJECT
    iptables -A FORWARD -j REJECT
}

Otseloomulikult on mõistlik ülal kirjeldatud funktsioonid kokku korjata eraldi faili ning neid source abil sisse lugeda, nii saame üsna inimloetava reeglistiku:

#!/bin/bash

set -e # Katkesta vigade puhul
set -x # Näita mida käivitatakse

source /tee/minu/ägeda/tulemüüri/teegini.sh

WAN_INTERFACE=eth0 # Välisvõrgu liides
LAN_INTERFACE=eth1 # Sisevõrgu liides
S2S_INTERFACE=tun0 # Site-to-site tunneli liides
VPN_INTERFACE=tap0 # Sülearvutite virtuaalprivaatvõrgu liides
WEBSERVER=192.168.101.2

nf_reset
nf_allow_ping                                # Luba pingida suvaliselt võrguliideselt
nf_allow tcp 22                              # Luba OpenSSH suvaliselt võrguliideselt
nf_allow udp 53 $LAN_INTERFACE               # Luba DNS päringud sisevõrgust
nf_allow udp 67 $LAN_INTERFACE               # Luba DHCP päringud sisevõrgust
nf_allow udp 53 $S2S_INTERFACE               # Luba DNS päringud site-to-site tunnelist
nf_allow udp 53 $VPN_INTERFACE               # Luba DNS päringud sülearvutitest
nf_allow udp 1194 $WAN_INTERFACE             # Luba OpenVPN serverile ligipääs
nf_allow tcp 1194 $WAN_INTERFACE             # Luba OpenVPN serverile ligipääs
nf_masquerade $LAN_INTERFACE $WAN_INTERFACE  # Sisevõrgust välisvõrku
nf_masquerade $VPN_INTERFACE $S2S_INTERFACE  # Sülearvutite võrgust site-to-site tunnelisse
nf_port_forward tcp 80 $WEBSERVER            # Suuna pordile 80 tulnud liiklus edasi veebiserveri pordile 80
nf_port_forward tcp 2222 $WEBSERVER 22       # Suuna pordile 2222 tulnud liiklus edasi veebiserver pordile 22
nf_bridge $LAN_INTERFACE $VPN_INTERFACE      # Luba sisevõrgust sülearvutite võrku ja vastupidi
nf_bridge $LAN_INTERFACE $S2S_INTERFACE      # Luba site-to-site tunnelist sisevõrgu ja vastupidi
nf_debug
bash iptables netfilter