IPTABLE'LAR VE GÜVENLİK DUVARI


Bugün iptables ve güvenlik duvarını inceleyeceğiz ve bu ikisinin geçmişini, kurulumu ve bunları Linux dağıtımlarımız için nasıl yapılandırabileceğimizi öğreneceğiz.

Daha fazla vakit kaybetmeden başlayalım.

Öncelikle iptables'ın ne olduğunu bilmemiz gerekiyor. Kıdemli BT profesyonellerinin çoğu bunu biliyor ve onunla da çalışıyordu. Iptables, kullanıcının Linux çekirdeği güvenlik duvarı ve zincirleri tarafından sağlanan güvenlik veya güvenlik duvarı güvenlik tablolarını, kullanıcının güvenlik gereksinimlerini karşılayacak şekilde buna göre güvenlik duvarı kuralları ekleyip çıkarabilmesini sağlayacak şekilde yapılandırmasına olanak tanıyan bir uygulama/programdır. Iptables, kullanıcının en iyi şekilde yararlanabilmesi için farklı çekirdek modülleri ve farklı protokoller kullanır. Örneğin, hem tcp hem de udp için IPv4 (IP sürüm 4/32 bit) için iptables ve IPv6 (IP sürüm 6/64 bit) için ip6tables kullanılır. Normalde iptables kuralları Sistem Yöneticisi veya Sistem Analisti veya BT Yöneticisi tarafından yapılandırılır. Her iptables kuralını yürütmek için root ayrıcalıklarına sahip olmanız gerekir. Linux Çekirdeği, iptables kullanılarak gerçekleştirilebilecek ağ ile ilgili çeşitli işlemleri sağlayabilmek için Netfilter çerçevesini kullanır. Daha önce ipchains, Linux dağıtımlarının çoğunda aynı amaçla kullanılıyordu. Her iptables kuralı doğrudan Linux Çekirdeği tarafından yönetilir ve buna çekirdek görevi denir. Sunucunuzun güvenlik duvarı güvenliğini yapılandırmak için hangi GUI araçlarını veya diğer güvenlik araçlarını kullanırsanız kullanın, günün sonunda iptables kurallarına dönüştürülür ve işlemi gerçekleştirmek için çekirdeğe sağlanır.

İptables'ın yükselişi netfilter ile başlıyor. Paul Rusty Russell, netfilter/iptables'ın ilk yazarı ve arkasındaki düşünce kuruluşuydu. Daha sonra pek çok teknoloji insanı ona katıldı, ardından Netfilter çekirdek ekibini oluşturup oluşturdu ve diğer birçok açık kaynak projesi gibi ortak bir çaba olarak netfilter/iptables projesini geliştirip sürdürdü. Harald Welte 2007'ye kadar eski liderdi ve ardından 2013'e kadar Patrick McHardy başkandı. Şu anda netfilter çekirdek ekibinin başkanı Pablo Neira Ayuso'dur.

Netfilter hakkında daha fazla bilgi edinmek için lütfen bu bağlantıyı ziyaret edin. Netfilter'ın geçmişi hakkında daha fazla bilgi edinmek için lütfen bu bağlantıyı ziyaret edin.

İptables geçmişi hakkında daha fazla bilgi edinmek için lütfen bu bağlantıyı ziyaret edin.

Artık her Linux Çekirdeği iptables ile birlikte geliyor ve tüm ünlü modern Linux dağıtımlarında önceden oluşturulmuş veya önceden yüklenmiş olarak bulunabilir. Çoğu Linux sisteminde iptables bu /usr/sbin/iptables dizinine kuruludur. Ayrıca /sbin/iptables dosyasında da bulunabilir, ancak iptables "temel ikili dosya" yerine daha çok bir hizmete benzediğinden, tercih edilen konum /usr/sbin dizininde kalır.

Ubuntu veya Debian için

sudo apt-get install iptables

CentOS için

sudo yum install iptables-services

RHEL için

sudo yum install iptables

İptables sürümünüzü öğrenmek için terminalinize aşağıdaki komutu yazın.

sudo iptables --version

OpenSUSE 42.1'i durdurmak için aşağıdakini yazın.

sudo /sbin/rcSuSEfirewall2 stop

Tekrar başlatmak için

sudo /sbin/rcSuSEfirewall2 start

Ubuntu'yu durdurmak için aşağıdakini yazın.

sudo service ufw stop

Tekrar başlatmak için

sudo service ufw start

Debian ve RHEL'i durdurmak için aşağıdakini yazın.

sudo /etc/init.d/iptables stop

Tekrar başlatmak için

sudo /etc/init.d/iptables start

CentOS'ta durdurmak için aşağıdakini yazın.

sudo service iptables stop

Tekrar başlatmak için

sudo service iptables start

İprable'larınızda mevcut ve aktif olan tüm kuralları öğrenmek için bir terminal açmanız ve aşağıdakini yazmanız yeterlidir.

sudo iptables -L

Eğer iptables'ta hiçbir kural çıkışı yoksa, iptables güvenlik duvarınızda şu ana kadar eklenmiş bir kural yoksa, aşağıdaki görüntüye benzer bir şey göreceksiniz.

Yukarıdaki resimde üç (3) zincir olduğunu ve bunların INPUT, FORWARD, OUTPUT olduğunu ve herhangi bir kural bulunmadığını görebilirsiniz. Aslında henüz eklemedim.

iptables güvenlik duvarınızın zincirlerinin durumunu öğrenmek için aşağıdakileri yazın.

sudo iptables -S

Yukarıdaki komut ile zincirlerinizin kabul edip etmediğini öğrenebilirsiniz.

Tüm iptables kurallarını temizle

İptables güvenlik duvarınızdaki tüm kuralları temizlemek için lütfen aşağıdakini yazın. Bu normalde iptables kurallarınızı temizleme olarak bilinir.

sudo iptables -F

Yalnızca INPUT zincirini veya herhangi bir zinciri temizlemek istiyorsanız, gereksinimlerinize göre aşağıdaki komutları verin.

sudo iptables -F INPUT
sudo iptables -F OUTPUT
sudo iptables -F FORWARD

KABUL veya BIRAKMA Zincirleri

Belirli bir zinciri kabul etmek veya bırakmak için, gereksinimlerinizi karşılayacak şekilde terminalinizde aşağıdaki komutlardan herhangi birini çalıştırın.

iptables --policy INPUT DROP

Yukarıdaki kural o sunucuya gelen hiçbir şeyi kabul etmeyecektir. Tekrar KABUL durumuna geri döndürmek için aşağıdakileri yapın

iptables --policy INPUT ACCEPT

Aynı şey diğer zincirler için de geçerli

iptables --policy OUTPUT DROP
iptables --policy FORWARD DROP

Not: Varsayılan olarak tüm iptables zincirleri ( INPUT, OUTPUT, FORWARD ) ACCEPT modundadır. Bu, Politika Zinciri Varsayılan Davranışı olarak bilinir.

Herhangi bir bağlantı noktasına izin verme

Ana makinenizde herhangi bir web sunucusu çalıştırıyorsanız, sunucunuzun 80 numaralı bağlantı noktasını dinlemesi veya yanıt vermesi için iptables güvenlik duvarınıza izin vermelisiniz. Varsayılan olarak web sunucusu 80 numaralı bağlantı noktasında çalışır. O zaman bunu yapalım.

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

Yukarıdaki satırda A, ekleme anlamına geliyor, iptables listesine yeni bir kural eklediğimiz anlamına geliyor. INPUT, INPUT zincirini temsil eder. P, protokol anlamına gelir ve dport, hedef bağlantı noktası anlamına gelir. Varsayılan olarak herhangi bir web sunucusu 80 numaralı bağlantı noktasında çalışır. Benzer şekilde SSH bağlantı noktasına da izin verebilirsiniz.

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Varsayılan olarak SSH, 22 numaralı bağlantı noktasında çalışır. Ancak SSH'yi 22 numaralı bağlantı noktasında çalıştırmamak iyi bir uygulamadır. SSH'yi her zaman farklı bir bağlantı noktasında çalıştırın. SSH'yi farklı bir bağlantı noktasında çalıştırmak için favori düzenleyicinizde /etc/ssh/sshd_config dosyasını açın ve 22 numaralı bağlantı noktasını başka bir bağlantı noktasıyla değiştirin.

Diyelim ki 135 numaralı bağlantı noktasını engellemek istiyoruz. Bunu şu şekilde yapabiliriz:

sudo iptables -A INPUT -p tcp --dport 135 -j DROP

sunucunuzun, sunucudan başka bir ana bilgisayara/sunucuya herhangi bir SSH bağlantısı başlatmasını engellemek istiyorsanız aşağıdaki komutu verin

sudo iptables -A OUTPUT -p tcp --dport 22 -j DROP

Bunu yaptığınızda hiç kimse sunucunuzdan SSH bağlantısı başlatmak için sunucunuzu kullanamaz. OUPUT zinciri, başka bir ana bilgisayara giden herhangi bir TCP bağlantısını filtreleyecek ve DROP yapacaktır.

Bağlantı Noktası ile belirli IP'ye izin verme

sudo iptables -A INPUT -p tcp -s 0/0 --dport 22  -j ACCEPT

Burada -s 0/0, herhangi bir IP adresine sahip herhangi bir gelen kaynağı temsil eder. Bu nedenle, sunucunuzun hedef bağlantı noktası 22 olan bir tcp paketine yanıt vermesinin hiçbir yolu yoktur. Yalnızca belirli bir IP'ye izin vermek istiyorsanız aşağıdakini kullanın.

sudo iptables -A INPUT -p tcp -s 12.12.12.12/32 --dport 22  -j ACCEPT

Yukarıdaki örnekte yalnızca 12.12.12.12 IP adresinin SSH bağlantı noktasına bağlanmasına izin veriyorsunuz. Geri kalan IP adresleri 22 numaralı bağlantı noktasına bağlanamayacaktır. Benzer şekilde CIDR değerlerini kullanarak da izin verebilirsiniz. Örneğin

sudo iptables -A INPUT -p tcp -s 12.12.12.0/24 --dport 22  -j ACCEPT

Yukarıdaki örnek, 22 numaralı bağlantı noktasındaki bağlantıyı kabul etmek için tüm bir IP bloğuna nasıl izin verebileceğinizi gösterir. 12.12.12.1'den 12.12.12.255'e kadar IP'yi kabul edecektir.

Bu tür IP adresleri aralığını engellemek istiyorsanız, aşağıdaki gibi ACCEPT'i DROP ile değiştirerek bunun tersini yapın.

sudo iptables -A INPUT -p tcp -s 12.12.12.0/24 --dport 22  -j DROP

Yani 12.12.12.1'den 12.12.12.255 IP adreslerine kadar 22 numaralı port üzerinden bağlantı kurulmasına izin vermeyecektir.

ICMP'yi engelleme

Sunucunuza gelen ve sunucunuzdan gelen ICMP (ping) isteklerini engellemek istiyorsanız aşağıdakileri deneyebilirsiniz. İlki, ICMP ping yankı isteğinin başka bir ana bilgisayara gönderilmemesini engelleyecektir.

sudo iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP

Şimdi google.com'a ping atmayı deneyin. OpenSUSE sunucunuz google.com'a ping atamayacaktır.

Sunucunuza gelen ICMP (ping) yankı isteğini engellemek istiyorsanız terminalinize aşağıdakini yazmanız yeterlidir.

sudo iptables -I INPUT -p icmp --icmp-type 8 -j DROP

Artık herhangi bir ICMP ping yankı isteğine yanıt vermeyecektir. Diyelim ki sunucunuzun IP adresi 13.13.13.13. Ve eğer sunucunuzun IP'sine ping atarsanız, sunucunuzun o ping isteğine yanıt vermediğini göreceksiniz.

MySql/MariaDB Bağlantı Noktasını Engelleme

Mysql veritabanınızı tuttuğu için veritabanınızı dışarıdan gelen eklentilerden korumalısınız. Güvenilir uygulama sunucunuzun IP adreslerinin yalnızca MySQL sunucunuza bağlanmasına izin verin. Diğerini engellemek için

sudo iptables -A INPUT -p tcp -s 192.168.1.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT

Yani 192.168.1.0/24 IP bloğu dışında herhangi bir MySql bağlantısı almayacaktır. MySql varsayılan olarak 3306 portunda çalışır.

SMTP'yi engelleme

Ana sunucunuzda herhangi bir posta sunucusu çalıştırmıyorsanız veya sunucunuz bir posta sunucusu gibi davranacak şekilde yapılandırılmamışsa, sunucunuzun herhangi bir etki alanına herhangi bir spam veya posta göndermemesi için SMTP'yi engellemeniz gerekir. Sunucunuzdan giden postaları engellemek için bunu yapmanız gerekir. Böyle yaparak,

sudo iptables -A OUTPUT -p tcp --dport 25 -j DROP

DDoS'u engelle

Hepimiz DDoS terimine aşinayız. Bundan kurtulmak için terminalinizde aşağıdaki komutu verin.

iptables -A INPUT -p tcp --dport 80 -m limit --limit 20/minute --limit-burst 100 -j ACCEPT

Gereksinimlerinizi karşılamak için sayısal değeri yapılandırmanız gerekir. Bu sadece sürdürülmesi gereken bir standarttır.

ile daha fazlasını koruyabilirsiniz

echo 1 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/lo/rp_filter
echo 1 > /proc/sys/net/ipv4/conf/lo/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/lo/arp_announce
echo 1 > /proc/sys/net/ipv4/conf/all/arp_ignore
echo 2 > /proc/sys/net/ipv4/conf/all/arp_announce
echo 0 > /proc/sys/net/ipv4/icmp_echo_ignore_all
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 1 > /proc/sys/net/ipv4/tcp_window_scaling 
echo 0 > /proc/sys/net/ipv4/tcp_sack
echo 1280 > /proc/sys/net/ipv4/tcp_max_syn_backlog

Bağlantı Noktası Taramasını Engelleme

Sunucunuzun açık portlarını tarayıp sunucu güvenliğinizi bozmaya çalışan yüzlerce kişi var. Engellemek için

sudo iptables -N block-scan
sudo iptables -A block-scan -p tcp —tcp-flags SYN,ACK,FIN,RST RST -m limit —limit 1/s -j RETURN
sudo iptables -A block-scan -j DROP

Burada blok tarama yeni bir zincirin adıdır.

Kötü Bağlantı Noktalarını Engelleme

Sunucunuz için bazı hatalı bağlantı noktalarını da engellemeniz gerekebilir. İşte bunu nasıl yapabileceğiniz.

badport="135,136,137,138,139,445"
sudo iptables -A INPUT -p tcp -m multiport --dport $badport -j DROP
sudo iptables -A INPUT -p udp -m multiport --dport $badport -j DROP

İhtiyaçlarınıza göre daha fazla bağlantı noktası ekleyebilirsiniz.

Firewalld, ağ bağlantılarının veya arayüzlerinin güven düzeyini tanımlayan ağ/güvenlik duvarı bölgelerini destekleyen, dinamik olarak yönetilen bir güvenlik duvarı sağlar. IPv4, IPv6 güvenlik duvarı ayarları, ethernet köprüleri ve IP setleri desteği vardır. Çalışma zamanı ve kalıcı yapılandırma seçenekleri arasında bir ayrım vardır. Ayrıca, güvenlik duvarı kurallarını doğrudan eklemek için hizmetlere veya uygulamalara yönelik bir arayüz sağlar.

System-config-firewall/lokkit içeren eski güvenlik duvarı modeli statikti ve her değişiklik güvenlik duvarının tamamen yeniden başlatılmasını gerektiriyordu. Bu aynı zamanda güvenlik duvarı netfilter çekirdek modüllerinin kaldırılmasını ve yeni yapılandırma için gerekli modüllerin yüklenmesini de içeriyordu. Modüllerin kaldırılması, durum bilgisi olan güvenlik duvarını ve kurulan bağlantıları bozuyordu. Güvenlik duvarı arka plan programı ise güvenlik duvarını dinamik olarak yönetir ve tüm güvenlik duvarını yeniden başlatmadan değişiklikleri uygular. Bu nedenle tüm güvenlik duvarı çekirdek modüllerini yeniden yüklemeye gerek yoktur. Ancak bir güvenlik duvarı arka plan programı kullanmak, arka plan programındaki durumun ve çekirdekteki güvenlik duvarının senkronize olduğundan emin olmak için tüm güvenlik duvarı değişikliklerinin o arka plan programıyla yapılmasını gerektirir. Güvenlik duvarı arka plan programı, iptables ve ebtables komut satırı araçları tarafından eklenen güvenlik duvarı kurallarını ayrıştıramaz. Arka plan programı, D-BUS aracılığıyla mevcut aktif güvenlik duvarı ayarları hakkında bilgi sağlar ve ayrıca PolicyKit kimlik doğrulama yöntemlerini kullanarak D-BUS aracılığıyla değişiklikleri kabul eder.

Dolayısıyla, güvenlik duvarı işlemleri gerçekleştirmek için zincir ve kurallar yerine bölgeleri ve hizmetleri kullanır ve mevcut oturumları ve bağlantıları bozmadan kuralları dinamik olarak yöneterek güncellemelere ve değişikliklere izin verebilir.

Aşağıdaki özelliklere sahiptir.

  • D-Bus API'si.
  • Zamanlanmış güvenlik duvarı kuralları.
  • Belirli güvenlik duvarı kuralları için Zengin Dil.
  • IPv4 ve IPv6 NAT desteği.
  • Güvenlik duvarı bölgeleri.
  • IP seti desteği.
  • Reddedilen paketlerin basit günlüğü.
  • Doğrudan arayüz.
  • Kilitleme: Güvenlik duvarını değiştirebilecek uygulamaların beyaz listeye alınması.
  • iptables, ip6tables, ebtables ve ipset güvenlik duvarı arka uçları desteği.
  • Linux çekirdek modüllerinin otomatik yüklenmesi.
  • Kukla ile entegrasyon.

Güvenlik duvarı hakkında daha fazla bilgi edinmek için lütfen bu bağlantıyı ziyaret edin.

Güvenlik duvarını kurmadan önce lütfen iptables'ı durdurduğunuzdan ve ayrıca iptables'ın artık kullanılmadığından veya çalışmadığından emin olun. Böyle yaparak,

sudo systemctl stop iptables

Bu, iptables'ın sisteminizde oluşmasını durduracaktır.

Daha sonra terminalde aşağıdaki komutu vererek iptables'ın sisteminiz tarafından artık kullanılmadığından emin olun.

sudo systemctl mask iptables

Şimdi iptables'ın durumunu kontrol edin.

sudo systemctl status iptables

Artık güvenlik duvarını sistemimize yüklemeye hazırız.

Ubuntu için

Ubuntu'ya kurmak için önce UFW'yi kaldırmalısınız, ardından Firewalld'u kurabilirsiniz. UFW'yi kaldırmak için terminalde aşağıdaki komutu verin.

sudo apt-get remove ufw

UFW'yi kaldırdıktan sonra terminalde aşağıdaki komutu verin

sudo apt-get install firewall-applet

Veya

Ubuntu Yazılım Merkezi'ni açabilir ve "güvenlik duvarı uygulaması" ifadesini arayabilir veya arayabilir ve ardından bunu Ubuntu sisteminize yükleyebilirsiniz.

RHEL, CentOS ve Fedora için

CentOS sisteminize güvenlik duvarını kurmak için aşağıdaki komutu yazın.

sudo yum install firewalld firewall-config -y

Firewalld'u yapılandırmadan önce, kurulum sonrası güvenlik duvarının durumunu bilmeliyiz. Bunu bilmek için aşağıdakini yazın.

sudo systemctl status firewalld

Güvenlik duvarı bölge bazında çalıştığı için henüz herhangi bir yapılandırma yapmamış olsak da tüm bölgeleri ve hizmetleri kontrol etmemiz gerekiyor.

Bölgeler için

sudo firewall-cmd --get-active-zones

veya

sudo firewall-cmd --get-zones

Varsayılan bölgeyi bilmek için aşağıdaki komutu verin

sudo firewall-cmd --get-default-zone

Ve Hizmetler İçin

sudo firewall-cmd --get-services

Burada güvenlik duvarı kapsamındaki hizmetleri görebilirsiniz.

Önemli bir not, her değişiklikten sonra, değişikliklerinizin gerçekleşebilmesi için güvenlik duvarını yeniden yüklemeniz gerekir.

Varsayılan bölgeyi ayarlamak için

sudo firewall-cmd --set-default-zone=internal

veya

sudo firewall-cmd --set-default-zone=public

Bölgeyi değiştirdikten sonra değişip değişmediğini kontrol edin.

sudo firewall-cmd --get-default-zone
sudo firewall-cmd --permanent --zone=public --add-port=80/tcp

Bu, güvenlik duvarının ortak bölgesine TCP bağlantı noktası 80'i ekleyecektir. 80'i kendi bağlantı noktanızla değiştirerek istediğiniz bağlantı noktasını da ekleyebilirsiniz.

Şimdi güvenlik duvarını yeniden yükleyin.

sudo firewall-cmd --reload

Şimdi durumu kontrol ederek TCP 80 portunun eklenip eklenmediğini kontrol edin.

sudo firewall-cmd --zone=public --list-ports

Burada tcp port 80'in eklendiğini görebilirsiniz.

Veya buna benzer bir şeyi deneyebilirsiniz.

sudo firewall-cmd --zone=public --list-all

Tcp 80 bağlantı noktasını ortak bölgeden kaldırmak için aşağıdakini yazın.

sudo firewall-cmd --zone=public --remove-port=80/tcp

Terminalinizde yankılanan bir “başarılı” metni göreceksiniz.

80'i kendi bağlantı noktanızla değiştirerek istediğiniz bağlantı noktasını da koyabilirsiniz.

Firewalld'a ftp hizmeti eklemek için aşağıdaki komutu uygulayın

sudo firewall-cmd --zone=public --add-service=ftp

Terminalinizde yankılanan bir “başarılı” metni göreceksiniz.

Benzer şekilde smtp servisini eklemek için aşağıdaki komutu verin.

sudo firewall-cmd --zone=public --add-service=smtp

FTP ve smtp'yi, güvenlik duvarına eklemek istediğiniz kendi hizmetinizle değiştirin.

Ftp & smtp servislerini güvenlik duvarından kaldırmak için terminalde aşağıdaki komutu verin.

sudo firewall-cmd --zone=public --remove-service=ftp
sudo firewall-cmd --zone=public --remove-service=smtp

Dilerseniz güvenlik duvarını kullanarak gelen veya giden paketleri/bağlantıları engelleyebilirsiniz. Bu, güvenlik duvarının "paniklemesi" olarak bilinir. Bunu yapmak için aşağıdaki komutu verin.

sudo firewall-cmd --panic-on

Terminalinizde yankılanan bir “başarılı” metni göreceksiniz.

Bunu yaptıktan sonra, bir ana bilgisayara ping atamayacak ve hatta herhangi bir web sitesine göz atamayacaksınız.

Bunu kapatmak için terminalinizde aşağıdaki komutu verin.

sudo firewall-cmd --panic-off
sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.4" accept'

Bunu yaparak, güvenlik duvarı kaynak IP 192.168.1.4'ten IP v4 paketlerini kabul edecektir.

Benzer şekilde herhangi bir IP adresini engellemek için

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.1.4" reject'

Bunu yaparak, güvenlik duvarı her IP v4 paketini kaynak IP 192.168.1.4'ten bırakır/atar.

Burada Firewalld'ın temellerini anlattım, böylece çalışma metodolojisini ve iptables ile arasındaki farkları kolayca anlayabilirsiniz.

Hepsi bugün için. Umarım bu makaleyi okumaktan keyif alırsınız.

Dikkatli ol.

İlgili makaleler: