Rozdíly
Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky.
| Obě strany předchozí revize Předchozí verze Následující verze | Předchozí verze | ||
| it:server:firewall-routovani [2022/11/17 20:27] – Petr Nosek | it:server:firewall-routovani [2025/02/05 15:58] (aktuální) – Petr Nosek | ||
|---|---|---|---|
| Řádek 50: | Řádek 50: | ||
| </ | </ | ||
| + | |||
| + | ==== Editace / | ||
| + | |||
| + | Zajisti, aby v souboru bylo následující nastavení: | ||
| + | |||
| + | <code bash> | ||
| + | DEFAULT_INPUT_POLICY=" | ||
| + | DEFAULT_OUTPUT_POLICY=" | ||
| + | DEFAULT_FORWARD_POLICY=" | ||
| + | IPT_MODULES=" | ||
| + | </ | ||
| + | |||
| + | Pokud bych chtěl vypnout IPV6, tak v souboru nastavím: | ||
| + | <code bash> | ||
| + | IPV6=no | ||
| + | </ | ||
| + | |||
| + | ==== Editace / | ||
| + | |||
| + | Zajisti, aby v souboru bylo následující nastavení: | ||
| + | <code bash> | ||
| + | net/ | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Editace / | ||
| + | Na začátek souboru přidat: | ||
| + | |||
| + | <code bash> | ||
| + | *nat | ||
| + | : | ||
| + | |||
| + | # Forward traffic through eth0 - Change to match you out-interface | ||
| + | -A POSTROUTING -s 192.168.0.0/ | ||
| + | COMMIT | ||
| + | </ | ||
| + | |||
| + | |||
| + | Na jiném serveru mám OpenVPN službu a pro tu bylo nutné v tomto souboru před všechna pravidla zase přidat následující kód: | ||
| + | |||
| + | <code bash> | ||
| + | # START OPENVPN RULES | ||
| + | # NAT table rules | ||
| + | *nat | ||
| + | : | ||
| + | # Allow traffic from OpenVPN client to eth0 | ||
| + | -A POSTROUTING -s 10.9.0.0/8 -o ens3 -j MASQUERADE | ||
| + | COMMIT | ||
| + | # END OPENVPN RULES | ||
| + | </ | ||
| + | |||
| + | Dále jsem mezi filtry přidal filtr **: | ||
| + | |||
| + | <code bash> | ||
| + | # Don't delete these required lines, otherwise there will be errors | ||
| + | *filter | ||
| + | : | ||
| + | : | ||
| + | : | ||
| + | : | ||
| + | :port-scan - [0:0] | ||
| + | # End required lines | ||
| + | </ | ||
| + | |||
| + | A za pravidla | ||
| + | |||
| + | <code bash> | ||
| + | # allow all on loopback | ||
| + | -A ufw-before-input -i lo -j ACCEPT | ||
| + | -A ufw-before-output -o lo -j ACCEPT | ||
| + | </ | ||
| + | |||
| + | jsem přidával další pravidla. | ||
| + | |||
| + | <code bash> | ||
| + | # Blacklisting IP | ||
| + | #-I INPUT -m set --match-set blacklist src -j DROP | ||
| + | #-I INPUT -m set --match-set blacklist src -j LOG --log-prefix "IP Blacklisted: | ||
| + | -A ufw-before-input -m set --match-set blacklist src -j LOG --log-prefix "[IP BLACKLISTED] " | ||
| + | -A ufw-before-input -m set --match-set blacklist src -j DROP | ||
| + | </ | ||
| + | |||
| + | |||
| + | Tímto nastavením jsem se inspiroval pro webserver. V pravidlech je důležité změnit vstupní interface, který je uveden jako **wan**. | ||
| + | <code bash> | ||
| + | # Start CUSTOM UFW added by clusterednetworks 2020-10-20 | ||
| + | # https:// | ||
| + | # Limit to 20 concurrent connections on port 80/443 per IP | ||
| + | -A ufw-before-input -p tcp --syn --dport 80 -m connlimit --connlimit-above 20 -j DROP | ||
| + | -A ufw-before-input -p tcp --syn --dport 443 -m connlimit --connlimit-above 20 -j DROP | ||
| + | |||
| + | # Limit to 20 connections on port 80/443 per 2 seconds per IP | ||
| + | -A ufw-before-input -p tcp --dport 80 -i wan -m state --state NEW -m recent --set | ||
| + | -A ufw-before-input -p tcp --dport 80 -i wan -m state --state NEW -m recent --update --seconds 2 --hitcount 20 -j DROP | ||
| + | -A ufw-before-input -p tcp --dport 443 -i wan -m state --state NEW -m recent --set | ||
| + | -A ufw-before-input -p tcp --dport 443 -i wan -m state --state NEW -m recent --update --seconds 2 --hitcount 20 -j DROP | ||
| + | # End Custom UFW by clusterednetworks | ||
| + | </ | ||
| + | |||
| + | Ochrana proti ping flood | ||
| + | |||
| + | <code bash> | ||
| + | # Prevent ping flood | ||
| + | # https:// | ||
| + | -A ufw-before-input -p icmp -m limit --limit 6/s --limit-burst 1 -j ACCEPT | ||
| + | -A ufw-before-input -p icmp -j DROP | ||
| + | </ | ||
| + | |||
| + | Omezení skenování portů | ||
| + | <code bash> | ||
| + | # block port scan | ||
| + | -A ufw-before-input -p tcp --tcp-flags SYN, | ||
| + | -A port-scan -p tcp --tcp-flags SYN, | ||
| + | -A port-scan -p tcp --tcp-flags SYN, | ||
| + | -A port-scan -p tcp --tcp-flags ALL ALL -j LOG --log-prefix "XMAS scan: " | ||
| + | -A port-scan -p tcp --tcp-flags ALL FIN,PSH,URG -j LOG --log-prefix "XMAS B: " | ||
| + | -A port-scan -p tcp --tcp-flags ALL SYN, | ||
| + | -A port-scan -j DROP | ||
| + | </ | ||
| + | ==== Spuštění firewallu ==== | ||
| + | |||
| + | Nakonec zapnout firewall a pokud je všechno ok, tak snížit úroveň logování: | ||
| + | |||
| + | <code bash> | ||
| + | ufw enable | ||
| + | ufw logging medium | ||
| + | </ | ||
| + | |||
| + | |||
| + | ===== IP blacklist pomocí ipset ===== | ||
| + | |||
| + | Nejprve jsem vytvořil si v libovolné složce vytvořím tuto strukturu: | ||
| + | |||
| + | <code bash> | ||
| + | -rwxrwx--- 1 root root 1771 21. kvě 11.52 ip-blacklist | ||
| + | -rw-r--r-- 1 root root 520806 18. lis 23.04 ip-blacklist.conf | ||
| + | -rw-r--r-- 1 root root 16 18. lis 23.04 ip-blacklist-custom.conf | ||
| + | -rw-r-xr-x 1 root root 289 20. kvě | ||
| + | drwxr-xr-x 2 root root 4096 28. led | ||
| + | </ | ||
| + | |||
| + | Obsah souboru **ip-blacklist**. Je vidět, že některé věci mám pro nefunkčnost zakomentované. Soubor má nastavena práva na spouštění. Skript stáhne z internetu z různých blocklistů problematické IP adresy a zkoncentruje je do jednoho souboru. | ||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | # you can ban country | ||
| + | # " | ||
| + | |||
| + | IP_TMP=/ | ||
| + | IP_BLACKLIST=/ | ||
| + | IP_BLACKLIST_TMP=/ | ||
| + | IP_BLACKLIST_CUSTOM=/ | ||
| + | LISTS_FOLDER=/ | ||
| + | |||
| + | # | ||
| + | list=" | ||
| + | |||
| + | BLACKLISTS=( | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | " | ||
| + | ) | ||
| + | |||
| + | |||
| + | #cd $LISTS_FOLDER && rm $LISTS_FOLDER/ | ||
| + | |||
| + | |||
| + | for i in " | ||
| + | do | ||
| + | curl -s " | ||
| + | grep -Po ' | ||
| + | done | ||
| + | |||
| + | #for i in `echo $list`; do | ||
| + | # Download | ||
| + | # wget --quiet http:// | ||
| + | # Grep out all but ip blocks | ||
| + | # cat $i-iptables-blocklist.html | grep -v \< | grep -v \: | grep -v \; | grep -v \# | grep -v \" | grep [0-9] > $i.txt | ||
| + | # Consolidate blocks into master list | ||
| + | # cat $i.txt >> $IP_BLACKLIST_TMP | ||
| + | #done | ||
| + | |||
| + | cat $IP_BLACKLIST_CUSTOM >> $IP_BLACKLIST_TMP | ||
| + | |||
| + | sort $IP_BLACKLIST_TMP -n | uniq > $IP_BLACKLIST | ||
| + | rm $IP_BLACKLIST_TMP | ||
| + | wc -l $IP_BLACKLIST | ||
| + | </ | ||
| + | |||
| + | Zároveň jsem vytvořil soubor **ip-blacklist_custom.conf** do kterého uvádím IP adresy, které chci trvale blokovat. Ještě je potřeba vytvořit skript **ipset_blacklist**: | ||
| + | |||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | IP_BLACKLIST=/ | ||
| + | |||
| + | IPSET=/ | ||
| + | |||
| + | $IPSET list blacklist | ||
| + | |||
| + | if [ $? -ne 0 ] | ||
| + | then $IPSET create blacklist hash:net | ||
| + | fi | ||
| + | |||
| + | $IPSET flush blacklist | ||
| + | egrep -v " | ||
| + | do | ||
| + | $IPSET add blacklist $ip | ||
| + | done | ||
| + | |||
| + | </ | ||
| + | |||
| + | Poslední co zbývá je zajistit, aby se oba skripty spouštěli alespoň 1x týdně. K tomu vytvořím skript **/ | ||
| + | |||
| + | <code bash> | ||
| + | #!/bin/bash | ||
| + | |||
| + | SCRIPT_FOLDER=/ | ||
| + | |||
| + | cd $SCRIPT_FOLDER | ||
| + | |||
| + | su - neprivilegovany_user -c " | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | ===== Blokování vybrané komunikace ===== | ||
| + | |||
| + | Chtěl jsem zablokovat část komunikace, která přichází z vnitřní sítě do internetu. Trochu jsem si naběhnul, protože tam se musí pracovat s blokování forwardowané komunikace. | ||
| + | |||
| + | Editoval jsem soubor **/ | ||
| + | |||
| + | < | ||
| + | # Blocking forwarded communication | ||
| + | -A ufw-before-forward -s 192.168.1.80 -p tcp --dport 8080 -j LOG --log-prefix " | ||
| + | -A ufw-before-forward -s 192.168.1.80 -p tcp -j LOG --log-prefix " | ||
| + | -A ufw-before-forward -s 192.168.1.80 -p udp -j LOG --log-prefix " | ||
| + | -A ufw-before-forward -s 192.168.1.80 -p tcp --dport 8080 -j DROP | ||
| + | -A ufw-before-forward -s 192.168.1.80 -p tcp -j DROP | ||
| + | -A ufw-before-forward -s 192.168.1.80 -p udp -j DROP | ||
| + | </ | ||
| + | |||
| + | Nejprve jsem zkoušel blokovat konkrétní port a nakonec jsem zablokoval všechno. Samozřejmě je možné si vybrat - nemusí se to kombinovat. | ||
| + | |||
| + | Pokud je nějaké spojení již navázané, tak reload firewallu nemusí hned pomoct. Proto jsem ukončil navázaná připojení na dané IP adrese: | ||
| + | |||
| + | <code bash> | ||
| + | conntrack -D -s 192.168.1.80 | ||
| + | </ | ||
| + | |||