Script per il firewalling locale di un server

Script di esempio contenente le tipiche regole di iptables per un server connesso direttamente ad internet.
Questo script limita al massimo l'accesso in entrata ed uscita dalla macchina, permettendo traffico NTP su un server specificato, traffico DNS lato client, traffico SSH da 2 indirizzi definiti, ICMP da 2 indirizzi ( o reti) definiti e invio di mail ad un server definito.
Nell'ultima parte dello script di definiscono le specifiche regole per i servizi pubblici offerti dal server (In questo caso: http e https).

#!/bin/sh

### DEBUGGING ###
Abilita il debug a livello di script
set -x

### FLUSHING CHAIN ###
Flush delle regole
/sbin/iptables -F
Cancella eventuali catene create dall'utente
/sbin/iptables -X
Azzera i counter
/sbin/iptables -Z

### DEFAULT CHAIN ###
Assegnazione del target di default per le catene di INPUT, OUTPUT,FORWARD.
E' buona regola filtrare tutto quanto e aprire i singoli servizi realmente indispensabili

/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT DROP

### SETTING IPFORWARDING ###
/bin/echo "1" > /proc/sys/net/ipv4/ip_forward
### DISABLE RESPOND TO BROADCAST ICMP ###
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
### ENABLE BAD ERROR MESSAGE PROTECTION ###
/bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
### DISABLE ICMP REDIRECT ACCEPTANCE ###
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
### SETTING ANTISPOOFING PROTECTION ###
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/rp_filter
### LOG ALL IMPOSSIBLE IP ###
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

## SETTING UP  VARIABLES ##
Inizializzazione di varibili come ip, network o valori che si ripetono piu volte nello script
GW1=xxx.xxx.xxx.xxx
GW2=xxx.xxx.xxx.xxx
LINEA1=xxx.xxx.xxx.xxx/xx
LINEA2=xxx.xxx.xxx.xxx/xx
NTP_SRV=xxx.xxx.xxx.xxx
MAIL_SRV=xxx.xxx.xxx.xxx

##################################################################

Regole che rigurdano il loopback
# ======================= LOCALHOST ================================
/sbin/iptables -A INPUT -s 127.0.0.1 -j ACCEPT
/sbin/iptables -A OUTPUT -s 127.0.0.1 -j ACCEPT

Regole che permettono di connettersi via ssh da gw1 e gw2
# ======================= SSH RULE ================================
/sbin/iptables -A INPUT -i eth0 -p TCP --dport 22  -s $GW1 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p TCP --dport 22  -s $GW2 -j ACCEPT
/sbin/iptables -A OUTPUT -o eth0 -p TCP --sport 22  -d $GW1 -j ACCEPT
/sbin/iptables -A OUTPUT -o eth0 -p TCP --sport 22  -d $GW2 -j ACCEPT

Regole che permettono di eseguire query al DNS
# ======================= DNS RULE ==========================
/sbin/iptables -A INPUT  -p TCP -s 0/0 --sport 53 -j ACCEPT
/sbin/iptables -A INPUT  -p udp -s 0/0 --sport 53 -j ACCEPT
/sbin/iptables -A OUTPUT -p udp -s 0/0 --dport 53 -j ACCEPT
/sbin/iptables -A OUTPUT -p TCP -s 0/0 --dport 53 -j ACCEPT

Regole che permettono di pingare la macchina da LINEA1 e LINEA2
# ======================= ICMP RULE ==========================
/sbin/iptables -A INPUT  -p icmp -s $LINEA1 -j ACCEPT
/sbin/iptables -A INPUT  -p icmp -s $LINEA2 -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp -s $LINEA1 -j ACCEPT
/sbin/iptables -A OUTPUT -p icmp -s $LINEA2 -j ACCEPT

Regole che permettono il traffico con NTP_SRV  per il sync dell'ora
# ======================= NTP RULE =========================
/sbin/iptables -A INPUT  -p udp --sport ntp -s $NTP_SRV -j ACCEPT
/sbin/iptables -A INPUT  -p tcp --sport ntp -s $NTP_SRV -j ACCEPT
/sbin/iptables -A OUTPUT -p udp --dport ntp -d $NTP_SRV -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport ntp -d $NTP_SRV -j ACCEPT

Regole che permettono di inviare mail
# ================== MAIL SEND RULE ========================
/sbin/iptables -A INPUT  -p tcp --sport 25 -s $MAIL_SRV -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 25 -d $MAIL_SRV -j ACCEPT

### ADD CUSTOM SERVER RULES BELOW
# ================= HTTP & HTTPS ============================

/sbin/iptables -A INPUT -i eth0 -p TCP --dport 80 -j ACCEPT
/sbin/iptables -A OUTPUT -o eth0 -p TCP --sport 80 -j ACCEPT
/sbin/iptables -A INPUT -i eth0 -p TCP --dport 443 -j ACCEPT
/sbin/iptables -A OUTPUT -o eth0 -p TCP --sport 443 -j ACCEPT

Privacy Policy