1. Zablokuj cały ruch wchodzący. Użyj do tego polityki, nie reguły iptables -P INPUT DROP 2. Dodaj regułę umożliwiającą komunikację w obrębie localhosta iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT lub iptables -A INPUT -i lo -j ACCEPT 3. Pozwól wchodzić połączeniom już ustanowionym iptables -A INPUT -m conntrack --ctstate ESTABLISHED -j ACCEPT 4. Pozwól wchodzić połączeniom SSH iptables -A INPUT -p tcp --dport ssh -j ACCEPT 5. Zabroń wchodzenia ruchu SSH z wybranego adresu (1.2.3.4) nie kasując żadnej z powyższych reguł | # iptables --line-numbers -L INPUT | Chain INPUT (policy DROP) | num target prot opt source destination | 1 ACCEPT all -- anywhere anywhere | 2 ACCEPT all -- anywhere anywhere ctstate ESTABLISHED | 3 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh iptables -I INPUT 3 -p tcp --dport ssh -s 1.2.3.4 -j REJECT 6. Wyświetl liczniki, sprawdź ile razy reguła z poprzedniego zadania została uruchomiona iptables -vL 7. Zbadaj (używając wiresharka) czym różni się cel DROP od REJECT nawiązać połączenie z 1.2.3.4 (patrz zadanie 5), zaobserowoać że idzie komunikat w odpowiedzi (tcp rst) zmienić regułę na DROP: iptables -D INPUT 3 iptables -I INPUT 3 -p tcp --dport ssh -s 1.2.3.4 -j DROP nawiązać połączenie z 1.2.3.4 (patrz zadanie 5), zaobserowoać że nic nie idzie w odpowiedzi 8. Sprawdź stan połączenia TCP nawiązywanego do celu który ma ustawiony target DROP netstat -tn lub ss -tn 9. Zablokuj ruch wychodzący do wybranej strony. iptables -A OUTPUT -d example.com -j REJECT lokolwanie też IPv6: ip6tables -A OUTPUT -d example.com -j REJECT 10. Dodaj reguły, które wpuszczą ograniczoną ilość komunikatów ping (moduł limit lub hashlimit) | # iptables -L | Chain INPUT (policy DROP) | target prot opt source destination | ACCEPT all -- anywhere anywhere | ACCEPT all -- anywhere anywhere ctstate ESTABLISHED | DROP tcp -- 1.2.3.4 anywhere tcp dpt:ssh | ACCEPT tcp -- anywhere anywhere tcp dpt:ssh Przykład wpuszczający określoną ilość pingów i odrzucającą resztę: iptables -I INPUT 2 -p icmp --icmp-type echo-request -m limit --limit 10/minute -j ACCEPT iptables -I INPUT 3 -p icmp --icmp-type echo-request -j DROP Przykład odrzucający ponad limit i wpuszczający resztę: iptables -I INPUT 2 -p icmp --icmp-type echo-request -m hashlimit --hashlimit-above 10/minute --hashlimit-name pingi -j DROP iptables -I INPUT 3 -p icmp --icmp-type echo-request -j ACCEPT (reguły są dodane przed wpuszczanie pakietów z już ustanowionych połączeń) 11. Ogranicz ilość połączeń od każdego adresu IP z osobna (connlimit) iptables -A INPUT -m connlimit --connlimit-upto 5 -j REJECT (połączenia ssh są wpuszczane bez limitu regułą wyżej w liście reguł; można to zmienić dodając tą regułę wyżej) 12. Dodaj regułę, która zabroni przekazywania ruchu z br0 do p4p1 iptables -A FORWARD -i br0 -o p4p1 -j REJECT 13. Dodaj regułę bez akcji, która pozwoli zliczać wysłane komunikaty ping iptables -A OUTPUT -p icmp --icmp-type echo-request 14. Dodaj regułę z akcją LOG, która pozwoli logować wystąpienia wybranych pakietów (użyj dmesg do wypisania komunikatów z logu systemu) iptables -A OUTPUT -p tcp --dport 25565 -m conntrack --ctstate NEW -j LOG --log-uid --log-prefix "Conn To Port 25565" (część "-p tcp --dport 25565 -m conntrack --ctstate NEW" wyławia próby nawiązania połączenia na port 25565) (część "-j LOG" loguje pakiety) (część "--log-uid --log-prefix \"Conn To Port 25565\"" dodaje tekst i informację o użytkowniku który wygenerował pakiet) 15. Korzystając z iptables-save zapisz reguły do pliku, następnie wyczyść listę reguł i odtwórz ją z pliku używając iptables-restore iptables-save > rules_ipv4 iptables -F iptables-restore < rules_ipv4