Linux - Firewall teoria e script single lan o Gateway

Segno qui alcune info trovate su internet su come settare il firewall di un server linux quando opera con una sola scheda di rete oppure come gateway.


Inoltre segno alcune info:



La gestione delle funzioni di packet filtering, natting e forwarding dal kernel 2.4 è affidata al netfilter subsystem, gestibile tramite il comando iptables.

La gestione delle funzioni di firewalling su Linux ha subito nel corso degli anni cambiamenti progressivi.

Nel kernel 2.x questa funzione è affidata ad un comando con sistassi simile: ipchains.



Nei kernel precedenti il comando utilizzato era ipfadm.


Iptables basa la sua funzionalità su diverse tables a cui sono applicate delle chains (catene) con le regole di filtering definite dall'utente.

Ogni regola di filtraggio di pacchetti prevede un target, che definisce cosa viene fatta del pacchetto che soddisfa i criteri specificati.



Le tables possono essere:


filter E' la tabella di default, che riguarda il filtraggio di pacchetti. Prevede le chains predefinite: INPUT (per i pacchetti diretti all'host), OUTPUT (per pacchetti generati dall'host) e FORWARD (per pacchetti che attaversano l'host, avendo IP sorgente e destinatario diversi).


nat E' necessaria per natting e masquerading, prevede le tabelle PREROUTING (alterazione degli IP di pacchetti prima che vengono processati da ipfilter), POSTROUTING (alterazione di pacchetti che stanno lasciando l'host), OUTPUT (per modificare prima di routarli pacchetti generati dall'host)


mangle Viene usata per modifiche particolari dei pacchetti (TOS, mirroring ecc). Ha due chains predefinite: PREROUTING (alterazione degli IP di pacchetti prima che vengano processati da netfilter), OUTPUT (per modificare prima di routarli pacchetti generati dall'host). 


La sintassi di base di iptables è:

iptables [comando] [opzioni]


Ci può essere solo un comando per riga che definisce quale azione eseguire (l'elenco che segue non è completo):



-A regole catenaAggiunge una o più regole alla fine della catena indicata
-D regole catenaCancella una o più regole dalla catena indicata
-F [catena]Cancella tutte le regole o solo quelle della catena indicata
-L [catena]Elenca tutte le regole o solo quelle della catena indicata
-P catena targetDefinisce il target di default per la catena indicata
-N catenaCrea una nuova catena, definita dall'utente, con il nome specificato


Esistono diversi target a cui indirizzare un pacchetto che matcha una regola.

Il target può essere:


1- il nome di una nuova chain;


2- un comportamento base come ACCEPTDROPQUEUE (i pacchetti vengono inviati in userspace, per l'elaborazione con programmi esterni), RETURN;


3- 
target speciali, correlati a moduli del kernel che vanno appositamente compilati:



LOG Registra tramite syslog il matching del pacchetto


REJECT Elimina il pacchetto e, eventualmente, restituisce un messaggio ICMP (icmp-*-unreachable) configurabile.


TOS Imposta il campo Type Of Service nell'intestazione IP. Valido solo per la tabella mangle.


SNAT Modifica l'IP sorgente (Source natting). Vale solo per la catena POSTROUTING della tabella nat


DNAT Modifica l'IP destinatario (Destination natting). Vale solo per la catena PREROUTING della tabella nat.


MASQUERADE Maschera il pacchetto in modo che sembri provenire dal'host locale. Valido solo per la tabella nat, viene usato per il natting dinamico di intere lreti locali su Internet.


REDIRECT Redireziona il pacchetto ad una porta locale. Necessario per fare transparent proxying.


Per identificare i pacchetti nelle singole regole sono disponibili diverse opzioni che definiscono il criterio di corrispondenza. Per quasi tutte è prevista la possibilità del segno ! per identificare tutti i pacchetti tranne quelli specificati.
-p [!] protocolloI pacchetti che corrispono al protocollo definito: tcpudpicmpall (default)
-s [!] indirizzo[/mask] [!] [porta]I pacchetti che hanno l'IP sorgente specificato. La mask può essere sia in format estesa (es: /255.255.255.0) che compatta (es: /24). E' possibile anche specificare la porta sorgente.
-d [!] indirizzo[/mask] [!] [porta]I pacchetti che hanno l'IP e/o la porta di destinazione specificati.
-i [!] interfaccia[+]I pacchetti ricevuti in entrata sull'interfaccia definita. Il + è una wildcard (es: eth+ per tutte le ethernet)
-o [!] interfaccia[+]Tutti i pacchetti in uscita sull'interfaccia specificata.
-j TARGETSalta al TARGET indicato o ad una catena definita dell'utente.

Esistono inoltre criteri più sofisticati per il matching dei pacchetti che possono basarsi sul mac-address, l'icmp type, lo stato della connessione TCP (syn,ack,rst) il TOS ecc.

Ecco un esempio di script che permette:


E' uno script che imposta un firewall (piuttosto restrittivo) su una macchina (con un unica interfaccia ethernet (eth0)) che può essere usata come server WEB.
La prima parte può essere valida per qualsiasi server pubblico. L'ultimo set di regole si applica ad un server web.
FLUSHING CHAIN: Azzera e ripulisce ogni possibile regola esistente.
DEFAULT CHAIN: Imposta le regole di default (drop di tutti i pacchetti).
SETTINGS: Imposta particolari opzioni sul kernel, operando direttamente sul proc filesystem.
VARIABLES: Definisce come variabili vari indirizzi IP, che vanno cambiati dall'utente.
LOCALHOST: Non filtra i pacchetti che hanno sorgente 127.0.0.1
SSH RULE: Permette l'accesso SSH (porta 22) da GW1 e GW2
DNS RULE: Permette all'host di eseguire query DNS.
ICMP RULE: Permette pacchetti ICMP dalle reti LINEA1 e LINEA2.
NTP RULE: Permette all'host di essere NTP client per il server NTP_SRV
MAILSEND RULE: Permette all'host di inviare mail a server che hanno IP compresi in LINEA1 e LINEA2
WEB SERVER RULE: Permette l'accesso al web server locale da Internet (porte 80 e 443)



Ecco lo script


#!/bin/sh
#
# firewall.sh - Version 20020319 - Coresis
#
# Used random IPs
#
### DEBUGGING ###
set -x

### FLUSHING CHAIN ###
/sbin/iptables -F
/sbin/iptables -X 
/sbin/iptables -Z 

### DEFAULT CHAIN ###

/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 ###
/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

### DON'T RESPOND TO BROADCAST PINGS ###
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

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

#GW1 AND GW2 ARE TRUSTED HOSTS FROM WHICH SSH COMMUNICATION IS PERMITTED
GW1=10.10.10.4
GW2=192.168.1.5

#LINEA1 AND LINEA2 ARE TRUSTED NETWORKS FROM WHICH ICMPS ARE ALLOWED
LINEA1=10.10.10.0/24
LINEA2=192.168.1.0/24

# NTP_SRV IS A NETWORK TIME PROTOCOL SERVER
NTP_SRV=10.198.151.1

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

# ======================= LOCALHOST ================================
/sbin/iptables -A INPUT -s 127.0.0.1 -j ACCEPT
/sbin/iptables -A OUTPUT -s 127.0.0.1 -j ACCEPT

# ======================= 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

# ======================= 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

# ======================= 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

# ======================= 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

# ================== MAIL SEND RULE ========================

/sbin/iptables -A INPUT  -p tcp --sport 25 -s $LINEA1 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 25 -d $LINEA1 -j ACCEPT
/sbin/iptables -A INPUT  -p tcp --sport 25 -s $LINEA2 -j ACCEPT
/sbin/iptables -A OUTPUT -p tcp --dport 25 -d $LINEA2 -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

Ecco uno script che permette di fare il gateway

E' uno script che permette ad una macchina Linux con due interfacce (una su Internet con IP pubblico, una su LAN interna con IP riservato) di fare da gateway per tutta la rete interna, mascherando gli IP locali con un unico IP pubblico.
Inoltre viene fatto un destination natting rendendo accessibile da specifici IP pubblici un VPN server (basato su PPTP) sulla rete interna.
In sequenza vengono dati i seguenti comandi:
- FLUSH delle regole e impostazione dei valori di default.
- Abilita sul kernel l'IP FORWARDING, necessario su un host che fa da router/gateway.
- Imposta sul kernel alcuni flag per la sicurezza.
- Definisce le varie variabili utilizzate negli script (cambiare gli IP secondo le proprie esigenze).
- Imposta regole anti-spoofing.
- Permette al loopback di parlare con se stesso.
- Permette il traceroute da locale.
- Permette l'accesso dagli IP interni all'host (per manutenzione) e il forwarding dei pacchetti dalla rete locale a Internet e viceversa (notare la riga che droppa i pacchetti SYN che arrivano dall'esterno).
- Permette la comunicazione dell'host con i server DNS definiri.
- Permette l'accesso SSH da IP considerati trusted.
- Esegue il MASQUERADING di tutta la rete interna.
- Esegue il destination NATTING del VPN server interno (porta pptp 1723), permette il traffico GRE (IP type 47) e limita allo USER con IP definito l'accesso.


#!/bin/sh
#
# masquerading.sh - Version 20020319 - Coresis
#
# Used random IPs
#
#### DEBUGGING ###
set -x

### FLUSHING CHAIN ###
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -X 
/sbin/iptables -Z 

### DEFAULT CHAIN ###

/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT DROP
/sbin/iptables -t nat -P POSTROUTING ACCEPT
/sbin/iptables -t nat -P PREROUTING ACCEPT

### SETTING IPFORWARDING ###
/bin/echo "1" > /proc/sys/net/ipv4/ip_forward

### DISABLE RESPOND TO BROADCAST ###
/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

### DON'T RESPOND TO BROADCAST PINGS ###
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians

# External Interface
EXTIF="eth1"

# Internal Interface
INTIF="eth0"

# Host Public IP
EGO="211.121.111.111"

# Internal LAN IP
LANIN="10.0.0.0/24"

# Trusted public network
TRUSTED="13.18.151.0/24"

# Traceroute ports
TR_SRC_PORTS="32769:65535" 
TR_DEST_PORTS="33434:33523"

# DNS servers 
DNS1="113.118.51.1"
DNS2="17.16.32.3"

# IP of an User allowed to log in the internal VPN server
USER="112.56.10.32/28"

# IP of the VPN server
VPNSERVER="10.0.0.77"

# RFC IPs
LOOPBACK="127.0.0.0/8" 
CLASS_A="10.0.0.0/8" 
CLASS_B="172.16.0.0/12" 
CLASS_C="192.168.0.0/16" 
CLASS_D_MULTICAST="224.0.0.0/4" 
CLASS_E_RESERVED_NET="240.0.0.0/5" 



### RULE #######################################################################

# ======================= SPOOFING ===============================
/sbin/iptables -A INPUT -i $EXTIF -s $EGO -j DROP
/sbin/iptables -A INPUT -i $EXTIF -s $CLASS_A -j DROP 
/sbin/iptables -A INPUT -i $EXTIF -s $CLASS_B -j DROP 
/sbin/iptables -A INPUT -i $EXTIF -s $CLASS_C -j DROP
/sbin/iptables -A INPUT -i $EXTIF -s $CLASS_D_MULTICAST -j DROP 
/sbin/iptables -A INPUT -i $EXTIF -s $CLASS_E_RESERVED_NET -j DROP 
/sbin/iptables -A INPUT -i $EXTIF -d $LOOPBACK -j DROP

# ======================= LOOP RULE =======================
/sbin/iptables -A INPUT -s $LOOPBACK -j ACCEPT
/sbin/iptables -A OUTPUT -d $LOOPBACK -j ACCEPT

# ====================== TRACEROUTE ==============================
/sbin/iptables -A OUTPUT -o $EXTIF -p udp --sport $TR_SRC_PORTS --dport $TR_DEST_PORTS \
 -m state --state NEW -j ACCEPT

# ======================= LAN IN OUT ================================
/sbin/iptables -A INPUT -i $INTIF -s $LANIN -j ACCEPT
/sbin/iptables -A OUTPUT -o $INTIF -d $LANIN -j ACCEPT
/sbin/iptables -A FORWARD -s $LANIN -d 0/0 -j ACCEPT
/sbin/iptables -A FORWARD -s 0/0 -d $LANIN -p tcp --syn -j DROP
/sbin/iptables -A FORWARD -s 0/0 -d $LANIN -j ACCEPT

# ======================= SERVICES ==========================
# DNS
/sbin/iptables -A INPUT -i $EXTIF -p udp -s $DNS1 --sport 53 -j ACCEPT
/sbin/iptables -A INPUT -i $EXTIF -p udp -s $DNS2 --sport 53 -j ACCEPT

# SSH
/sbin/iptables -A INPUT -s $TRUSTED -p TCP --dport 22 -j ACCEPT


# ====================== RULE ====================================
/sbin/iptables -A INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT 
/sbin/iptables -A OUTPUT -p tcp -m state --state NEW,ESTABLISHED -j ACCEPT 
/sbin/iptables -A INPUT -i $EXTIF -p udp -m state --state ESTABLISHED -j ACCEPT 
/sbin/iptables -A OUTPUT -p udp -m state --state NEW,ESTABLISHED -j ACCEPT 
/sbin/iptables -A INPUT -p icmp -m state --state ESTABLISHED,RELATED  -j ACCEPT 
/sbin/iptables -A OUTPUT -p icmp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

### POSTROUTING CHAIN ##########################################################

/sbin/iptables -t nat -A POSTROUTING -o $EXTIF -s $LANIN -j MASQUERADE

### VPN CHAIN ###########################################################

/sbin/iptables -A INPUT -s $USER  -p TCP --dport 1723 -j ACCEPT
/sbin/iptables -t nat -A PREROUTING -d $EGO -p tcp --dport 1723 -j DNAT --to-dest $VPNSERVER:1723
/sbin/iptables -t nat -A PREROUTING -d $EGO -p 47 -i eth1 -j DNAT --to-dest $VPNSERVER

### LOGGING ####################################################################
#/sbin/iptables -A INPUT -j LOG --log-prefix "DENY INPUT:"
#/sbin/iptables -A INPUT -i $EXTIF -m state --state NEW,INVALID -j DROP
#/sbin/iptables -A FORWARD -j LOG --log-prefix "DENY FW:"
#/sbin/iptables -A OUTPUT -j LOG --log-prefix "DENY OUT:"