So far so good, but you can be using --sport too to only allow connections from priveleged ports, and I olso played with something like this /sbin/iptables -I INPUT -i eth0 -p tcp --tcp-flags ACK ACK --dport 80 \ -m string --string 'cmd.exe' -j REJECT --reject-with tcp-reset and add it permanent for a few days as well as for root.exe, but it looks good so far!!!
Regards, Lavinius Romio Petru Network Administrator www.rom-tech.net [EMAIL PROTECTED] -----Original Message----- From: [EMAIL PROTECTED] [mailto:[EMAIL PROTECTED]] On Behalf Of Douglas J Hunley Sent: Saturday, 12 January 2002 5:49 AM To: [EMAIL PROTECTED] Subject: opinions on this iptables script just wondering if all the gurus could comment on this script (below) before we move it into production. seems to work nicely on test box. thanks. *-*-*-*-* #!/bin/bash # set to location of iptables IPTABLES="/sbin/iptables" # TCP ports to allow TCP_ALLOW="22 25 53 79 80 113 119 617 873" # UDP ports to allow (ports 6112, 6119, and 4000?) UDP_ALLOW="53 68 79 113 617 873" # Internet interface INET_IFACE="eth0" # LAN interface LAN_IFACE="eth1" # LAN Addresses INTERNAL_LAN="192.168.1.0/24" # Addresses to be MASQ'd (overridden by MAC_MASQ) MASQ_LAN="192.168.1.0/24" # Addresses that need static NAT SNAT_LAN="" # Default action of packets we don't want # DROP # REJECT # TREJECT (Reject with tcp-reset for TCP) # LDROP (log and drop) # LREJECT (log and reject) # LTREJECT (log and reject with tcp-reset) # ULDROP (ULOG and DROP) DROP="TREJECT" # Internet hosts that should be completely denied (inbound) DENY_ALL="" # Host/Port to deny TCP (format is IP>PORT) DENY_HOSTWISE_TCP="" # Host/Port to deny UDP (format is IP>PORT) DENY_HOSTWISE_UDP="" # People you dont want *any* communiction with (in or out) BLACKHOLE="" # What to do for the blackholed people BLACKHOLE_DROP="DROP" # Internet hosts that should have full access (inbound) ALLOW_ALL="" # Host/Port to allow TCP (format it IP>PORT) ALLOW_HOSTWISE_TCP="192.168.1.11>110" # Host/Port to allow UDP (format is IP/PORT) ALLOW_HOSTWISE_UDP="" # TCP ports to forward (format is SPORT:DPORT>IP) TCP_FW="" # UDP ports to forward (format is SPORT:DPORT>IP) UDP_FW="" # TOS optimizations on or off MANGLE_TOS_OPTIMIZE="TRUE" # Enable the firewall ? (Y/N) ENABLE="Y" # Flooding control # Logging limit LOG_FLOOD="2/s" # Global SYN packet limit SYN_FLOOD="20/s" # Global ICMP echo-reply limit PING_FLOOD="1/s" # Flooding control end # LAN hosts to be forwarded out on TCP ALLOW_OUT_TCP="" # Below here is experimental # Mac addresses of those permitted to do MASQ (blank turns off) MAC_MASQ="" # Mac addresses of those permitted to do SNAT (format MAC:external IP) MAC_SNAT="" # number of hops on LAN (needs netfilter patch) TTL_SAFE="" # Use TCP Syncookies USE_SYNCOOKIES="TRUE" # Use rp_filter on interfaces RP_FILTER="TRUE" # Use source-routing ACCEPT_SOURCE_ROUTE="FALSE" # Proxy address (format host:port) PROXY="" # Running a DHCP server for LAN? (if so, needs LAN_IFACE) DHCP_SERVER="TRUE" # ICMP message types to disallow from Internet BAD_ICMP="5 9 10 15 16 17 18" # ALPHA code .. don't use DMZ_IFACE="" # ----------------------------------------------------------------------| # These control basic script behavior, there should be no need to | # change any of these settings for normal use. | # ----------------------------------------------------------------------| FILTER_CHAINS="INETIN INETOUT DMZIN DMZOUT TCPACCEPT UDPACCEPT LDROP LREJECT TREJECT LTREJECT" UL_FILTER_CHAINS="ULDROP ULREJECT ULTREJECT" LOOP_IFACE="lo" # ----------------------------------------------------------------------| # Main Script Starts | # ----------------------------------------------------------------------| case $1 in start) # Let's load it! echo "Loading iptables firewall:" # Configuration Sanity Checks echo -n "Checking configuration..." # It's hard to run an iptables script without iptables... if ! [ -x $IPTABLES ] ; then echo echo "ERROR IN CONFIGURATION: ${IPTABLES} doesn't exist or isn't executable!" exit 1 fi # Basic interface sanity if [ "$DMZ_IFACE" = "$LAN_IFACE" ] && [ "$LAN_IFACE" != "" ]; then echo echo "ERROR IN CONFIGURATION: DMZ_IFACE and LAN_IFACE can't be the same!" exit 1 fi # Create a test chain to work with for system ablilities testing ${IPTABLES} -N SYSTEST # Check for ULOG support ${IPTABLES} -A SYSTEST -j ULOG > /dev/null 2>&1 if [ "$?" = "0" ] ; then HAVE_ULOG="true" else HAVE_ULOG="false" fi # Check for stateful matching ${IPTABLES} -A SYSTEST -m state --state ESTABLISHED -j ACCEPT > /dev/null 2>&1 if [ "$?" != "0" ] ; then echo echo "Your kernel lacks stateful matching, this would break this script. Aborting." exit 3 fi # Check DROP sanity if [ "$DROP" = "" ] ; then echo echo "There needs to be a DROP policy (try TREJECT)!" exit 1 fi if [ "$DROP" = "ACCEPT" ] ; then echo echo "The DROP policy is set to ACCEPT; there is no point in loading the firewall as there wouldn't be one." exit 2 fi if [ "$DROP" = "ULDROP" ] || [ "$DROP" = "ULREJECT" ] || [ "$DROP" = "ULTREJECT" ] ; then if [ "$HAVE_ULOG" != "true" ] ; then echo echo "You have selected a ULOG policy, but your system lacks ULOG support." echo "Please choose a policy that your system has support for." exit 3 fi fi # Problems with blackholes? if [ "$BLACKHOLE" != "" ] && [ "$BLACKHOLE_DROP" = "" ] ; then echo echo "You can't use blackholes and not have a policy for them!" exit 1 fi # Has it been configured? if ! [ "$ENABLE" = "Y" ] ; then echo echo "You need to edit your configuration and set ENABLE to Y!" exit 99 fi # Flush and remove the chain SYSTEST ${IPTABLES} -F SYSTEST ${IPTABLES} -X SYSTEST # Seems ok... echo "passed" # =============================================== # -------Set some Kernel stuff via SysCTL-------- # =============================================== # Turn on IP forwarding if [ "$INTERNAL_LAN" != "" ] ; then echo -n "Checking IP Forwarding..." if [ -e /proc/sys/net/ipv4/ip_forward ] ; then echo 1 > /proc/sys/net/ipv4/ip_forward echo "enabled." else echo "support not found! This will cause problems if you need to do any routing." fi fi # Enable TCP Syncookies echo -n "Checking IP SynCookies..." if [ -e /proc/sys/net/ipv4/tcp_syncookies ] ; then if [ "$USE_SYNCOOKIES" = "TRUE" ] ; then echo 1 > /proc/sys/net/ipv4/tcp_syncookies echo "enabled." else echo 0 > /proc/sys/net/ipv4/tcp_syncookies echo "disabled." fi else echo "support not found, but that's OK." fi # Enable Route Verification to prevent martians and other such crud that # seems to be commonplace on the internet today echo -n "Checking Route Verification..." if [ "$INET_IFACE" != "" ] ; then if [ -e /proc/sys/net/ipv4/conf/$INET_IFACE/rp_filter ] ; then if [ "$RP_FILTER" = "TRUE" ] ; then echo 1 > /proc/sys/net/ipv4/conf/$INET_IFACE/rp_filter echo -n "activated:${INET_IFACE} " else echo 0 > /proc/sys/net/ipv4/conf/$INET_IFACE/rp_filter echo -n "disabled:${INET_IFACE} " fi else echo "not found:${INET_IFACE} " fi fi if [ "$LAN_IFACE" != "" ] ; then if [ -e /proc/sys/net/ipv4/conf/$LAN_IFACE/rp_filter ] ; then if [ "$RP_FILTER" = "TRUE" ] ; then echo 1 > /proc/sys/net/ipv4/conf/$LAN_IFACE/rp_filter echo -n "activated:${LAN_IFACE} " else echo 0 > /proc/sys/net/ipv4/conf/$LAN_IFACE/rp_filter echo -n "disabled:${LAN_IFACE} " fi else echo "not found:${LAN_IFACE} " fi fi if [ "$DMZ_IFACE" != "" ] ; then if [ -e /proc/sys/net/ipv4/conf/$DMZ_IFACE/rp_filter ] ; then if [ "$RP_FILTER" = "TRUE" ] ; then echo 1 > /proc/sys/net/ipv4/conf/$DMZ_IFACE/rp_filter echo -n "activated:${DMZ_IFACE} " else echo 0 > /proc/sys/net/ipv4/conf/$DMZ_IFACE/rp_filter echo -n "disabled:${DMZ_IFACE} " fi else echo "not found:${DMZ_IFACE} " fi fi echo # Tell the Kernel to Ignore Source Routed Packets echo -n "Refusing SSR Packets via SysCtl..." if [ "$INET_IFACE" != "" ] ; then if [ -e /proc/sys/net/ipv4/conf/$INET_IFACE/accept_source_route ] ; then if [ "$ACCEPT_SOURCE_ROUTE" = "TRUE" ] ; then echo "1" > /proc/sys/net/ipv4/conf/$INET_IFACE/accept_source_route echo -n "disabled:${INET_IFACE} " else echo "0" > /proc/sys/net/ipv4/conf/$INET_IFACE/accept_source_route echo -n "activated:${INET_IFACE} " fi else echo "not found:${INET_IFACE} " fi fi if [ "$LAN_IFACE" != "" ] ; then if [ -e /proc/sys/net/ipv4/conf/$LAN_IFACE/accept_source_route ] ; then if [ "$ACCEPT_SOURCE_ROUTE" = "TRUE" ] ; then echo "1" > /proc/sys/net/ipv4/conf/$LAN_IFACE/accept_source_route echo -n "disabled:${LAN_IFACE} " else echo "0" > /proc/sys/net/ipv4/conf/$LAN_IFACE/accept_source_route echo -n "activated:${LAN_IFACE} " fi else echo "not found:${LAN_IFACE} " fi fi if [ "$DMZ_IFACE" != "" ] ; then if [ -e /proc/sys/net/ipv4/conf/$DMZ_IFACE/accept_source_route ] ; then if [ "$ACCEPT_SOURCE_ROUTE" = "TRUE" ] ; then echo "1" > /proc/sys/net/ipv4/conf/$DMZ_IFACE/accept_source_route echo -n "disabled:${DMZ_IFACE} " else echo "0" > /proc/sys/net/ipv4/conf/$DMZ_IFACE/accept_source_route echo -n "activated:${DMZ_IFACE} " fi else echo "not found:${DMZ_IFACE} " fi fi echo # =============================================== # --------Actual NetFilter Stuff Follows--------- # =============================================== # Flush everything # If you need compatability, you can comment some or all of these out, # but remember, if you re-run it, it'll just add the new rules in, it # won't remove the old ones for you then, this is how it removes them. echo -n "Flush: " ${IPTABLES} -t filter -F INPUT echo -n "INPUT " ${IPTABLES} -t filter -F OUTPUT echo -n "OUTPUT1 " ${IPTABLES} -t filter -F FORWARD echo -n "FORWARD " ${IPTABLES} -t nat -F PREROUTING echo -n "PREROUTING1 " ${IPTABLES} -t nat -F OUTPUT echo -n "OUTPUT2 " ${IPTABLES} -t nat -F POSTROUTING echo -n "POSTROUTING " ${IPTABLES} -t mangle -F PREROUTING echo -n "PREROUTING2 " ${IPTABLES} -t mangle -F OUTPUT echo -n "OUTPUT3" echo # Create new chains # Output to /dev/null in case they don't exist from a previous invocation echo -n "Creating chains: " for chain in ${FILTER_CHAINS} ; do ${IPTABLES} -t filter -F ${chain} > /dev/null 2>&1 ${IPTABLES} -t filter -X ${chain} > /dev/null 2>&1 ${IPTABLES} -t filter -N ${chain} echo -n "${chain} " done if [ ${HAVE_ULOG} = "true" ] ; then for chain in ${UL_FILTER_CHAINS} ; do ${IPTABLES} -t filter -F ${chain} > /dev/null 2>&1 ${IPTABLES} -t filter -X ${chain} > /dev/null 2>&1 ${IPTABLES} -t filter -N ${chain} echo -n "${chain} " done fi echo # Default Policies # INPUT policy is drop # Policy can't be reject because of kernel limitations echo -n "Default Policies: " ${IPTABLES} -t filter -P INPUT DROP echo -n "INPUT:DROP " ${IPTABLES} -t filter -P OUTPUT ACCEPT echo -n "OUTPUT:ACCEPT " ${IPTABLES} -t filter -P FORWARD DROP echo -n "FORWARD:DROP " echo # =============================================== # -------Chain setup before jumping to them------ # =============================================== #These logging chains are valid to specify in DROP= above #Set up LDROP echo -n "Setting up drop chains chains: " ${IPTABLES} -t filter -A LDROP -p tcp -m limit --limit ${LOG_FLOOD} -j LOG --log-level 6 --log-prefix "TCP Dropped " ${IPTABLES} -t filter -A LDROP -p udp -m limit --limit ${LOG_FLOOD} -j LOG --log-level 6 --log-prefix "UDP Dropped " ${IPTABLES} -t filter -A LDROP -p icmp -m limit --limit ${LOG_FLOOD} -j LOG --log-level 6 --log-prefix "ICMP Dropped " ${IPTABLES} -t filter -A LDROP -f -m limit --limit ${LOG_FLOOD} -j LOG --log-level 4 --log-prefix "FRAGMENT Dropped " ${IPTABLES} -t filter -A LDROP -j DROP echo -n "LDROP " #And LREJECT too ${IPTABLES} -t filter -A LREJECT -p tcp -m limit --limit ${LOG_FLOOD} -j LOG --log-level 6 --log-prefix "TCP Rejected " ${IPTABLES} -t filter -A LREJECT -p udp -m limit --limit ${LOG_FLOOD} -j LOG --log-level 6 --log-prefix "UDP Rejected " ${IPTABLES} -t filter -A LREJECT -p icmp -m limit --limit ${LOG_FLOOD} -j LOG --log-level 6 --log-prefix "ICMP Rejected " ${IPTABLES} -t filter -A LREJECT -f -m limit --limit ${LOG_FLOOD} -j LOG --log-level 4 --log-prefix "FRAGMENT Rejected " ${IPTABLES} -t filter -A LREJECT -j REJECT echo -n "LREJECT " #Don't forget TREJECT ${IPTABLES} -t filter -A TREJECT -p tcp -j REJECT --reject-with tcp-reset ${IPTABLES} -t filter -A TREJECT -p udp -j REJECT --reject-with icmp-port-unreachable ${IPTABLES} -t filter -A TREJECT -p icmp -j DROP ${IPTABLES} -t filter -A TREJECT -j REJECT echo -n "TREJECT " #And LTREJECT ${IPTABLES} -t filter -A LTREJECT -p tcp -m limit --limit ${LOG_FLOOD} -j LOG --log-level 6 --log-prefix "TCP Rejected " ${IPTABLES} -t filter -A LTREJECT -p udp -m limit --limit ${LOG_FLOOD} -j LOG --log-level 6 --log-prefix "UDP Rejected " ${IPTABLES} -t filter -A LTREJECT -p icmp -m limit --limit ${LOG_FLOOD} -j LOG --log-level 6 --log-prefix "ICMP Rejected " ${IPTABLES} -t filter -A LTREJECT -f -m limit --limit ${LOG_FLOOD} -j LOG --log-level 4 --log-prefix "FRAGMENT Rejected " ${IPTABLES} -t filter -A LTREJECT -p tcp -j REJECT --reject-with tcp-reset ${IPTABLES} -t filter -A LTREJECT -p udp -j REJECT --reject-with icmp-port-unreachable ${IPTABLES} -t filter -A LTREJECT -p icmp -j DROP ${IPTABLES} -t filter -A LTREJECT -j REJECT echo -n "LTREJECT " #And ULOG stuff, same as above but ULOG instead of LOG if [ ${HAVE_ULOG} = "true" ] ; then ${IPTABLES} -t filter -A ULDROP -p tcp -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LDROP_TCP ${IPTABLES} -t filter -A ULDROP -p udp -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LDROP_UDP ${IPTABLES} -t filter -A ULDROP -p icmp -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LDROP_ICMP ${IPTABLES} -t filter -A ULDROP -f -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LDROP_FRAG ${IPTABLES} -t filter -A ULDROP -j DROP echo -n "ULDROP " ${IPTABLES} -t filter -A ULREJECT -p tcp -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LREJECT_TCP ${IPTABLES} -t filter -A ULREJECT -p udp -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LREJECT_UDP ${IPTABLES} -t filter -A ULREJECT -p icmp -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LREJECT_UDP ${IPTABLES} -t filter -A ULREJECT -f -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LREJECT_FRAG ${IPTABLES} -t filter -A ULREJECT -j REJECT echo -n "LREJECT " ${IPTABLES} -t filter -A ULTREJECT -p tcp -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LTREJECT_TCP ${IPTABLES} -t filter -A ULTREJECT -p udp -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LTREJECT_UDP ${IPTABLES} -t filter -A ULTREJECT -p icmp -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LTREJECT_ICMP ${IPTABLES} -t filter -A ULTREJECT -f -m limit --limit ${LOG_FLOOD} -j ULOG --ulog-nlgroup 1 --ulog-prefix LTREJECT_FRAG ${IPTABLES} -t filter -A ULTREJECT -p tcp -j REJECT --reject-with tcp-reset ${IPTABLES} -t filter -A ULTREJECT -p udp -j REJECT --reject-with icmp-port-unreachable ${IPTABLES} -t filter -A ULTREJECT -p icmp -j DROP ${IPTABLES} -t filter -A ULTREJECT -j REJECT echo -n "ULTREJECT " fi #newline echo # Set up the per-proto ACCEPT chains echo -n "Setting up per-proto ACCEPT: " # TCPACCEPT # SYN Flood "Protection" ${IPTABLES} -t filter -A TCPACCEPT -p tcp --syn -m limit --limit ${SYN_FLOOD} -j ACCEPT ${IPTABLES} -t filter -A TCPACCEPT -p tcp --syn -m limit --limit ${LOG_FLOOD} -j LOG --log-prefix "Possible SynFlood " ${IPTABLES} -t filter -A TCPACCEPT -p tcp --syn -j ${DROP} ${IPTABLES} -t filter -A TCPACCEPT -p tcp ! --syn -j ACCEPT # Log anything that hasn't matched yet and ${DROP} it since it isn't TCP and shouldn't be here ${IPTABLES} -t filter -A TCPACCEPT -m limit --limit ${LOG_FLOOD} -j LOG --log-prefix "Mismatch in TCPACCEPT " ${IPTABLES} -t filter -A TCPACCEPT -j ${DROP} echo -n "TCPACCEPT " #UDPACCEPT ${IPTABLES} -t filter -A UDPACCEPT -p udp -j ACCEPT # Log anything not UDP and ${DROP} it since it's not supposed to be here ${IPTABLES} -t filter -A UDPACCEPT -m limit --limit ${LOG_FLOOD} -j LOG --log-prefix "Mismatch on UDPACCEPT " ${IPTABLES} -t filter -A UDPACCEPT -j ${DROP} echo -n "UDPACCEPT " #Done echo # ================================================= # ----------------Explicit Denies------------------ # ================================================= #Blackholes will not be overridden by hostwise allows if [ "$BLACKHOLE" != "" ] ; then echo -n "Blackholes: " for host in ${BLACKHOLE} ; do ${IPTABLES} -t filter -A INPUT -s ${host} -j ${BLACKHOLE_DROP} ${IPTABLES} -t filter -A OUTPUT -d ${host} -j ${BLACKHOLE_DROP} ${IPTABLES} -t filter -A FORWARD -s ${host} -j ${BLACKHOLE_DROP} ${IPTABLES} -t filter -A FORWARD -d ${host} -j ${BLACKHOLE_DROP} echo -n "${host} " done echo fi if [ "$DENY_ALL" != "" ] ; then echo -n "Denying hosts: " for host in ${DENY_ALL} ; do ${IPTABLES} -t filter -A INPUT -s ${host} -j ${DROP} ${IPTABLES} -t filter -A FORWARD -s ${host} -j ${DROP} echo -n "${host}:${DROP}" done echo fi if [ "$DENY_HOSTWISE_TCP" != "" ] ; then echo -n "Hostwise TCP Denies: " for rule in ${DENY_HOSTWISE_TCP} ; do echo "$rule" | { IFS='>' read host port ${IPTABLES} -t filter -A INPUT -p tcp -s ${host} --dport ${port} -j ${DROP} ${IPTABLES} -t filter -A FORWARD -p tcp -s ${host} --dport ${port} -j ${DROP} echo -n "${rule} " } done echo fi if [ "$DENY_HOSTWISE_UDP" != "" ] ; then echo -n "Hostwise UDP Denies: " for rule in ${DENY_HOSTWISE_UDP} ; do echo "$rule" | { IFS='>' read host port ${IPTABLES} -t filter -A INPUT -p udp -s ${host} --dport ${port} -j ${DROP} ${IPTABLES} -t filter -A FORWARD -p udp -s ${host} --dport ${port} -j ${DROP} echo -n "${rule} " } done echo fi #Invalid packets are always annoying echo -n "${DROP}ing invalid packets..." ${IPTABLES} -t filter -A INETIN -m state --state INVALID -j ${DROP} echo "done" # ------------------------------------------------------------------------ # Internet jumps to INET chains and DMZ # Set up INET chains echo -n "Setting up INET chains: " ${IPTABLES} -t filter -A INPUT -i ${INET_IFACE} -j INETIN ${IPTABLES} -t filter -A FORWARD -i ${INET_IFACE} -o ${LAN_IFACE} -j INETIN echo -n "INETIN " ${IPTABLES} -t filter -A OUTPUT -o ${INET_IFACE} -j INETOUT ${IPTABLES} -t filter -A FORWARD -o ${INET_IFACE} -i ${LAN_IFACE} -j INETOUT echo -n "INETOUT " echo # For now we'll subject the DMZ to the same rules as the internet when going onto the trusted LAN # And we'll let it go anywhere on the internet if [ "$DMZ_IFACE" != "" ] ; then echo -n "Setting up DMZ Chains: " ${IPTABLES} -A OUTPUT -o ${DMZ_IFACE} -j DMZOUT ${IPTABLES} -A FORWARD -i ${LAN_IFACE} -o ${DMZ_IFACE} -j DMZOUT ${IPTABLES} -A FORWARD -i ${INET_IFACE} -o ${DMZ_IFACE} -j ACCEPT echo -n "DMZOUT " echo -n "DMZ for Internet Forwarding to INETOUT..." ${IPTABLES} -A DMZOUT -j INETOUT ${IPTABLES} -A INPUT -i ${DMZ_IFACE} -j DMZIN ${IPTABLES} -A FORWARD -i ${DMZ_IFACE} -o ${LAN_IFACE} -j DMZIN ${IPTABLES} -A FORWARD -i ${DMZ_IFACE} -o ${INET_IFACE} -j ACCEPT echo -n "DMZIN " echo echo -n "DMZ for LAN and localhost Forwarding to INETIN..." ${IPTABLES} -A DMZIN -j INETIN echo "done" echo -n "done" fi # ------------------------------------------------------------------------ # Local traffic to internet or crossing subnets # This should cover what we need if we don't use masquerading # Unfortunately, MAC address matching isn't bidirectional (for # obvious reasons), so IP based matching is done here echo -n "Local Traffic Rules: " if [ "$INTERNAL_LAN" != "" ] ; then for subnet in ${INTERNAL_LAN} ; do ${IPTABLES} -t filter -A INPUT -s ${subnet} -j ACCEPT echo -n "${subnet}:ACCEPT " done fi # 127.0.0.0/8 used to need an entry in INTERNAL_LAN, but routing of that isn't needed # so an allow is placed on INPUT so that the computer can talk to itself :) ${IPTABLES} -t filter -A INPUT -i ${LOOP_IFACE} -j ACCEPT echo -n "loopback:ACCEPT " # DHCP server magic # Allow broadcasts from LAN to UDP port 67 (DHCP server) if [ "$DHCP_SERVER" = "TRUE" ] ; then ${IPTABLES} -t filter -A INPUT -i ${LAN_IFACE} -p udp --dport 67 -j ACCEPT echo -n "dhcp:ACCEPT" fi echo if [ "$PROXY" != "" ] ; then echo -n "Setting up Transparent Proxy to ${PROXY}: " for subnet in ${INTERNAL_LAN} ; do echo "$PROXY" | { IFS=':' read host port if [ "$host" = "localhost" ] || [ "$host" = "127.0.0.1" ] ; then ${IPTABLES} -t nat -A PREROUTING -s ${subnet} -p tcp --dport 80 -j REDIRECT --to-port ${port} echo -n "${subnet}:PROXY " else ${IPTABLES} -t nat -A PREROUTING -s ${subnet} -p tcp --dport 80 -j DNAT --to ${host}:${port} echo -n "${subnet}:PROXY " fi } done echo fi if [ "$ALLOW_OUT_TCP" != "" ] ; then echo -n "Internet censorship TCP allows: " for rule in ${ALLOW_OUT_TCP} ; do echo "$rule" | { IFS=':' read intip destip dport ${IPTABLES} -t filter -A FORWARD -s ${intip} -d ${destip} --dport ${dport} -o ${INET_IFACE} -j ACCEPT ${IPTABLES} -t filter -A FORWARD -d ${intip} -s ${destip} -i ${INET_IFACE} -j ACCEPT echo -n "${intip}:${destip} " } done echo fi # Set up basic NAT if the user wants it if [ "$MASQ_LAN" != "" ] ; then echo -n "Setting up masquerading: " if [ "$MAC_MASQ" = "" ] ; then for subnet in ${MASQ_LAN} ; do ${IPTABLES} -t nat -A POSTROUTING -s ${subnet} -o ${INET_IFACE} -j MASQUERADE echo -n "${subnet}:MASQUERADE " done else for address in ${MAC_MASQ} ; do ${IPTABLES} -t nat -A POSTROUTING -m mac --mac-source ${address} -o ${INET_IFACE} -j MASQUERADE echo -n "${address}:MASQUERADE " done fi echo fi if [ "$SNAT_LAN" != "" ] ; then #Static NAT used echo -n "Setting up static NAT: " if [ "$MAC_SNAT" = "" ] ; then for rule in ${SNAT_LAN} ; do echo "$rule" | { IFS=':' read host destip ${IPTABLES} -t nat -A POSTROUTING -s ${host} -o ${INET_IFACE} -j SNAT --to-source ${destip} echo -n "${subnet}:SNAT " } done else for rule in ${MAC_SNAT} ; do echo "$rule" | { IFS=':' read address destip ${IPTABLES} -t nat -A POSTROUTING -m mac --mac-source ${address} -o ${INET_IFACE} -j SNAT --to-source ${destip} echo -n "${address}:SNAT " } done fi echo fi #TCP Port-Forwards if [ "$TCP_FW" != "" ] ; then echo -n "TCP Port Forwards: " for rule in ${TCP_FW} ; do echo "$rule" | { IFS=':>' read srcport destport host echo "$srcport" | { IFS='-' read fsp lsp if [ "$lsp" != "" ] ; then echo "$destport" | { IFS='-' read fdp ldp ${IPTABLES} -t nat -A PREROUTING -p tcp -i ${INET_IFACE} --dport ${fsp}:${lsp} -j DNAT --to-destination ${host}:${destport} ${IPTABLES} -t filter -A FORWARD -p tcp -d ${host} --dport ${fdp}:${ldp} -j ACCEPT } else ${IPTABLES} -t nat -A PREROUTING -p tcp -i ${INET_IFACE} --dport ${srcport} -j DNAT --to-destination ${host}:${destport} ${IPTABLES} -t filter -A FORWARD -p tcp -d ${host} --dport ${destport} -j ACCEPT fi echo -n "${rule} " } } done echo fi #UDP Port Forwards if [ "$UDP_FW" != "" ] ; then echo -n "UDP Port Forwards: " for rule in ${UDP_FW} ; do echo "$rule" | { IFS=':>' read srcport destport host echo "$srcport" | { IFS='-' read fsp lsp if [ "$lsp" != "" ] ; then echo "$destport" | { IFS='-' read fdp ldp ${IPTABLES} -t nat -A PREROUTING -p udp -i ${INET_IFACE} --dport ${fsp}:${lsp} -j DNAT --to-destination ${host}:${destport} ${IPTABLES} -t filter -A FORWARD -p udp -d ${host} --dport ${fdp}:${ldp} -j ACCEPT } else ${IPTABLES} -t nat -A PREROUTING -p udp -i ${INET_IFACE} --dport ${srcport} -j DNAT --to-destination ${host}:${destport} ${IPTABLES} -t filter -A FORWARD -p udp -d ${host} --dport ${destport} -j ACCEPT fi echo -n "${rule} " } } done echo fi # ================================================================ # ------------Allow stuff we have chosen to allow in-------------- # ================================================================ # Hostwise allows if [ "$ALLOW_ALL" != "" ] ; then echo -n "Hostwise Input Allow: " for host in ${ALLOW_ALL} ; do ${IPTABLES} -t filter -A INETIN -s ${host} -j ACCEPT echo -n "${host} " done echo fi if [ "$ALLOW_HOSTWISE_TCP" != "" ] ; then echo -n "Hostwise TCP Allows: " for rule in ${ALLOW_HOSTWISE_TCP} ; do echo "$rule" | { IFS='>' read host port ${IPTABLES} -t filter -A INETIN -p tcp -s ${host} --dport ${port} -j ACCEPT echo -n "${rule} " } done echo fi if [ "$ALLOW_HOSTWISE_UDP" != "" ] ; then echo -n "Hostwise UDP Allows: " for rule in ${ALLOW_HOSTWISE_UDP} ; do echo "$rule" | { IFS='>' read host port ${IPTABLES} -t filter -A INETIN -p udp -s ${host} --dport ${port} -j ACCEPT echo -n "${rule} " } done echo fi # Flood "security" # You'll still respond to these if they comply with the limits (set in config) # There is a more elegant way to set this using sysctl, however this has the # advantage that the kernel ICMP stack never has to process it, lessening # the chance of a very serious flood overloading your kernel. # This is just a packet limit, you still get the packets on the interface and # still may experience lag if the flood is heavy enough echo -n "Flood limiting: " # Ping Floods (ICMP echo-request) ${IPTABLES} -t filter -A INETIN -p icmp --icmp-type echo-request -m limit --limit ${PING_FLOOD} -j ACCEPT ${IPTABLES} -t filter -A INETIN -p icmp --icmp-type echo-request -j ${DROP} echo -n "ICMP-PING " echo if [ "$BAD_ICMP" != "" ] ; then echo -n "Dropping ICMP messages specified in BAD_ICMP..." for message in ${BAD_ICMP} ; do ${IPTABLES} -t filter -A INETIN -p icmp --icmp-type ${message} -j ${DROP} echo -n "${message} " done echo fi echo -n "Allowing the rest of the ICMP messages in..." ${IPTABLES} -t filter -A INETIN -p icmp --icmp-type ! echo-request -j ACCEPT echo "done" if [ "$TCP_ALLOW" != "" ] ; then echo -n "TCP Input Allow: " for port in ${TCP_ALLOW} ; do ${IPTABLES} -t filter -A INETIN -p tcp --dport ${port} -j TCPACCEPT echo -n "${port} " done echo fi if [ "$UDP_ALLOW" != "" ] ; then echo -n "UDP Input Allow: " for port in ${UDP_ALLOW} ; do ${IPTABLES} -t filter -A INETIN -p udp --dport ${port} -j UDPACCEPT echo -n "${port} " done echo fi echo -n "Allowing established outbound connections back in..." ${IPTABLES} -t filter -A INETIN -m state --state ESTABLISHED -j ACCEPT echo "done" # RELATED on high ports only for security echo -n "Allowing related inbound connections..." ${IPTABLES} -t filter -A INETIN -p tcp --dport 1024:65535 -m state --state RELATED -j TCPACCEPT ${IPTABLES} -t filter -A INETIN -p udp --dport 1024:65535 -m state --state RELATED -j UDPACCEPT echo "done" # ================================================= # ----------------Packet Mangling------------------ # ================================================= # TTL mangling # This is probably just for the paranoid, but hey, isn't that what # all security guys are? :) if [ "$TTL_SAFE" != "" ] ; then ${IPTABLES} -t mangle -A PREROUTING -i ${INET_IFACE} -j TTL --ttl-set ${TTL_SAFE} fi # Type of Service mangle optimizations (the ACTIVE FTP one will only work for uploads) if [ "$MANGLE_TOS_OPTIMIZE" = "TRUE" ] ; then echo -n "Optimizing traffic: " ${IPTABLES} -t mangle -A OUTPUT -p tcp --dport 22 -j TOS --set-tos Minimize-Delay echo -n "ssh " echo fi # What to do on those INET chains when we hit the end echo -n "Setting up INET policies: " # Drop if we cant find a valid inbound rule. ${IPTABLES} -t filter -A INETIN -j ${DROP} echo -n "INETIN:${DROP} " # We can send what we want to the internet ${IPTABLES} -t filter -A INETOUT -j ACCEPT echo -n "INETOUT:ACCEPT " echo # All done! echo "Done loading the firewall!" ;; stop) echo -n "Flush: " ${IPTABLES} -t filter -F INPUT echo -n "INPUT " ${IPTABLES} -t filter -F OUTPUT echo -n "OUTPUT1 " ${IPTABLES} -t filter -F FORWARD echo -n "FORWARD " ${IPTABLES} -t nat -F PREROUTING echo -n "PREROUTING1 " ${IPTABLES} -t nat -F OUTPUT echo -n "OUTPUT2 " ${IPTABLES} -t nat -F POSTROUTING echo -n "POSTROUTING " ${IPTABLES} -t mangle -F PREROUTING echo -n "PREROUTING2 " ${IPTABLES} -t mangle -F OUTPUT echo -n "OUTPUT3" echo ;; esac -- Douglas J Hunley (doug at hunley.homeip.net) - Linux User #174778 Admin: Linux StepByStep - http://linux.nf Alliance, n.: In international politics, the union of two thieves who have their hands so deeply inserted in each other's pocket that they cannot separately plunder a third. -- Ambrose Bierce, "The Devil's Dictionary"
smime.p7s
Description: application/pkcs7-signature