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