Setup Iptables Firewall
How to use iptables to create a simple firewall and allow traffic to private services only for trusted interfaces
Copy this script to /etc/init.d/firewall
:
#!/bin/sh iptables=`which iptables` case "$1" in start) echo "Starting Firewall..." # clear old rules $iptables -t nat -F $iptables -t filter -F $iptables -X # default policy $iptables -P INPUT DROP $iptables -P FORWARD DROP $iptables -P OUTPUT ACCEPT # chain to mark IP as attacker $iptables -N ATTACK $iptables -A ATTACK -j LOG --log-prefix "Attack detected: " $iptables -A ATTACK -m recent --set -j DROP # allow all from trusted interfaces $iptables -A INPUT -i lo -j ACCEPT $iptables -A INPUT -i tun0 -j ACCEPT $iptables -A FORWARD -i lo -j ACCEPT $iptables -A FORWARD -i tun0 -j ACCEPT # filter attackers for 10 seconds but keep existing connections $iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #$iptables -A INPUT -m recent --update --seconds 10 -j DROP $iptables -A INPUT -m state --state INVALID -j ATTACK # drop NetBIOS quietly $iptables -A INPUT -p tcp --dport 137 -j DROP $iptables -A INPUT -p udp --dport 137 -j DROP $iptables -A INPUT -p tcp --dport 138 -j DROP $iptables -A INPUT -p udp --dport 138 -j DROP $iptables -A INPUT -p tcp --dport 445 -j DROP $iptables -A INPUT -p udp --dport 445 -j DROP # input filters with rate limits $iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 3 -j ACCEPT $iptables -A INPUT -p tcp --dport 22 -m limit --limit 1/s --limit-burst 3 -j ACCEPT $iptables -A INPUT -p tcp --dport 80 -m limit --limit 5/s --limit-burst 10 -j ACCEPT $iptables -A INPUT -p tcp --dport 143 -m limit --limit 1/s --limit-burst 3 -j ACCEPT $iptables -A INPUT -p tcp --dport 443 -m limit --limit 5/s --limit-burst 10 -j ACCEPT $iptables -A INPUT -p tcp --dport 587 -m limit --limit 1/s --limit-burst 3 -j ACCEPT $iptables -A INPUT -p tcp --dport 10654 -m limit --limit 1/s --limit-burst 3 -j ACCEPT $iptables -A INPUT -p udp --dport 10654 -m limit --limit 1/s --limit-burst 3 -j ACCEPT # mark IP with invalid packet as attacker $iptables -A INPUT -m recent --set -j ATTACK ;; stop) echo "Stopping Firewall..." $iptables -t nat -F $iptables -t filter -F $iptables -X $iptables -P INPUT ACCEPT $iptables -P OUTPUT ACCEPT $iptables -P FORWARD ACCEPT ;; restart|reload|force-reload) $0 stop $0 start ;; *) echo "Usage: /etc/init.d/firewall (start|stop)" exit 1 ;; esac exit 0