#!/bin/sh #------------------------------------------------------------------------------ # for debugging use Iptables-v. Iptables= "/sbin/iptables" Ip6tables= "/sbin/ip6tables" Modprobe= "/sbin/modprobe" Rmmod= "/sbin/rmmod" arp= "/usr/sbin/arp" # Logging Options. #------------------------------------------------------------------------------ log= "LOG--log-level debug--log-tcp-sequence--log-tcp-options" log= "$LOG--log-ip-options" # Defaults for rate limiting #------------------------------------------------------------------------------ Rlimit= "-M limit--limit 3/s--limit-burst 8" # unprivileged ports. #------------------------------------------------------------------------------ Phigh= "1024:65,535" Pssh= "1000:1023" # Load Required kernel modules #------------------------------------------------------------------------------ $MODPROBE ip_conntrack_ftp $MODPROBE Ip_conntrack_irc # mitigate ARP spoofing/poisoning and similar attacks. #------------------------------------------------------------------------------ # hardcode static ARP cache entries here # $ARP-S ip-address mac-address # Kernel configuration. #------------------------------------------------------------------------------ # Disable IP forwarding. # on => off = (reset) Echo 1 >/proc/sys/net/ipv4/ip_forward echo 0 >/proc/sys/net/ipv4/ip_forward # Enable IP Spoofing Protection For I in/proc/sys/net/ipv4/conf/*/rp_filter; Do echo 1 > $i; Done # Protect against SYN flood attacks Echo 1 >/proc/sys/net/ipv4/tcp_syncookies # Ignore all incoming ICMP echo requests echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all # Ignore ICMP echo requests to broadcast Echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # LOG packets with impossible addresses. For I In/proc/sys/net/ipv4/conf/*/log_martians; Do echo 1 > $i; Done # Don ' t log invalid responses to broadcast Echo 1 >/proc/sys/net/ipv4/icmp_ignore_bogus_error_responses # Don ' t accept or send ICMP redirects. For I in/proc/sys/net/ipv4/conf/*/accept_redirects; Do echo 0 > $i; Done For I in/proc/sys/net/ipv4/conf/*/send_redirects; Do echo 0 > $i; Done # Don ' t accept source routed packets. For I in/proc/sys/net/ipv4/conf/*/accept_source_route; Do echo 0 > $i; Done # Disable Multicast Routing # #for I in/proc/sys/net/ipv4/conf/*/mc_forwarding; Do echo 0 > $i; Done # Disable Proxy_arp. For I in/proc/sys/net/ipv4/conf/*/proxy_arp; Do echo 0 > $i; Done # Enable secure redirects, i.e. only accept ICMP redirects for gateways # helps against MITM attacks. For I in/proc/sys/net/ipv4/conf/*/secure_redirects; Do echo 1 > $i; Done # Disable Bootp_relay For I in/proc/sys/net/ipv4/conf/*/bootp_relay; Do echo 0 > $i; Done # Default policies. #------------------------------------------------------------------------------ # Drop everything by default. $IPTABLES-P INPUT DROP $IPTABLES-P FORWARD DROP $IPTABLES-P OUTPUT DROP # Set The Nat/mangle/raw tables ' chains to ACCEPT $IPTABLES-T nat-p prerouting ACCEPT $IPTABLES-T nat-p OUTPUT ACCEPT $IPTABLES-T nat-p postrouting ACCEPT $IPTABLES-T mangle-p prerouting ACCEPT $IPTABLES-T mangle-p INPUT ACCEPT $IPTABLES-T mangle-p FORWARD ACCEPT $IPTABLES-T mangle-p OUTPUT ACCEPT $IPTABLES-T mangle-p postrouting ACCEPT # Cleanup. #------------------------------------------------------------------------------ # Delete All $IPTABLES-F $IPTABLES-T Nat-f $IPTABLES-T Mangle-f # Delete All $IPTABLES-X $IPTABLES-T Nat-x $IPTABLES-T Mangle-x # Zero all packets and counters. $IPTABLES-Z $IPTABLES-T Nat-z $IPTABLES-T Mangle-z # completely disable IPv6. #------------------------------------------------------------------------------ # Block all IPV6 traffic # If The Ip6tables command is available, try to block all IPV6 traffic. If Test-x $IP 6TABLES; Then # Set The default policies # drop Everything $IP 6tables-p INPUT DROP 2>/dev/null $IP 6tables-p FORWARD DROP 2>/dev/null $IP 6tables-p OUTPUT DROP 2>/dev/null # The Mangle table can pass everything $IP 6tables-t mangle-p prerouting ACCEPT 2>/dev/null $IP 6tables-t mangle-p INPUT ACCEPT 2>/dev/null $IP 6tables-t mangle-p FORWARD ACCEPT 2>/dev/null $IP 6tables-t mangle-p OUTPUT ACCEPT 2>/dev/null $IP 6tables-t mangle-p postrouting ACCEPT 2>/dev/null # Delete all rules. $IP 6tables-f 2>/dev/null $IP 6tables-t mangle-f 2>/dev/null # Delete all chains. $IP 6tables-x 2>/dev/null $IP 6tables-t Mangle-x 2>/dev/null # Zero all packets and counters. $IP 6tables-z 2>/dev/null $IP 6tables-t mangle-z 2>/dev/null Fi # Custom user-defined chains. #------------------------------------------------------------------------------ # LOG packets, then ACCEPT. $IPTABLES-N Acceptlog $IPTABLES-A acceptlog-j $LOG $RLIMIT--log-prefix "ACCEPT" $IPTABLES-A acceptlog-j ACCEPT # LOG packets, then DROP. $IPTABLES-N Droplog $IPTABLES-A droplog-j $LOG $RLIMIT--log-prefix "DROP" $IPTABLES-A droplog-j DROP # LOG packets, then REJECT. # TCP packets are rejected with a TCP reset. $IPTABLES-N Rejectlog $IPTABLES-A rejectlog-j $LOG $RLIMIT--log-prefix "REJECT" $IPTABLES-A rejectlog-p tcp-j REJECT--reject-with tcp-reset $IPTABLES-A rejectlog-j REJECT # only allows RELATED ICMP types # (Destination-unreachable, time-exceeded, and Parameter-problem). # Todo:rate-limit This traffic? # Todo:allow fragmentation-needed? # todo:test. $IPTABLES-N related_icmp $IPTABLES-A related_icmp-p ICMP--icmp-type destination-unreachable-j ACCEPT $IPTABLES-A related_icmp-p ICMP--icmp-type time-exceeded-j ACCEPT $IPTABLES-A related_icmp-p ICMP--icmp-type parameter-problem-j ACCEPT $IPTABLES-A related_icmp-j Droplog # make It even harder to multi-ping $IPTABLES-A input-p icmp-m limit--limit 1/s--limit-burst 2-j ACCEPT $IPTABLES-A input-p icmp-m limit--limit 1/s--limit-burst 2-j LOG--log-prefix ping-drop: $IPTABLES-A input-p icmp-j DROP $IPTABLES-A output-p icmp-j ACCEPT # only allow the minimally required/recommended parts of ICMP. Block the rest. #------------------------------------------------------------------------------ # Todo:this section needs a lot of testing! # A, drop all fragmented ICMP packets (almost always malicious). $IPTABLES-A input-p ICMP--fragment-j droplog $IPTABLES-A output-p ICMP--fragment-j droplog $IPTABLES-A forward-p ICMP--fragment-j droplog # Allow all established ICMP traffic. $IPTABLES-A input-p icmp-m State--state established-j ACCEPT $RLIMIT $IPTABLES-A output-p icmp-m State--state established-j ACCEPT $RLIMIT # Allow Some parts of the RELATED ICMP traffic, block the rest. $IPTABLES-A input-p icmp-m State--state related-j related_icmp $RLIMIT $IPTABLES-A output-p icmp-m State--state related-j related_icmp $RLIMIT # Allow incoming ICMP echo requests (ping), but only rate-limited. $IPTABLES-A input-p ICMP--icmp-type echo-request-j ACCEPT $RLIMIT # Allow Outgoing ICMP echo requests (ping), but only rate-limited. $IPTABLES-A output-p ICMP--icmp-type echo-request-j ACCEPT $RLIMIT # Drop any other ICMP traffic. $IPTABLES-A input-p icmp-j Droplog $IPTABLES-A output-p icmp-j Droplog $IPTABLES-A forward-p icmp-j Droplog # selectively allow certain special types of traffic. #------------------------------------------------------------------------------ # Allow Loopback interface to do anything. $IPTABLES-A input-i lo-j ACCEPT $IPTABLES-A output-o lo-j ACCEPT # Allow Incoming connections related to existing allowed. $IPTABLES-A input-m State--state established,related-j ACCEPT # Allow Outgoing Connections EXCEPT invalid $IPTABLES-A output-m State--state new,established,related-j ACCEPT # Miscellaneous. #------------------------------------------------------------------------------ # We don ' t care about Milkosoft, Drop smb/cifs/etc. $IPTABLES-A input-p tcp-m multiport--dports 135,137,138,139,445,1433,1434-j DROP $IPTABLES-A input-p udp-m multiport--dports 135,137,138,139,445,1433,1434-j DROP # explicitly drop invalid incoming traffic $IPTABLES-A input-m State--state invalid-j DROP # Drop Invalid outgoing traffic, too. $IPTABLES-A output-m State--state invalid-j DROP # If We would use NAT, INVALID packets would pass-block them anyways $IPTABLES-A forward-m State--state invalid-j DROP # PORT Scanners (Stealth also) $IPTABLES-A input-m State--state new-p TCP--tcp-flags all all-j DROP $IPTABLES-A input-m State--state new-p TCP--tcp-flags all none-j DROP # todo:some more anti-spoofing rules? For example: # $IPTABLES-A input-p tcp--tcp-flags all fin,urg,psh-j DROP # $IPTABLES-A input-p tcp--tcp-flags syn,rst syn,rst-j DROP # $IPTABLES-A input-p tcp--tcp-flags syn,fin syn,fin-j DROP $IPTABLES-N Syn_flood $IPTABLES-A input-p TCP--syn-j Syn_flood $IPTABLES-A syn_flood-m limit--limit 2/s--limit-burst 6-j return $IPTABLES-A syn_flood-j DROP # Todo:block Known-bad IPs (http://www.dshield.org/top10.php). # $IPTABLES-A input-s insert-bad-ip-here-j Droplog # Drop any traffic from iana-reserved IPs. #------------------------------------------------------------------------------ $IPTABLES-A input-s 0.0.0.0/7-j DROP $IPTABLES-A input-s 2.0.0.0/8-j DROP $IPTABLES-A input-s 5.0.0.0/8-j DROP $IPTABLES-A input-s 7.0.0.0/8-j DROP $IPTABLES-A input-s 10.0.0.0/8-j DROP $IPTABLES-A input-s 23.0.0.0/8-j DROP $IPTABLES-A input-s 27.0.0.0/8-j DROP $IPTABLES-A input-s 31.0.0.0/8-j DROP $IPTABLES-A input-s 36.0.0.0/7-j DROP $IPTABLES-A input-s 39.0.0.0/8-j DROP $IPTABLES-A input-s 42.0.0.0/8-j DROP $IPTABLES-A input-s 49.0.0.0/8-j DROP $IPTABLES-A input-s 50.0.0.0/8-j DROP $IPTABLES-A input-s 77.0.0.0/8-j DROP $IPTABLES-A input-s 78.0.0.0/7-j DROP $IPTABLES-A input-s 92.0.0.0/6-j DROP $IPTABLES-A input-s 96.0.0.0/4-j DROP $IPTABLES-A input-s 112.0.0.0/5-j DROP $IPTABLES-A input-s 120.0.0.0/8-j DROP $IPTABLES-A input-s 169.254.0.0/16-j DROP $IPTABLES-A input-s 172.16.0.0/12-j DROP $IPTABLES-A input-s 173.0.0.0/8-j DROP $IPTABLES-A input-s 174.0.0.0/7-j DROP $IPTABLES-A input-s 176.0.0.0/5-j DROP $IPTABLES-A input-s 184.0.0.0/6-j DROP $IPTABLES-A input-s 192.0.2.0/24-j DROP $IPTABLES-A input-s 197.0.0.0/8-j DROP $IPTABLES-A input-s 198.18.0.0/15-j DROP $IPTABLES-A input-s 223.0.0.0/8-j DROP $IPTABLES-A input-s 224.0.0.0/3-j DROP # selectively allow certain outbound connections, block the rest. #------------------------------------------------------------------------------ # Allow outgoing DNS requests. Few things would work without this. $IPTABLES-A output-m State--state new-p UDP--dport 53-j ACCEPT $IPTABLES-A output-m State--state new-p TCP--dport 53-j ACCEPT # Allow outgoing HTTP requests. Unencrypted with care. $IPTABLES-A output-m State--state new-p TCP--dport 80-j ACCEPT # Allow outgoing HTTPS requests. $IPTABLES-A output-m State--state new-p TCP--dport 443-j ACCEPT # Allow outgoing SMTPS requests. Do not allow unencrypted smtp! # $IPTABLES-A output-m State--state new-p TCP--dport 465-j ACCEPT # Allow Outgoing "Submission" (RFC 2476) requests. $IPTABLES-A output-m State--state new-p TCP--dport 587-j ACCEPT # Allow outgoing pop3s requests. $IPTABLES-A output-m State--state new-p TCP--dport 995-j ACCEPT # Allow outgoing SSH requests. $IPTABLES-A output-m State--state new-p TCP--dport 22-j ACCEPT # Allow outgoing FTP requests. Unencrypted with care. $IPTABLES-A output-m State--state new-p TCP--dport 21-j ACCEPT # Allow outgoing NNTP requests. Unencrypted with care. # $IPTABLES-A output-m State--state new-p TCP--dport 119-j ACCEPT # Allow outgoing NTP requests. Unencrypted with care. # $IPTABLES-A output-m State--state new-p UDP--dport 123-j ACCEPT # Allow outgoing IRC requests. Unencrypted with care. # note:this usually needs the IP_CONNTRACK_IRC kernel module. # $IPTABLES-A output-m State--state new-p TCP--dport 6667-j ACCEPT # Allow outgoing requests to various proxies. Unencrypted with care. # $IPTABLES-A output-m State--state new-p TCP--dport 8080-j ACCEPT # $IPTABLES-A output-m State--state new-p TCP--dport 8090-j ACCEPT # Allow outgoing DHCP requests. Unencrypted with care. # Todo:this is completely untested, I have no idea whether it works! # todo:i can be tightened a bit more. $IPTABLES-A output-m State--state new-p UDP--sport 67:68--dport 67:68-j ACCEPT # Allow outgoing CVS requests. Unencrypted with care. # $IPTABLES-A output-m State--state new-p TCP--dport 2401-j ACCEPT # Allow outgoing MySQL requests. Unencrypted with care. # $IPTABLES-A output-m State--state new-p TCP--dport 3306-j ACCEPT # Allow outgoing SVN requests. Unencrypted with care. # $IPTABLES-A output-m State--state new-p TCP--dport 3690-j ACCEPT # Allow outgoing PLESK requests. Unencrypted with care. # $IPTABLES-A output-m State--state new-p TCP--dport 8443-j ACCEPT # Allow Outgoing Tor (http://tor.eff.org) requests. # Note:do _not_ Use unencrypted protocols over Tor (sniffing is possible)! # $IPTABLES-A output-m State--state new-p TCP--dport 9001-j ACCEPT # $IPTABLES-A output-m State--state new-p TCP--dport 9002-j ACCEPT # $IPTABLES-A output-m State--state new-p TCP--dport 9030-j ACCEPT # $IPTABLES-A output-m State--state new-p TCP--dport 9031-j ACCEPT # $IPTABLES-A output-m State--state new-p TCP--dport 9090-j ACCEPT # $IPTABLES-A output-m State--state new-p TCP--dport 9091-j ACCEPT # Allow outgoing OpenVPN requests. $IPTABLES-A output-m State--state new-p UDP--dport 1194-j ACCEPT # Todo:icq, MSN, GTalk, Skype, Yahoo, etc ... # selectively allow certain inbound connections, block the rest. #------------------------------------------------------------------------------ # Allow incoming DNS requests. $IPTABLES-A input-m State--state new-p UDP--dport 53-j ACCEPT $IPTABLES-A input-m State--state new-p TCP--dport 53-j ACCEPT # Allow incoming HTTP requests. $IPTABLES-A input-m State--state new-p TCP--dport 80-j ACCEPT # Allow incoming HTTPS requests. $IPTABLES-A input-m State--state new-p TCP--dport 443-j ACCEPT # Allow incoming POP3 requests. $IPTABLES-A input-m State--state new-p TCP--dport 110-j ACCEPT # Allow incoming IMAP4 requests. $IPTABLES-A input-m State--state new-p TCP--dport 143-j ACCEPT # Allow incoming pop3s requests. $IPTABLES-A input-m State--state new-p TCP--dport 995-j ACCEPT # Allow incoming SMTP requests. $IPTABLES-A input-m State--state new-p TCP--dport 25-j ACCEPT # Allow incoming SSH requests. $IPTABLES-A input-m State--state new-p TCP--dport 22-j ACCEPT # Allow incoming FTP requests. $IPTABLES-A input-m State--state new-p TCP--dport 21-j ACCEPT # Allow incoming NNTP requests. # $IPTABLES-A input-m State--state new-p TCP--dport 119-j ACCEPT # Allow incoming MySQL requests. # $IPTABLES-A input-m State--state new-p TCP--dport 3306-j ACCEPT # Allow incoming PLESK requests. # $IPTABLES-A input-m State--state new-p TCP--dport 8843-j ACCEPT # Allow incoming BitTorrent requests. # Todo:are These already handled by accepting established/related traffic? # $IPTABLES-A input-m State--state new-p TCP--dport 6881-j ACCEPT # $IPTABLES-A input-m State--state new-p UDP--dport 6881-j ACCEPT # Allow incoming NC requests. # $IPTABLES-A input-m State--state new-p TCP--dport 2030-j ACCEPT # $IPTABLES-A input-m State--state new-p UDP--dport 2030-j ACCEPT # explicitly log and reject everything else. #------------------------------------------------------------------------------ # use REJECT instead of the rejectlog if you don ' t need/want logging. $IPTABLES-A input-j Rejectlog $IPTABLES-A output-j Rejectlog $IPTABLES-A forward-j Rejectlog #------------------------------------------------------------------------------ # Testing the firewall. #------------------------------------------------------------------------------ # You should check/test this firewall really works, using # IPTABLES-VNL, Nmap, Ping, Telnet, ... # Exit gracefully. #------------------------------------------------------------------------------ Exit 0 |