All pastes #635762 Raw Edit

Someone

public text v1 · immutable
#635762 ·published 2007-07-27 11:02 UTC
rendered paste body
#!/bin/bash
#
# File: rc.firewall
# Author: Jacob Pipkin
#         <jacob@hivelocity.net>
#
# Date: Fri Apr 28 04:06:09 EDT 2006
# Pungenday, the 45th day of Discord in the YOLD 3172
# ... and updated some time later
#

### variable initialization

# I like to get the ip from ifconfig as it's distro-agnostic and
# connection-type-agnostic
#
if [[ `ifconfig | grep -A 1 eth | grep inet\ addr:` ]]; then
    EXT_IP=`ifconfig | grep -m 1 Bcast | awk '{ print $2 }' | sed s/addr://`
else
    EXT_IP=""
fi

if [[ `which iptables` ]]; then
    IPTABLES=`which iptables`
else
    echo "iptables userspace utility not found. breaking."
    exit 1
fi

# ethernet device
#
ETH="eth0"

# ssh variables
#
SSHD_PORT="22"
SSHD_LISTEN=$EXT_IP

# spoofed source ips and bad source and destination ip's
#
B0RKED_SRC="10.0.0.0/8 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/5 255.255.255.255 0.0.0.0/8 169.254.0.0/16 192.0.2.0/24"
B0RKED_DST="0.0.0.0"

# extra chains
#
EXT_CHAINS="drop-log-flags drop-log-spoof drop-log-b0rken drop-log-icmp"

### sane defaults
#
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/secure_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/ip_forward


case "$1" in

'start')

echo "bringing up firewall"

### initial setup

# default policies
#
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z

# loopback
#
$IPTABLES -A INPUT -i lo -j ACCEPT
$IPTABLES -A OUTPUT -o lo -j ACCEPT


# established, related connections
#
$IPTABLES -A INPUT -i $ETH -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -i $ETH -p udp -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPTABLES -A INPUT -i $ETH -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT

# create the extra chains
#
for i in $EXT_CHAINS; do
    $IPTABLES -N $i
done


### initial auto-drop-logs

# broadcast, multicast traffic
#
$IPTABLES -A INPUT -m pkttype --pkt-type broadcast -j DROP
$IPTABLES -A INPUT -m pkttype --pkt-type multicast -j DROP

# stealth scans
#
$IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE          -j drop-log-flags
$IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL           -j drop-log-flags
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN   -j drop-log-flags
$IPTABLES -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST   -j drop-log-flags
$IPTABLES -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST   -j drop-log-flags
$IPTABLES -A INPUT -p tcp --tcp-flags ACK,FIN FIN       -j drop-log-flags
$IPTABLES -A INPUT -p tcp --tcp-flags ACK,PSH PSH       -j drop-log-flags
$IPTABLES -A INPUT -p tcp --tcp-flags ACK,URG URG       -j drop-log-flags

# fragmented icmp traffic
#
$IPTABLES -A INPUT -i $ETH -p icmp -f -j drop-log-icmp

### more initial auto-drop-logs

# spoofs
#
$IPTABLES -A INPUT -i $ETH -s 127.0.0.0/8   -j drop-log-spoof
$IPTABLES -A INPUT -i $ETH -s $EXT_IP       -j drop-log-spoof

# other b0rked source addresses
#
for i in $B0RKED_SRC; do
    $IPTABLES -A INPUT -i $ETH -s $i -j drop-log-b0rken
done

# and b0rked destination addresses
#
for i in $B0RKED_DST; do
    $IPTABLES -A INPUT -i $ETH -d $i -j drop-log-b0rken
done

### other accepted connections

# http
#
$IPTABLES -A INPUT -i $ETH -p tcp --dport 80 -s 0/0 -d $EXT_IP -j ACCEPT
for i in $SSL_ALLOWED; do
    $IPTABLES -A INPUT -i $ETH -p tcp --dport 443 -s $i -d $EXT_IP -j ACCEPT
done

# ftp
#
#$IPTABLES -A INPUT -i $ETH -p tcp --dport 21 -s 0/0 -d $EXT_IP -j ACCEPT

# email
#
# $IPTABLES -A INPUT -i $ETH -p tcp --dport 143 -s 0/0 -d $EXT_IP -j ACCEPT

# ssh
#
$IPTABLES -A INPUT -i $ETH -p tcp --dport $SSHD_PORT -s 0/0 \
    -d $SSHD_LISTEN -j ACCEPT

# icmp type 8
$IPTABLES -A INPUT -i $ETH -p icmp --icmp-type 8 -m limit --limit 1/s -j ACCEPT

# drop-logs
#
$IPTABLES -A drop-log-flags -p tcp -j LOG --log-level info \
    --log-prefix "ipt/bad flags: " --log-ip-options --log-tcp-options \
    -m limit --limit 10/s
$IPTABLES -A drop-log-flags -j DROP

$IPTABLES -A drop-log-icmp -p tcp -j LOG --log-level info \
    --log-prefix "ipt/fragged ICMP: " --log-ip-options -m limit --limit 10/s
$IPTABLES -A drop-log-icmp -j DROP

$IPTABLES -A drop-log-spoof -p tcp -j LOG --log-level info \
    --log-prefix "ipt/spoof: " -m limit --limit 10/s
$IPTABLES -A drop-log-spoof -j DROP

$IPTABLES -A drop-log-b0rken -p tcp -j LOG --log-level info \
    --log-prefix "ipt/b0rken: " -m limit --limit 10/s
$IPTABLES -A drop-log-b0rken -j DROP


### final drop-logs
# $IPTABLES -A INPUT -i $ETH -j LOG --log-level info \
#    --log-prefix "firewall/wtf: " -m limit --limit 1/s


;;


'stop')

echo "dropping firewall"
$IPTABLES -P INPUT ACCEPT
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD ACCEPT
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z

;;


'restart')

$0 stop
$0 start

;;


'panic')

echo "panic button pressed, connection going away"
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT DROP
$IPTABLES -P FORWARD DROP
$IPTABLES -F
$IPTABLES -X
$IPTABLES -Z

;;


*)

echo "USAGE: " $0 " start|stop|restart|panic"
esac