Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
|
linux:firewall [2008/04/29 11:08] greebo |
linux:firewall [2019/04/15 10:18] (current) zagi |
||
|---|---|---|---|
| Line 1: | Line 1: | ||
| - | | + | [[linux: |
| - | echo " | + | [[linux: |
| - | echo "* Running $0" | + | [[http:// |
| - | echo " | + | |
| + | <code bash |> | ||
| + | |||
| + | # | ||
| + | echo " | ||
| + | echo "* Running $0" | ||
| + | echo " | ||
| + | echo "* http:// | ||
| + | |||
| + | echo | ||
| + | echo "It was sad music. But it waved its sadness like a battle flag." | ||
| + | echo " It said the universe had done all it could, but you were still alive." | ||
| + | echo | ||
| + | echo " | ||
| + | |||
| + | TNX_IDIOT=" | ||
| + | |||
| + | echo " how iptables work in linux kernel" | ||
| + | echo | ||
| + | echo "> | ||
| + | echo " | ||
| + | echo " | ||
| + | |||
| + | # path to iptables and iproute2 files | ||
| + | IPTB="/ | ||
| + | IP="/ | ||
| + | |||
| + | # name of our Internet and intranet interfaces | ||
| + | # use INTRANET=" | ||
| + | # if you have more ifaces (example: eth0: | ||
| + | # | ||
| + | # WAN Interface | ||
| + | INTERNET=" | ||
| + | # ADSL - INTERNET=" | ||
| + | # | ||
| + | # LAN Interface | ||
| + | INTRANET=" | ||
| | | ||
| - | echo | + | # what IPs are used in intranet |
| - | | + | LAN="192.168.6.0/24" |
| - | echo " It said the universe had done all it could, but you were still alive." | + | |
| - | echo | + | |
| - | echo " | + | |
| | | ||
| - | TNX_IDIOT="yes" | + | # what is our static |
| + | GW_IP="X.X.X.X" | ||
| | | ||
| - | echo " how iptables work in linux kernel 2.4.x/2.6.x" | + | # what TCP ports/services we allow (and FORWARD) from Internet |
| - | echo | + | # use " |
| - | | + | TCP_PORTS=" |
| - | | + | |
| - | | + | # what UDP ports/ |
| + | # use "," | ||
| + | UDP_PORTS=" | ||
| + | |||
| + | # which ports we forward into our intranet | ||
| + | # use "," | ||
| + | FWD_TCP_PORTS="1214,6346" | ||
| | | ||
| - | | + | # set to 1 if we you have intranet |
| - | + | WE_HAVE_INTRANET="0" | |
| - | IPTB="/ | + | |
| - | | + | # |
| - | + | TRUSTED_HOSTS="193.77.1.1/ | |
| - | | + | 212.93.224.0/ |
| - | | + | 212.18.32.0/ |
| - | | + | |
| - | # ADSL - INTERNET=" | + | # enable |
| - | + | echo "0" | |
| - | # what IPs are used in intranet | + | |
| - | LAN=" | + | # enable PMTU (mss/mtu discovery) |
| - | + | echo " | |
| - | # what is our static | + | |
| - | | + | # first we flush the tables and policy |
| - | + | $IPTB -F | |
| - | # what TCP ports/ | + | $IPTB -X |
| - | # use " " as delimiter | + | $IPTB -F INPUT |
| - | TCP_PORTS=" | + | $IPTB -F FORWARD |
| - | + | $IPTB -F OUTPUT | |
| - | # what UDP ports/services we allow (and FORWARD) from Internet | + | |
| - | # use "," as delimiter | + | $IPTB -t nat -F |
| - | UDP_PORTS=" | + | |
| - | + | # new chain for SSH and HTTP access | |
| - | # which ports we forward into our intranet | + | $IPTB -N ssh-access |
| - | # use "," | + | $IPTB -N http-access |
| - | FWD_TCP_PORTS=" | + | |
| - | + | # port redirection (transparent proxy) | |
| - | # set to 1 if we you have intranet | + | # redirect all outgoing traffic that is NOT for the GW to local (GW) ports |
| - | WE_HAVE_INTRANET=" | + | # DNS (53/tcp and 53/udp) and SMTP (25/tcp) |
| - | + | #$IPTB -t nat -A PREROUTING -i ! $INTERNET -p tcp -s $LAN -d ! $LAN --dport 53 -j REDIRECT | |
| - | echo "0" > / | + | #$IPTB -t nat -A PREROUTING -i ! $INTERNET -p udp -s $LAN -d ! $LAN --dport 53 -j REDIRECT |
| - | + | #$IPTB -t nat -A PREROUTING -i ! $INTERNET -p tcp -s $LAN -d ! $LAN --dport 25 -j REDIRECT --to-ports 25 | |
| - | # first we flush the tables and policy | + | |
| - | $IPTB -F | + | # INPUT TABLE |
| - | $IPTB -F INPUT | + | $IPTB -P INPUT DROP |
| - | $IPTB -F FORWARD | + | |
| - | $IPTB -F OUTPUT | + | # statefull firewall |
| - | $IPTB -t nat -F | + | $IPTB -A INPUT -m state --state ESTABLISHED, |
| - | + | ||
| - | # port redirection (transparent proxy) | + | # move all SSH and HTTP traffic to apropriate chains |
| - | #$IPTB -t nat -A PREROUTING -i ! $INTERNET -p tcp -s $LAN -d ! $LAN --dport 53 -j REDIRECT | + | $IPTB -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j ssh-access |
| - | #$IPTB -t nat -A PREROUTING -i ! $INTERNET -p udp -s $LAN -d ! $LAN --dport 53 -j REDIRECT | + | $IPTB -A INPUT -p tcp -m state --syn --state NEW --dport 80 -j http-access |
| - | #$IPTB -t nat -A PREROUTING -i ! $INTERNET -p tcp -s $LAN -d ! $LAN --dport 25 -j REDIRECT --to-ports 25 | + | |
| - | + | # ssh chain | |
| - | # INPUT TABLE | + | for sshhostese in $TRUSTED_HOSTS; |
| - | $IPTB -P INPUT DROP | + | do |
| - | + | $IPTB -A ssh-access -s $sshhostese -j ACCEPT | |
| - | # statefull firewall | + | done |
| - | $IPTB -A INPUT -m state --state ESTABLISHED, | + | # Connection limit for SSH connections (1 connection per minute PER source IP) |
| - | + | # - usefull against ssh scanners if you MUST open SSH for every IP! | |
| - | # IPSEC | + | $IPTB -A ssh-access -m hashlimit --hashlimit 1/minute --hashlimit-burst 1 --hashlimit-mode srcip --hashlimit-name ssh -j ACCEPT |
| - | #$IPTB -A INPUT -i $INTERNET -p udp --sport 500 --dport 500 -j ACCEPT | + | $IPTB -A ssh-access -j DROP |
| - | #$IPTB -A INPUT -i $INTERNET -p 50 -j ACCEPT | + | # ssh |
| - | #$IPTB -A INPUT -i $INTERNET -p 51 -j ACCEPT | + | |
| - | + | # http | |
| - | # we allow all traffic from $INTRANET and localhost interfaces | + | for httphostese in $TRUSTED_HOSTS; |
| - | $IPTB -A INPUT -i $INTRANET -j ACCEPT | + | do |
| - | $IPTB -A INPUT -i lo -j ACCEPT | + | $IPTB -A http-access -s $httphostese -j ACCEPT |
| - | + | done | |
| - | #$IPTB -A INPUT -m state --state INVALID -m limit --limit 1/minute -j LOG --log-prefix "INVALID | + | # http |
| - | #$IPTB -A INPUT -m state --state INVALID -j DROP | + | |
| - | + | # IPSEC | |
| - | # | + | #$IPTB -A INPUT -i $INTERNET -p udp --sport 500 --dport 500 -j ACCEPT |
| - | $IPTB -A INPUT -i $INTERNET -m pkttype --pkt-type broadcast -j DROP | + | #$IPTB -A INPUT -i $INTERNET -p 50 -j ACCEPT |
| - | $IPTB -A INPUT -i $INTERNET -m pkttype --pkt-type multicast -j DROP | + | #$IPTB -A INPUT -i $INTERNET -p 51 -j ACCEPT |
| - | | + | |
| - | #FIN is set and ACK is not | + | # we allow all traffic from $INTRANET and localhost interfaces |
| - | $IPTB -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP | + | $IPTB -A INPUT -i $INTRANET |
| - | $IPTB -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j LOG --log-prefix " | + | $IPTB -A INPUT -i lo -m state --state NEW, |
| - | + | ||
| - | #PSH is set and ACK is not | + | $IPTB -A INPUT -m state --state INVALID -m limit --limit 1/minute -j LOG --log-prefix " |
| - | $IPTB -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP | + | $IPTB -A INPUT -m state --state INVALID -j DROP |
| - | $IPTB -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j LOG --log-prefix " | + | |
| - | + | # | |
| - | #URG is set and ACK is not | + | $IPTB -A INPUT -i $INTERNET -m pkttype --pkt-type broadcast -j DROP |
| - | $IPTB -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP | + | $IPTB -A INPUT -i $INTERNET -m pkttype --pkt-type multicast -j DROP |
| - | $IPTB -A INPUT -p tcp --tcp-flags ACK,URG URG -j LOG --log-prefix " | + | |
| - | + | #FIN is set and ACK is not | |
| - | # Block portscans: | + | $IPTB -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j LOG --log-prefix " |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL ALL -j LOG --log-prefix "XMAS scan> " | + | $IPTB -A INPUT -p tcp --tcp-flags ACK,FIN FIN -j DROP |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL ALL -j DROP | + | |
| - | + | #PSH is set and ACK is not | |
| - | #no flag is set | + | $IPTB -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j LOG --log-prefix " |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL NONE -j LOG --log-prefix "NULL scan> " | + | $IPTB -A INPUT -p tcp --tcp-flags ACK,PSH PSH -j DROP |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL NONE -j DROP | + | |
| - | + | #URG is set and ACK is not | |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL SYN, | + | $IPTB -A INPUT -p tcp --tcp-flags ACK,URG URG -j LOG --log-prefix " |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL SYN, | + | $IPTB -A INPUT -p tcp --tcp-flags ACK,URG URG -j DROP |
| - | + | ||
| - | #SYN and FIN are both set | + | # Block portscans: |
| - | $IPTB -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix "pscan 2> " | + | $IPTB -A INPUT -p tcp --tcp-flags ALL ALL -j LOG --log-prefix "XMAS scan> " |
| - | $IPTB -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP | + | $IPTB -A INPUT -p tcp --tcp-flags ALL ALL -j DROP |
| - | + | ||
| - | #FIN and RST are both set | + | #no flag is set |
| - | $IPTB -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP | + | $IPTB -A INPUT -p tcp --tcp-flags ALL NONE -j LOG --log-prefix "NULL scan> " |
| - | $IPTB -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j LOG --log-prefix " | + | $IPTB -A INPUT -p tcp --tcp-flags ALL NONE -j DROP |
| - | + | ||
| - | + | $IPTB -A INPUT -p tcp --tcp-flags ALL SYN, | |
| - | | + | $IPTB -A INPUT -p tcp --tcp-flags ALL SYN, |
| - | $IPTB -A INPUT -f -j DROP | + | |
| - | + | #SYN and FIN are both set | |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j LOG --log-prefix " | + | $IPTB -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j LOG --log-prefix "pscan 2> " |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP | + | $IPTB -A INPUT -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP |
| - | + | ||
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL URG,PSH,FIN -j LOG --log-prefix " | + | #FIN and RST are both set |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL URG,PSH,FIN -j DROP | + | $IPTB -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j LOG --log-prefix " |
| - | + | $IPTB -A INPUT -p tcp --tcp-flags FIN,RST FIN,RST -j DROP | |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL FIN -j LOG --log-prefix " | + | |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL FIN -j DROP | + | $IPTB -A INPUT -f -j LOG --log-prefix "Lost FRAGMENT> |
| - | + | $IPTB -A INPUT -f -j DROP | |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL URG, | + | |
| - | $IPTB -A INPUT -p tcp --tcp-flags ALL URG, | + | $IPTB -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j LOG --log-prefix " |
| - | + | $IPTB -A INPUT -p tcp --tcp-flags ALL SYN,FIN -j DROP | |
| - | #SYN and RST are both set | + | |
| - | $IPTB -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix " | + | $IPTB -A INPUT -p tcp --tcp-flags ALL URG,PSH,FIN -j LOG --log-prefix " |
| - | $IPTB -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP | + | $IPTB -A INPUT -p tcp --tcp-flags ALL URG,PSH,FIN -j DROP |
| - | + | ||
| - | # Connection limit for SSH connections ( 1 connection per minute) | + | $IPTB -A INPUT -p tcp --tcp-flags ALL FIN -j LOG --log-prefix " |
| - | $IPTB -A INPUT -p tcp -m state --syn --state NEW --dport 22 -m limit --limit 1/minute --limit-burst 1 -j ACCEPT | + | $IPTB -A INPUT -p tcp --tcp-flags ALL FIN -j DROP |
| - | $IPTB -A INPUT -p tcp -m state --syn --state NEW --dport 22 -j DROP | + | |
| - | + | $IPTB -A INPUT -p tcp --tcp-flags ALL URG, | |
| - | | + | $IPTB -A INPUT -p tcp --tcp-flags ALL URG, |
| - | for i in $TCP_PORTS | + | |
| + | #SYN and RST are both set | ||
| + | $IPTB -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j LOG --log-prefix " | ||
| + | $IPTB -A INPUT -p tcp --tcp-flags SYN,RST SYN,RST -j DROP | ||
| + | |||
| + | # what we allow from Internet | ||
| + | for i in $TCP_PORTS | ||
| do | do | ||
| - | $IPTB -A INPUT -p tcp -m state --syn --state NEW --dport $i -j ACCEPT | + | $IPTB -A INPUT -p tcp -m state --syn --state NEW --dport $i -j ACCEPT |
| - | done | + | done |
| - | + | ||
| - | $IPTB -A INPUT -p udp -m multiport --dport $UDP_PORTS -j ACCEPT | + | # what we allow from Internet - UDP ports |
| - | + | $IPTB -A INPUT -p udp -m multiport --dport $UDP_PORTS -j ACCEPT | |
| - | # identd requests | + | |
| - | $IPTB -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset | + | # identd requests |
| - | + | $IPTB -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset | |
| - | # traceroute | + | |
| - | $IPTB -A INPUT -p udp -m limit --limit 3/ | + | # traceroute |
| - | + | $IPTB -A INPUT -p udp -m limit --limit 3/ | |
| - | # Log and drop ICMP fragments (shouldn' | + | |
| - | $IPTB -A INPUT -i $INTERNET --fragment -p icmp -j LOG --log-prefix " | + | # Log and drop ICMP fragments (shouldn |
| - | $IPTB -A INPUT -i $INTERNET --fragment -p icmp -j DROP | + | $IPTB -A INPUT -i $INTERNET --fragment -p icmp -j LOG --log-prefix " |
| - | + | $IPTB -A INPUT -i $INTERNET --fragment -p icmp -m hashlimit --hashlimit 10/second --hashlimit-burst 1 --hashlimit-mode srcip --hashlimit-name icmp-frag | |
| - | # thou shall NOT block ALL ICMP, but only allow usefull ICMP types to pass trough | + | |
| - | $IPTB -A INPUT -p icmp --icmp-type 0 -m limit --limit 30/second -j ACCEPT | + | # thou shall NOT block ALL ICMP, but only allow usefull ICMP types to pass trough |
| - | $IPTB -A INPUT -p icmp --icmp-type 3 | + | # echo-reply |
| - | $IPTB -A INPUT -p icmp --icmp-type | + | #$IPTB -A INPUT -p icmp --icmp-type 0 -m hashlimit |
| - | $IPTB -A INPUT -p icmp --icmp-type 11 -m limit --limit 30/ | + | # unreachables |
| - | $IPTB -A INPUT -p icmp --icmp-type | + | $IPTB -A INPUT -p icmp --icmp-type |
| - | #icmp-traceroute | + | # source-quench (depreciated) |
| - | $IPTB -A INPUT -p icmp --icmp-type 30 -m limit --limit 30/ | + | #$IPTB -A INPUT -p icmp --icmp-type |
| - | + | # timeout (forward loop prevention) | |
| - | | + | $IPTB -A INPUT -p icmp --icmp-type |
| - | $IPTB -A INPUT -p icmp --icmp-type | + | # parameter problem |
| - | + | $IPTB -A INPUT -p icmp --icmp-type 12 -m hashlimit | |
| - | # if the default policy is not DROP then we must use this | + | #icmp-traceroute |
| - | # | + | $IPTB -A INPUT -p icmp --icmp-type 30 -m hashlimit |
| - | + | # echo-request | |
| - | # FORWARD TABLE | + | $IPTB -A INPUT -p icmp --icmp-type 8 -m hashlimit |
| - | $IPTB -P FORWARD DROP | + | |
| - | + | # if the default policy is not DROP then we must use this | |
| - | # port forwarding | + | #$IPTB -A INPUT -p icmp -j DROP |
| - | #$IPTB -A FORWARD -p tcp -i $INTERNET -m multiport --dport $FWD_TCP_PORTS -j ACCEPT | + | |
| - | + | ||
| - | | + | |
| - | # list forwarder ports in separate command lines | + | |
| - | #$IPTB -t nat -A PREROUTING -p tcp -i $INTERNET | + | |
| - | #$IPTB -t nat -A PREROUTING -p tcp -i $INTERNET | + | |
| - | # END / port forwarding | + | |
| - | + | ||
| - | # statefull firewall | + | |
| - | #$IPTB -A FORWARD | + | |
| - | $IPTB -A FORWARD | + | |
| - | $IPTB -A FORWARD | + | |
| - | $IPTB -A FORWARD | + | |
| - | + | ||
| - | $IPTB -A FORWARD | + | |
| - | $IPTB -A FORWARD | + | |
| - | + | ||
| - | # NAT (IP masquerading) | + | |
| - | # | + | |
| | | ||
| - | | + | # FORWARD TABLE |
| - | $IPTB -t nat -A POSTROUTING -o $INTERNET -s $LAN -j SNAT --to-source $GW_IP | + | $IPTB -P FORWARD DROP |
| | | ||
| - | | + | # port forwarding |
| - | #$IPTB -I FORWARD --protocol | + | #$IPTB -A FORWARD -p tcp -i $INTERNET -m multiport --dport $FWD_TCP_PORTS -j ACCEPT |
| - | $IPTB -I FORWARD -o $INTERNET | + | |
| + | # START / port forwarding | ||
| + | # list forwarder ports in separate command lines | ||
| + | #$IPTB -t nat -A PREROUTING -p | ||
| + | #$IPTB -t nat -A PREROUTING -p tcp -i $INTERNET --dport 6346 -j DNAT --to 192.168.1.10 | ||
| + | # END / port forwarding | ||
| + | |||
| + | # statefull firewall | ||
| + | # | ||
| + | $IPTB -A FORWARD -m state --state INVALID -j DROP | ||
| + | $IPTB -A FORWARD | ||
| + | $IPTB -A FORWARD | ||
| + | |||
| + | $IPTB -A FORWARD | ||
| + | $IPTB -A FORWARD -m pkttype --pkt-type multicast -j DROP | ||
| | | ||
| - | | + | # NAT (IP masquerading) |
| - | # in " | + | #$IPTB -t nat -A POSTROUTING -o $INTERNET -j MASQUERADE |
| - | #for mac in `cat valid-macs`; | + | |
| + | # NAT but to certain IP (if we have multiple Internet IPs) | ||
| + | $IPTB -t nat -A POSTROUTING -o $INTERNET -s $LAN -j SNAT --to-source $GW_IP | ||
| + | |||
| + | # ADSL (PPPoE connections) | ||
| + | #$IPTB -I FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu | ||
| + | $IPTB -I FORWARD -o $INTERNET -p tcp --tcp-flags SYN,RST SYN -m tcpmss --mss 1400:1536 -j TCPMSS --clamp-mss-to-pmtu | ||
| + | |||
| + | # we allow only access to network cards (NIC) that have their MAC addresses listed | ||
| + | # in " | ||
| + | #for mac in `cat valid-macs`; | ||
| + | |||
| + | # OUTPUT | ||
| + | $IPTB -P OUTPUT DROP | ||
| + | |||
| + | # only allow NEW and related connections out | ||
| + | $IPTB -A OUTPUT -m state --state NEW, | ||
| | | ||
| - | | + | # list the rules |
| - | $IPTB -L -v -n | + | $IPTB -L -v -n --line |
| + | $IPTB -t nat -L -v -n --line | ||
| | | ||
| - | | + | echo $WE_HAVE_INTRANET > / |
| + | |||
| + | </ | ||

