From: Jeff Bonner <lunar@comcast.net>
To: netfilter@lists.samba.org
Subject: Please critique my iptables script
Date: Sun, 02 Jun 2002 23:43:50 -0400 [thread overview]
Message-ID: <3CFAE5F6.7070201@comcast.net> (raw)
[-- Attachment #1: Type: text/plain, Size: 862 bytes --]
Greetings,
After reading all the documentation I could find (and understand), and
viewing numerous examples, I have begun to write my own iptables script.
I chose not to use something like ShoreWall, because I wanted to
understand what was going on, and keep it as simple as possible.
Since I had only limited experience with ipchains before this, and I'm a
newbie at Linux in general, I don't know if there are any glaring holes
or omissions in the script, or if things could be done more "cleanly",
etc. I would like to solicit any constructive criticism, comments or
suggestions that may be appropriate.
The script can be viewed at http://firegate.lunarfox.com and is also
attached to this mail. I have placed comments throughout, to explain
what I'm trying to do, and also to ask questions in certain places.
Thanks in advance,
Jeff Bonner
[-- Attachment #2: firewall.040 --]
[-- Type: text/plain, Size: 6682 bytes --]
#!/bin/bash
# Program Name = FireGate
# Intended Use = An IPTABLES firewall ruleset and NAT gateway
# Revision Num = 0.40
# Created File = 20 Jan 2002
# Last Updated = 01 Jun 2002
#
# Copyright 2002 Jeff Bonner (lunar@xrs.net, http://www.lunarfox.com)
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License,
# Version 2, as published by the Free Software Foundation (for
# complete text, see http://www.gnu.org/copyleft/gpl.html).
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTIBILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
echo -e -n "\nStarting FireGate v0.40... "
# Basic Variables;
#
IPT="/sbin/iptables" # Where is IPTABLES
EVIL="24.0.0.203" # Blacklisted IPs
DHCP="172.30.166.36" # DHCP server IP
DNS="68.60.32.5 206.141.251.2" # DNS server IP
# SYSCTL DoS Prevention, etc;
# Definitions at http://www.linuxdoc.org/HOWTO/Adv-Routing-HOWTO-13.html
#
echo 1 > /proc/sys/net/ipv4/ip_forward # Enable masq below
echo 1 > /proc/sys/net/ipv4/ip_dynaddr # Rebound to new addr
echo 1 > /proc/sys/net/ipv4/tcp_syncookies # No TCP SYN overload
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # No Smurf amplifying
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians # Spoof/route/redirect
echo 0 > /proc/sys/net/ipv4/tcp_timestamps # Uptime/Gigabit ether
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects # No route altering
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
for r in /proc/sys/net/ipv4/conf/*/rp_filter; do # Impossible addresses;
echo 1 > $r # can "2" be used here
done # for full reversepath?
# Performance Tuning;
# What are appropriate values to change here, if any, for 2.4.x?
#
# echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout # Reduce dead sockets?
# echo 180 > /proc/sys/net/ipv4/tcp_keepalive_intvl # Is this even needed?
# Erase Previous Rules, Define Policy;
#
$IPT -F # Flush built-in rules
$IPT -X # Erase custom rules
$IPT -Z # Zero all counters
$IPT -F -t nat # Flush pre/postrouting
$IPT -P INPUT DROP #
$IPT -P OUTPUT ACCEPT # Set default policies
$IPT -P FORWARD DROP #
$IPT -A INPUT -i lo -j ACCEPT # Loopback traffic OK
$IPT -A INPUT -i eth0 -s 10.0.0.0/8 -j DROP #
$IPT -A INPUT -i eth0 -s 172.16.0.0/12 -j DROP #
$IPT -A INPUT -i eth0 -s 192.168.0.0/16 -j DROP # Toss any private
$IPT -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP # addresses coming in
$IPT -A INPUT -i eth0 -s 169.254.0.0/16 -j DROP # from ext interface
$IPT -A INPUT -i eth0 -s 224.0.0.0/4 -j DROP #
$IPT -A INPUT -i eth0 -s 240.0.0.0/5 -j DROP #
$IPT -A INPUT -s 255.255.255.255 -d 0/0 -j DROP # No bogus routing
for e in $EVIL; do #
$IPT -A INPUT -s $e -j DROP # Drop blacklist sites
done #
# Toss any inbound
$IPT -A INPUT -p udp --sport 137:139 -j DROP # ... SMB
$IPT -A INPUT -p tcp --dport 80 -j DROP # ... HTTP
$IPT -A INPUT -p tcp --dport 22:23 -j DROP # ... Telnet/SSH
$IPT -A INPUT -p tcp --dport 1214 -j DROP # ... KaZaA
# Redirect ports for ReAIM proxy;
#
iptables -t nat -A PREROUTING -i eth0 -p tcp \
--dport 5190 -j REDIRECT --to-ports 5190 # AIM/ICQ Clients
iptables -t nat -A PREROUTING -i eth0 -p tcp \
--dport 1863 -j REDIRECT --to-ports 1863 # MSN Clients
# Port Scanners, etc;
# Is this effective (or even necessary)?
#
$IPT -N SCAN
$IPT -A INPUT -i eth0 -p tcp --tcp-flags SYN,ACK,FIN,RST RST -j SCAN
$IPT -A SCAN -m limit --limit 1/s -j LOG --log-level info \
--log-prefix "**PORTSCAN** "
$IPT -A SCAN -j DROP
# Fragmented Packets;
# How often are these seen? Are they mostly hostile? What do they break?
#
$IPT -A INPUT -i eth0 -f -j LOG -m limit --limit 1/s \
--log-level info --log-prefix "**FRAGMENT** "
$IPT -A INPUT -i eth0 -f -j DROP
# Hostile TCP Flags;
#
$IPT -N FLAGS
$IPT -A INPUT -p tcp --tcp-flags ALL FIN,URG,PSH -j FLAGS
$IPT -A INPUT -p tcp --tcp-flags ALL ALL -j FLAGS
$IPT -A INPUT -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j FLAGS
$IPT -A INPUT -p tcp --tcp-flags ALL NONE -j FLAGS
$IPT -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j FLAGS
$IPT -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j FLAGS
$IPT -A FLAGS -m limit --limit 60/minute -j LOG \
--log-level info --log-prefix "**BADFLAGS** "
$IPT -A FLAGS -j DROP
# Miscellaneous Stuff;
#
$IPT -A INPUT -i eth0 -p tcp ! --syn -m state \
--state NEW -j DROP # New TCP must be SYN
$IPT -A INPUT -p tcp --dport 113 -j REJECT \
--reject-with tcp-reset # Handle auth/ident
$IPT -A INPUT -p udp -s $DHCP --sport 67 -d 0/0 \
--dport 68 -j ACCEPT # Let firewall get IP
# Allow authorized DNS servers;
#
for d in $DNS; do
$IPT -A INPUT -p udp -s $d --sport 53 -d 0/0 \
-j ACCEPT
done
# Blocked Outbound Trojan, Etc ports;
#
$IPT -N STOPOUT
$IPT -A OUTPUT -p tcp --dport 137:139 -j STOPOUT # SMB
$IPT -A OUTPUT -p tcp --dport 31335:31337 -j STOPOUT # Trinoo
$IPT -A OUTPUT -p tcp --dport 27444 -j STOPOUT # Trinoo Slave
$IPT -A OUTPUT -p tcp --dport 27655 -j STOPOUT # Trinoo Master
$IPT -A STOPOUT -m limit --limit 1/s -j LOG \
--log-level info --log-prefix "**OUTBOUND** " # Log these attempts
$IPT -A STOPOUT -j DROP # then drop packets
# ICMP Control;
# Are these the only 'proper' ones to allow?
#
$IPT -A INPUT -p icmp --icmp-type 0 -s 0/0 -j ACCEPT # ICMP echo reply
$IPT -A INPUT -p icmp --icmp-type 3 -s 0/0 -j ACCEPT # ICMP dest-unreach
$IPT -A INPUT -p icmp --icmp-type 11 -s 0/0 -j ACCEPT # ICMP time-exceeded
$IPT -A INPUT -p icmp -j LOG -m limit --limit 30/minute \
--log-level info --log-prefix "**ICMP DROP** " # Log anything denied
$IPT -A INPUT -p icmp -j DROP # Drop failed packets
# Open IM File Xfer, Direct Connect for ReAIM;
#
$IPT -A INPUT -p tcp --dport 5190 -j ACCEPT # AOL/ICQ Client
$IPT -A INPUT -p tcp --dport 1863 -j ACCEPT # MSN IM Client
# Main Ruleset;
#
$IPT -N TRAFFIC
$IPT -A TRAFFIC -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A TRAFFIC -m state --state NEW -i ! eth0 -j ACCEPT
$IPT -A TRAFFIC -j LOG -m limit --limit 60/minute \
--log-level info --log-prefix "**PACKET DROP** " # Log anything denied
$IPT -A TRAFFIC -j DROP # Drop failed packets
$IPT -A FORWARD -j TRAFFIC # Send FORWARD to above
$IPT -A INPUT -j TRAFFIC # Send INPUT to above
# Enable NAT/Masquerading;
# Should this be located earlier in the script?
#
$IPT -t nat -A POSTROUTING -o eth0 -j MASQUERADE # Enable sNAT
echo -e "DONE.\n"
reply other threads:[~2002-06-03 3:43 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=3CFAE5F6.7070201@comcast.net \
--to=lunar@comcast.net \
--cc=netfilter@lists.samba.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox