Skip to content

Instantly share code, notes, and snippets.

@cwade12c
Created December 11, 2013 06:31
Show Gist options
  • Save cwade12c/7905917 to your computer and use it in GitHub Desktop.
Save cwade12c/7905917 to your computer and use it in GitHub Desktop.
iptables server firewall sh script
#opensource, by cwade12c, probably needs improvement
ipt='sudo /sbin/iptables'
ssh=1012
http=80
https=443
external='1.2.3.4'
lan='192.168.1.0/24'
#kernel tweaks
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
#Flush rules
$ipt -F INPUT
$ipt -F OUTPUT
$ipt -F FORWARD
#Create custom ENFORCE,LOGDROP chain
$ipt -N ENFORCE
$ipt -N LOGDROP
#Setup LOGDROP
$ipt -A LOGDROP -j LOG
$ipt -A LOGDROP -j DROP
#Allow loopback
$ipt -A INPUT -i lo -j ACCEPT
$ipt -A OUTPUT -o lo -j ACCEPT
#Block any attempt to spoof the loopback
$ipt -A INPUT -s 127.0.0.1/8 -j DROP
$ipt -A INPUT -d 127.0.0.1/8 -j DROP
#Allow safe existing connections
$ipt -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$ipt -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
#DROP INVALID packets
$ipt -A INPUT -m state --state INVALID -j DROP
$ipt -A OUTPUT -m state --state INVALID -j DROP
$ipt -A FORWARD -m state --state INVALID -j DROP
#Ensure tcp connections use SYNchronize flag
$ipt -A INPUT -p tcp -m tcp ! --syn -m state --state NEW -j DROP
#Service Exceptions
$ipt -A INPUT -p tcp -s $external -m multiport --dports $ssh,$http,$https -j ACCEPT
$ipt -A INPUT -p tcp -s $lan -m multiport --dports $ssh,$http,$https -j ACCEPT
#DROP ICMP echo/echo-request
$ipt -A INPUT -p icmp --icmp-type 0 -j DROP
$ipt -A INPUT -p icmp --icmp-type 8 -j DROP
#Jump incoming to ENFORCE
$ipt -A INPUT -j ENFORCE
#Setup ENFORCE filtering
$ipt -A ENFORCE -p tcp -m tcp --syn -m limit --limit 1/s --limit-burst 4 -j RETURN
$ipt -A ENFORCE -f -j DROP
$ipt -A ENFORCE -p tcp --tcp-flags ALL ALL -j DROP
$ipt -A ENFORCE -p tcp --tcp-flags ALL NONE -j DROP
$ipt -A ENFORCE -p tcp --tcp-flags FIN,ACK FIN -j DROP
$ipt -A ENFORCE -p tcp --tcp-flags ACK,PSH PSH -j DROP
$ipt -A ENFORCE -p tcp --tcp-flags ACK,URG URG -j DROP
$ipt -A ENFORCE -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
$ipt -A ENFORCE -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
$ipt -A ENFORCE -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
$ipt -A ENFORCE -p tcp --tcp-flags ALL FIN -j DROP
$ipt -A ENFORCE -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
#Brute/DoS
$ipt -A INPUT -p tcp --dport $ssh -m state --state NEW -m recent --set
$ipt -A INPUT -p tcp --dport $ssh -m state --state NEW -m recent --update --seconds 20 --hitcount 5 -j LOGDROP
$ipt -A INPUT -p tcp -m state --state NEW -m limit --limit 30/minute --limit-burst 5 -j ACCEPT
#Deny everything else
$ipt -A INPUT -p tcp -j DROP
$ipt -A OUTPUT -p tcp -j DROP
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment