IPtables is nochtans een krachtig ding, al moet ik er ook nog veel over leren.
Een tijd geleden heb ik dit IPtables scriptje in elkaar gezet. De bedoeling was om alles van buiten naar binnen te blokkeren en het LAN beperkte toegang te geven op het WAN. Omdat ik ook gebruik maakte van een Squid proxy op diezelfde server moest ik alles wat van het LAN op poort 80 binnenkwam redirecten naar de poort van Squid 3128 (prerouting). Daarna moest er nog natting volgen (postrouting).
Ik heb nu geen tijd om het volledig opnieuw door te spitten, maar het kan je misschien op weg helpen moest je nog zinnes zijn om toch IPtables te proberen.
#!/bin/bash
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# #
# IPtables server.ubuntu.lan v2 #
# maart 2009 #
# #
#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#-#
# De opdracht van dit script is om de IPtables te genereren wanneer de server gestart wordt.
# Plaats daarom een vermelding in /etc/rc.local (Ubuntu).
#
# De IPtables zorgen ervoor dat de server als router kan optreden.
# De zelfgemaakte chain "INFWD" vangt alle pakketjes op die richting de INPUT en FORWARD chain gezonden worden.
# Op deze pakketjes worden vervolgens de regels in dit script toegepast.
################################################################################
# Basisch configuratie
echo "#####################################################"
echo "Firewall regels laden ......................... START"
# IPtables binary
IPT="/sbin/iptables"
# Externe interface (WAN kant)
EXTIF="eth0"
# Interne interface (LAN kant)
INTIF="eth1"
# Iedereen in het WAN, de wereld
UNIVERSE="0/0"
# Eigen LAN netwerk
LAN="192.168.0.0/0"
# IP adres van localhost
LOOPBACK="127.0.0.1"
# Klasse A prive netwerk
CLASS_A="10.0.0.0/8"
# Klasse B prive netwerk
CLASS_B="172.16.0.0/12"
# Klasse C prive netwerk
CLASS_C="192.168.0.0/24"
################################################################################
# Alle tabellen ledigen
$IPT -F
$IPT -X
$IPT -Z
$IPT -t nat -F
$IPT -t nat -X
$IPT -t nat -Z
# Ook ons eigen gemaakt chain "INFWD" (zie verder) ledigen
if [ "`$IPT -L | grep INFWD`" ]; then
$IPT -F INFWD
fi
# Modules laden
modprobe ip_conntrack
modprobe ip_conntrack_ftp ports=21,2121
modprobe ip_nat_ftp ports=21,2121
# IP doorverwijzing toestaan
echo 1 > /proc/sys/net/ipv4/ip_forward
echo "Alle tabellen ledigen ............................ OK"
################################################################################
# Enkele veiligheden
# IP-spoofing beveiliging inschakelen
for f in /proc/sys/net/ipv4/conf/*/rp_filter ; do
echo 1 > $f
done
# ICMP redirect acceptatie uitschakelen
for f in /proc/sys/net/ipv4/conf/*/accept_redirects ; do
echo 0 > $f
done
# ICMP send_redirects uitschakelen
for f in /proc/sys/net/ipv4/conf/*/send_redirects ; do
echo 0 > $f
done
# Source routed pakketten niet accepteren
for f in /proc/sys/net/ipv4/conf/*/accept_source_route ; do
echo 0 > $f
done
# Log spoofed pakketten, source routed pakketten en redirected pakketten#
for f in /proc/sys/net/ipv4/conf/*/log_martians ; do
echo 1 > $f
done
# TCP SYN cookie beveiliging inschakelen
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# ICMP broadcasting protection inschakelen
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
# ICMP dead error message protection inschakelen
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
# Dynamische TCP/IP address hacking inschakelen
echo 1 > /proc/sys/net/ipv4/ip_dynaddr
echo "Veiligheden activeren ............................ OK"
################################################################################
# Sommige pakketten resoluut weigeren
## Weiger (en log) alle gefragmenteerde pakketten
$IPT -A INPUT -i $EXTIF -f -j LOG --log-prefix "FRAGMENT! "
$IPT -A INPUT -i $EXTIF -f -j DROP
## Weiger (en log) alles van privenetwerken op externe iface
$IPT -A INPUT -i $EXTIF -s $LOOPBACK -j LOG --log-prefix "SPOOFING! "
$IPT -A INPUT -i $EXTIF -s $CLASS_A -j LOG --log-prefix "CLASS A ADDRESS! "
$IPT -A INPUT -i $EXTIF -s $CLASS_B -j LOG --log-prefix "CLASS B ADDRESS! "
$IPT -A INPUT -i $EXTIF -s $CLASS_C -j LOG --log-prefix "CLASS C ADDRESS! "
$IPT -A INPUT -i $EXTIF -s $LOOPBACK -j DROP
$IPT -A INPUT -i $EXTIF -s $CLASS_A -j DROP
$IPT -A INPUT -i $EXTIF -s $CLASS_B -j DROP
$IPT -A INPUT -i $EXTIF -s $CLASS_C -j DROP
echo "Private netwerken op EXTIF weigeren .............. OK"
################################################################################
# Uiteindelijke regels
# Standaard gaan we alles DROPPEN
$IPT -P INPUT DROP
$IPT -P FORWARD DROP
# Alles van de loopback interface toestaan.
$IPT -A INPUT -i lo -j ACCEPT
$IPT -A OUTPUT -o lo -j ACCEPT
# Prioriteiten instellen
$IPT -t mangle -A FORWARD -p tcp --dport 80 -j TOS --set-tos 16
$IPT -t mangle -A FORWARD -p tcp --dport 22 -j TOS --set-tos 8
$IPT -t mangle -A FORWARD -p tcp --dport 21 -j TOS --set-tos 2
# Een nieuwe chain aanmaken. Deze chain zal (straks) de regels van zowel INPUT als FORWARD bevatten.
# We zetten groeperen die regels in dit ene chain zodat we ze niet twee keer moeten aanmaken.
$IPT -N INFWD
# Paketjes van een bestaande verbinding worden geaccepteerd
$IPT -A INFWD -m state --state ESTABLISHED,RELATED -j ACCEPT
# Onderstaande regel uncommenten om ALLE (!) verbindingen van het LAN naar het WAN toe te staan
#$IPT -A INFWD -m state --state NEW -i ! $EXTIF -j ACCEPT
# Ping
$IPT -A INFWD -m state --state NEW -p icmp -s $LAN -j ACCEPT
# SSH en Telnet
$IPT -A INFWD -m state --state NEW -p tcp --dport 22 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp --dport 23 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 9999 -j ACCEPT
# DNS
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 53 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p udp -s $LAN --dport 53 -j ACCEPT
# HTTP + HTTPS + Squid
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 80 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 8081 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 443 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 81 -j ACCEPT # Eigen HTTP server
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 3128 -j ACCEPT # Eigen cache proxy Squid
# FTP
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 20 -j ACCEPT # Data
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 21 -j ACCEPT # Control
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 23 -j ACCEPT # Eigen FTP server vsftp
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 2121 -j ACCEPT # Eigen cache FTP server Frox
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 35000:60000 -j ACCEPT # Passieve poorten voor eigen FTP server vsftp
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 989 -j ACCEPT # FTPS data
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 990 -j ACCEPT # FTPS Control
# MAIL
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 587 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 587 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 465 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 110 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 995 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 143 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 993 -j ACCEPT
# Chat
$IPT -A INFWD -m state --state NEW -p udp -s $LAN --dport 1863 -j ACCEPT # MSN
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 1863 -j ACCEPT # MSN
$IPT -A INFWD -m state --state NEW -p udp -s $LAN --dport 5190 -j ACCEPT # MSN
$IPT -A INFWD -m state --state NEW -p udp -s $LAN --dport 6901 -j ACCEPT # MSN
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 6901 -j ACCEPT # MSN
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 1503 -j ACCEPT # MSN Whiteboard and Application Sharing
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 7801:7825 -j ACCEPT # MSN File transfer
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 6891:6900 -j ACCEPT # MSN File transfer
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 531 -j ACCEPT # AOL Instant Messenger, IRC
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 5050 -j ACCEPT # Yahoo! Messenger
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 5190 -j ACCEPT # ICQ en AOL Instant Messenger
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 6660:6664 -j ACCEPT # IRC
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 6665:6669 -j ACCEPT # IRC
# NTP
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 123 -j ACCEPT
# SMB
$IPT -A INFWD -m state --state NEW -p udp -s $LAN --dport 137 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p udp -s $LAN --dport 138 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 139 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p udp -s $LAN --dport 445 -j ACCEPT
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 901 -j ACCEPT # SWAT
# Controle panelen
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 2222 -j ACCEPT # DirectAdmin
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 2082 -j ACCEPT # Cpanel
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN --dport 2083 -j ACCEPT # Cpanel SSL
# Enkel intern
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN -d $LAN --dport 5500 -j ACCEPT # VNC
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN -d $LAN --dport 5800 -j ACCEPT # VNC over HTTP
$IPT -A INFWD -m state --state NEW -p tcp -s $LAN -d $LAN --dport 5900 -j ACCEPT # VNC
$IPT -A INFWD -m state --state NEW -p udp -s $LAN -d $LAN --dport 5900 -j ACCEPT # VNC
# ----------
# Alle andere poorten van ons zelfgemaakte chain DROPPEN
$IPT -A INFWD -j DROP
# Alle paketjes voor INPUT of FORWARD gaan we doorsturen naar ons eigen chain
$IPT -A INPUT -j INFWD
$IPT -A FORWARD -j INFWD
echo "Regels laden ..................................... OK"
################################################################################
# PREROUTING
# 1. Squid HTTP cache-proxy
# Trafiek voor de lokale website toestaan richting poort 81 (zie /etc/apache2/ports.conf)
$IPT -t nat -A PREROUTING -s $LAN -d 192.168.2.1 -p tcp --dport 80 -j REDIRECT --to-port 81
# Alle ander HTTP verkeer doorsturen naar Squid, om vervolgens naar buiten te gaan
$IPT -t nat -A PREROUTING -s $LAN -m state --state NEW -p tcp --dport 80 -j REDIRECT --to-port 3128
# 2. Frox FTP cache-proxy
# Trafiek voor de lokale FTP server toestaan richting poort 23 (zie /etc/vsftpd.conf)
#$IPT -t nat -A PREROUTING -s $LAN -d 192.168.2.1 -p tcp --dport 21 -j REDIRECT --to-port 23
# Alle ander FTP verkeer doorsturen naar Frox, om vervolgens naar buiten te gaan
#$IPT -t nat -A PREROUTING -s $LAN -m state --state NEW -p tcp --dport 21 -j REDIRECT --to-port 2121
echo "Prerouting laden ................................. OK"
################################################################################
# POSTROUTING
# Geef systemen binnen het LAN het IP van de externe interface om naar het WAN te gaan, principe van NAT
$IPT -t nat -A POSTROUTING -o $EXTIF -j MASQUERADE
echo "Postrouting laden ................................ OK"
echo "Firewall regels laden ......................... EINDE"
echo "#####################################################"