Önceki konumda ip tables hakkındaki temel bilgilerden kavramlardan bahsetmiştim umarım bu iki konu arasında söz diziminin temellerini araştırmış ve biraz daha hakim konuma gelmişsinizdir. Bu konuyu okumadan önce şiddetle önceki konuyu okumanızı tavsiye ederim.
IPTABLES-PERSISTENT (KURALLARI KALICI HALE GETİRMEK)
iptables içerisinde yazdığınız kurallar ram'e kayıt edilerek çalıştırılır sistemi yeniden başlatmanız durumunda bu kurallar silinecektir, umarım bunu acı bir şekilde deneyimlememişsinizdir. Linux distroları içerisinde bulunan iptables-persistent modülü ile birlikte iptables içerisine yazdığımız kuralları kayıt ederek sistemin boot aşamasında tekrardan yüklenmesini sağlayabiliriz. Bunun için öncelikle iptables-persistent modülünü sistemimize eklememiz gerekmektedir. Kullandığınız distroya göre modül/paket yükleme işlemi farklılık gösterebilir aşağıdaki kod ubuntu distrosu için geçerlidir.
apt update && apt install iptables-persistent
Bu modülün kurulumu esnasında size mevcut ipv4 ve ipv6 kurallarınızı kaydetmek isteyip istemediğizi sormakta bunu durumuna göre Yes / No seçenekleri ile kendiniz ayarlayabilirsiniz.
iptables-persistent modülü çalışma prensibi olarak kuralların /etc/iptables/rules.v4 adresine kayıt edildikten sonra boot esnasında geri yüklemesiyle çalışır.
iptables kurallarınızı bu dosyaya kaydetmek için aşağıdaki komutu kullanabilirsiniz.
iptables-save > /etc/iptables/rules.v4
burada iptables-save komutu tüm kuralların bir kopyasını alarak /etc/iptables/rules.v4 dosyasına yönlendirmektedir. Komut içerisinde görmüş olduğunuz büyüktür işareti linux sisteminde yönlendirme channeling operatörü olarak tanımlanmıştır, yani komut çalışırken okuduğu veriyi belirttiğiniz dosyaya yönlendirerek kayıt ediyor.
Kayıtlı bir kural dosyanız var ve bu dosyayı geri yüklemek istiyorsunuz
iptables-restore < /etc/iptables/rules.v4
komutunu kullanarak rules.v4 dosyasını manuel olarak geri yükleyebilirsiniz. iptables-persistent modülünün görevi bu işlemleri sizin için otomatik olarak halletmesidir.
IPTABLES SOURCE VE DESTINATION IP İLE PAKET ENGELLEME
iptables komutları ile bir domaine giden veya o domain üzerinden gelen tüm bağlantıları engellemek mümkündür bunun için aşağıdaki kodu örnek alabilirsiniz.
iptables -A INPUT -s r10.net -j DROP
iptables -A OUTPUT -d r10.net -j DROP
Yukarıda yazdığımız kodu test etmek amacıyla ping komutu ile r10.net adresine icmp paketleri yollayabiliriz. Bunu yaptığınız taktirde aşağıdaki gibi bir sonuç elde edeceksiniz.
root@linux:~# ping r10.net
PING r10.net (104.26.15.88) 56(84) bytes of data.
--- r10.net ping statistics ---
25 packets transmitted, 0 received, 100% packet loss, time 24565ms
root@linux:~#
Görmüş olduğunuz üzere r10.net adresi bizim ping isteklerimize cevap vermiyor, ben ubuntu-server üzerinden işlemlerimi gerçekleştirdiğim için web tarayıcısı üzerinden bağlanmayı deneyemem ama bunu konsol üzerinden simüle edebiliriz.
Telnet komutu ile birlikte 80 ve 443 portlarına yani HTTP ve HTTPS portlarına bağlanmayı deneyelim.
root@linux:~# telnet r10.net 80
Trying 172.67.71.197...
root@linux:~# telnet r10.net 443
Trying 104.26.14.88...
root@linux:~#
Birkaç saniye sonrasında bu satırları beklemekten yorulup CTRL + C ile işlemi sonlandırdım, paketler engellendiği için telnet ile daha ilerisine gidemiyoruz.
Daha detaylı bir görüntü istersek aynı portları nmap ile tarayabilir ve durum hakkında bilgi edilebiliriz.
root@linux:~# nmap r10.net -p 80,443
Starting Nmap 7.80 ( https://nmap.org ) at 2022-07-10 02:22 UTC
sendto in send_ip_packet_sd: sendto(4, packet, 28, 0, 172.67.71.197, 16) => Operation not permitted
Offending packet: ICMP [192.168.85.131 > 172.67.71.197 Echo request (type=8/code=0) id=23115 seq=0] IP [ttl=58 id=29652 iplen=28 ]
sendto in send_ip_packet_sd: sendto(4, packet, 44, 0, 172.67.71.197, 16) => Operation not permitted
Offending packet: TCP 192.168.85.131:52818 > 172.67.71.197:443 S ttl=55 id=50598 iplen=44 seq=3057109184 win=1024 <mss 1460>
sendto in send_ip_packet_sd: sendto(4, packet, 40, 0, 172.67.71.197, 16) => Operation not permitted
Offending packet: TCP 192.168.85.131:52818 > 172.67.71.197:80 A ttl=53 id=12708 iplen=40 seq=0 win=1024
sendto in send_ip_packet_sd: sendto(4, packet, 40, 0, 172.67.71.197, 16) => Operation not permitted
Offending packet: ICMP [192.168.85.131 > 172.67.71.197 Timestamp request (type=13/code=0) id=12169 seq=0 orig=0 recv=0 trans=0] IP [ttl=49 id=884 iplen=40 ]
sendto in send_ip_packet_sd: sendto(4, packet, 40, 0, 172.67.71.197, 16) => Operation not permitted
Offending packet: ICMP [192.168.85.131 > 172.67.71.197 Timestamp request (type=13/code=0) id=64085 seq=0 orig=0 recv=0 trans=0] IP [ttl=45 id=53391 iplen=40 ]
sendto in send_ip_packet_sd: sendto(4, packet, 40, 0, 172.67.71.197, 16) => Operation not permitted
Offending packet: TCP 192.168.85.131:52819 > 172.67.71.197:80 A ttl=39 id=24 iplen=40 seq=0 win=1024
sendto in send_ip_packet_sd: sendto(4, packet, 44, 0, 172.67.71.197, 16) => Operation not permitted
Offending packet: TCP 192.168.85.131:52819 > 172.67.71.197:443 S ttl=41 id=25148 iplen=44 seq=3057043649 win=1024 <mss 1460>
sendto in send_ip_packet_sd: sendto(4, packet, 28, 0, 172.67.71.197, 16) => Operation not permitted
Offending packet: ICMP [192.168.85.131 > 172.67.71.197 Echo request (type=8/code=0) id=63502 seq=0] IP [ttl=57 id=50223 iplen=28 ]
Note: Host seems down. If it is really up, but blocking our ping probes, try -Pn
Nmap done: 1 IP address (0 hosts up) scanned in 3.10 seconds
Yukarıda da görebileceğiniz üzere nmap programını sadece 80 ve 443 portlarını taraması için çalıştırdık daha sonrasında bize Operation not permitted uyarısıyla birlikte bu adresin kapalı olabileceğine dair bir çıktı verdi.
Burada belirtilen "Operation not permitted"uyarısının nedeni yazmış olduğumuz kuralın OUTPUT chaini üzerinden de bizim sistemimizden giden paketleri de engelliyor olmasından kaynaklıdır.
YAZDIĞIMIZ KURALLARI LİSTELEMEK VE TOPLUCA SİLMEK
root@linux:~# iptables -F
root@linux:~# iptables -vnL
Yukarıdaki kod bloğunda iptables -F ile birlikte yazmış olduğumuz kuralları tablodan sildim, tabloyu kontrol etmek amacıyla iptables -vnL komutunu çalıştırdım. Bu komutları çalıştırırken iptables servisinin varsayılan olarak FILTER tablosu üzerinde işlem yaptığını unutmayın, ayrıca dikkat etmeniz gereken bir konu da iptables -F komutu eğer bir chain belirtilmez ise tüm chainler içerisindeki kuralları silecektir.
iptables içerisinde herhangi bir kural kalıp kalmadığını ve policy ayarını kontrol etmek amacıyla kuralları listeledim bunun için iptables -vnL komutunu kullandım. Bu komutu inceleyecek olursak bize aşağıdaki kod bloğundakine benzer bir çıktı verecektir.
Chain INPUT (policy ACCEPT 955 packets, 71088 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 729 packets, 84754 bytes)
pkts bytes target prot opt in out source destination
Burada tüm chainler içerisindeki kuralları ve kuralların detaylarını listeleyebilirsiniz. Aslında listeleme işini gören parametremiz -L parametresidir ancak ben daha detaylı bir şekilde görmek istediğim için -n ve -v parametreleri ile birleştirerek kullandım.
Burada kullandığımız parametreleri inceleyecek olursak eğer;
-n parametresi: Listeyi oluştururken getirilecek olan yazılı değerleri örneğin domain ve portların bağlı olduğu servis isimleri yerine numerik yani sayı formatındaki değerlerini göstermektedir.
-v parametresi: Listeyi oluştururken daha detaylı görmemizi sağlayan parametre aslında -v parametresidir. Bu parametre bize hangi protokol üzerinden output veya input bağlantısı olduğunu veya şu ana kadar bu kural üzerinde kaç paket ve byte'ın işlendiğini göstermektedir.
Bu parametreleri tek tek -n -v -L şeklinde kullanabildiğiniz gibi toplu olarakta kullanabilirsiniz ancak buradaki detay -L parametresinin her zaman en sonda olması gerektiğidir.
Örnek olması amacıyla sadece INPUT chaini üzerinde 3 parametreyi de birlikte kullanalım.
root@linux:~# iptables -vnL INPUT
Chain INPUT (policy ACCEPT 1099 packets, 81444 bytes)
pkts bytes target prot opt in out source destination
Yukarıda yazmış olduğum listeleme kodundan farklı olarak burada -nvL yerine -vnL olarak kullandım bahsettiğimiz gibi -L parametresi sonda olduğu sürece harflerin yeri fark etmemektedir. Burada INPUT chainini belirttiğimiz gibi -F parametresinden sonra chain adı girerek sadece o chaindeki kuralları da temizleyebilirsiniz.