Iptables ve yaygın güvenlik duvarı tuzaklarında hata ayıklama?


18

Bu, Linux sistemlerindeki yazılım güvenlik duvarını anlama ve hata ayıklama hakkında önerilen bir Kanonik Soru .

EEAA'nın cevabı ve @ Shog'un yorumuna yanıt olarak iptables ile ilgili nispeten basit soruları kapatmak için uygun bir kanonik soru-cevap ihtiyacımız var.

Kullanıcı yazılımı arayüzü iptables tarafından sıkça atıfta bulunulan netfilter paket filtreleme çerçevesi olan Linux yazılım güvenlik duvarı ile ilgili sorunları gidermek için yapılandırılmış bir yöntem nedir ?

Sık karşılaşılan tuzaklar, yinelenen sorular ve zaman zaman güvenlik duvarı yöneticisinin göz ardı edebileceğini veya bilmekten fayda sağlayabileceğini kontrol etmek için basit veya biraz daha belirsiz şeyler nelerdir?

UFW , FirewallD (aka firewall-cmd), Shorewall veya benzeri takımlar kullandığınızda bile, bu araçların sunduğu soyutlama katmanı olmadan kaputun altına bakmaktan faydalanabilirsiniz.

Bu soru, güvenlik duvarları oluşturmak için Nasıl Yapılır olarak tasarlanmamıştır: bunun için ürün belgelerine bakın ve örneğin iptables Trips & Tricks için tariflere katkıda veya etiketli sorularını mevcut sık ve iyi sayılan yüksek puanlama için arayın S & A.


1
Performansı artırmak ve güvenliği artırmak için zincirde daha erken yerleştirilebilen NAT ve durum bilgisi kurallarına ne dersiniz?
Matt

1
@Matt: güvenlik duvarı kurallarını optimize etmek başlı başına tam bir soru-cevap ve bu soru-cevapta burada
açılmayacağım

1
IPtables'da yapmanız gereken kurala ulaşmazsanız, benzer bir LOG kuralı ekleyin ve LOG iletilerini alana kadar zincirde daha fazla seyahat edin. Ardından, aşağıdaki kurallardan biri, paketinizde yanlış eşleşen kural olacaktır.
Matthew Ife

1
Oh ve net.netfilter.nf_conntrack_log_invalid255 için ayarı oldukça güzel, hangi kötü davranış üreten netfilter thats stateful parçası yardımcı olabilir geçersiz paketleri yakalar.
Matthew Ife

Yanıtlar:


14

Genel olarak:

Güvenlik duvarı yapılandırmasını görüntülemek ve değiştirmek, rootsınırlı bağlantı noktası numarası aralığında hizmetlerin açılması gibi yönetici ayrıcalıklarına ( ) ihtiyaç duyar . Bu, ya oturum açmanız gerektiği anlamına gelir ya rootda alternatif sudoolarak komutu root olarak çalıştırmak için kullanılır . Bu tür komutları isteğe bağlı olarak işaretlemeye çalışacağım [sudo].

İçindekiler:

  1. Sipariş konularda veya arasındaki fark -Ive-A
  2. Geçerli güvenlik duvarı yapılandırmasını görüntüleme
  3. Çıkışını yorumlama iptables -L -v -n
  4. Ortamınızı tanıyın
  5. INPUT ve FORWARD zincirleri
  6. Çekirdek modülleri

1. Sipariş konularda ya arasındaki fark -Ive-A

Hatırlanması gereken şey, güvenlik duvarı kurallarının listelendikleri sırayla kontrol edilmesidir. Bir pakete veya bağlantıya izin veren veya devre dışı bırakan bir kural tetiklendiğinde çekirdek zinciri işlemeyi durduracaktır.

Bence en yaygın hata acemi duvarı yöneticileri için böyle aşağıda biri olarak, yeni bir liman açmak için doğru talimatları takip olmasıdır:

[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT

ve sonra bunun etkili olmayacağını keşfedin.

Bunun nedeni, -Aseçeneğin tüm yeni kurallardan sonra ve yeni güvenlik duvarındaki son kuralın, açık bir şekilde izin verilmeyen tüm trafiği engelleyen,

...
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
8        0  0    ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080

Veya iptables-save eşdeğeri:

...
iptables -A INPUT  -j REJECT
iptables -A INPUT  -p tcp --dport 8080 -j ACCEPT

ve 8080 numaralı TCP bağlantı noktasını açan yeni kurala asla ulaşılamaz. (inatla 0 paket ve sıfır baytta kalan sayaçlar tarafından kanıtlandığı gibi).

Kuralı -Iyeni kuralla ekleyerek zincirde ilk olurdu ve çalışacaktır.

2. Geçerli güvenlik duvarı yapılandırmasını görüntüleme

Güvenlik duvarı yöneticisi için önerim, kullanıcı dostu araçlardan güvenlik duvarı sorunlarını teşhis etmeye çalışmak yerine Linux çekirdeğinin çalıştığı gerçek yapılandırmaya bakmaktır. Genellikle altta yatan sorunları anladıktan sonra, bunları bu araçlar tarafından desteklenen bir konuda kolayca çözebilirsiniz.

Komut [sudo] iptables -L -v -narkadaşın (bazı insanlar iptables-savedaha iyi olsa da ). Genellikle yapılandırmalar tartışılırken, --line-numberssatırları numaralandırmak için seçeneği kullanmak da yararlıdır . #X kuralına atıfta bulunmak onları tartışmayı biraz daha kolaylaştırır.
Not: NAT kuralları iptables-saveçıktıya dahil edilir, ancak -t natseçenek ekleyerek ayrı olarak listelenmelidir [sudo] iptables -L -v -n -t nat --line-numbers.

Komutu birkaç kez çalıştırmak ve sayaçları artırmak için kontrol etmek, yeni bir kuralın gerçekten tetiklenip tetiklenmediğini görmek için yararlı bir araç olabilir.

[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     784K   65M fail2ban-SSH  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
2    2789K  866M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3       15  1384 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain fail2ban-SSH (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       117.239.37.150       0.0.0.0/0           reject-with icmp-port-unreachable
2        4   412 REJECT     all  --  *      *       117.253.208.237      0.0.0.0/0           reject-with icmp-port-unreachable

Alternatif olarak, çıktısı iptables-save, yukarıdaki güvenlik duvarı yapılandırmasını yeniden oluşturabilecek bir komut dosyası verir:

[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT

Anlaşılması daha kolay bulacağınız bir tercih meselesidir.

3. çıkışını yorumlama iptables -L -v -n

Politika varsayılan eylemi zincir kullanımlarını hiçbir açık kural maçları ayarlar. Gelen INPUTtüm trafiği KABUL olarak ayarlanır zinciri.

GİRİŞ zincirinin ilk kural TCP bağlantı noktası 22 (için mukadder tüm trafiği (kaynak 0.0.0.0/0 ve hedef 0.0.0.0/0) gönderir, hemen ilginç bir tanesidir tcp dpt:22() özel bir hedefe SSH varsayılan port fail2ban-SSH) . Adından da anlaşılacağı gibi, bu kural fail2ban (diğer şeylerin yanı sıra sistem günlük dosyalarını olası kötüye kullanım için tarayan ve kötüye kullanıcının IP adresini engelleyen bir güvenlik ürünü) tarafından korunur.

Bu kural iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSHiptables-save as çıktısına benzer bir iptables komut satırı tarafından oluşturulmuş olurdu -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH. Genellikle bu gösterimlerden herhangi birini belgelerde bulabilirsiniz.

Sayaçlar, bu kuralın 784'000 paket ve 65 Megabayt veriyle eşleştiğini gösterir.

Bu ilk kurala uyan trafik, fail2ban-SSHstandart olmayan bir zincir olarak OUTPUT zincirinin altında listelenen zincir tarafından işlenir .

Bu zincir, her bir istismarcı için bir tane (kaynak ip adresi 117.253.221.166 veya 58.218.211.166) engellenen (a ile reject-with icm-port-unreachable) iki kuraldan oluşur .

 -A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
 -A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable

Engellenen ana bilgisayarlardan olmayan SSH paketlerine henüz izin verilmiyor veya izin verilmiyor ve şimdi özel zincirin tamamlanacağı GİRİŞ zincirindeki ikinci kurala göre kontrol edilecek.

Bağlantı noktası 22 için hedeflenmeyen tüm paketler INPUT zincirindeki ilk kuralı geçti ve INPUT kuralı # 2'de de değerlendirilecek.

INPUT kural numarası 2 , bunun bağlantıları izleyen durum bilgisi olan bir güvenlik duvarı olmasını sağlar . Bunun bazı avantajları vardır, sadece yeni bağlantılar için paketlerin tüm kural setine göre kontrol edilmesi gerekir, ancak izin verildiğinde, kurulmuş veya ilgili bir bağlantıya ait ek paketler daha fazla kontrol edilmeden kabul edilir.

Giriş kuralı # 2, açık ve ilgili tüm bağlantılarla eşleşir ve bu kurala uyan paketlerin daha fazla değerlendirilmesi gerekmez.

Not: durum bilgisi olan bir güvenlik duvarının yapılandırmasındaki kural değişiklikleri, kurulan bağlantıları değil, yalnızca yeni bağlantıları etkiler.

Buna karşılık, basit bir paket filtresi, bağlantı durumunu izlemeden her paketi tüm kural kümesine karşı test eder. Böyle bir güvenlik duvarında durum anahtar sözcükleri kullanılmaz.

INPUT kuralı # 3 oldukça sıkıcı, geri döngü ( loveya 127.0.0.1) arayüzüne bağlanan tüm trafiğe izin verilir.

INPUT kuralları 4, 5 ve 6, YENİ bağlantılara erişim izni vererek (mevcut bağlantılara zaten INPUT kural 2 tarafından izin verilir) 22, 80 ve 443 numaralı TCP bağlantı noktalarını (sırasıyla SSH, HTTP ve HTTPS için varsayılan bağlantı noktaları) açmak için kullanılır.

Durum bilgisi olmayan bir güvenlik duvarında bu kurallar durum nitelikleri olmadan görünür:

4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0

veya

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Son INPUT kuralı, # 7, INPUT kural 1-7'de erişim verilmeyen tüm trafiği engelleyen bir kuraldır. Oldukça yaygın bir sözleşme: izin verilmeyen her şey reddedilir. Teorik olarak, bu kural varsayılan POLİTİKAYI REDDET olarak ayarlanarak atlanabilirdi.

Daima tüm zinciri araştırın.

4. Ortamınızı tanıyın

4.1. Yazılım güvenlik duvarındaki ayarlar, ağın başka bir yerinde tutulan güvenlik ayarlarını etkilemez, yani iptablesyönlendiricilerdeki veya ağınızdaki diğer güvenlik duvarlarındaki değiştirilmemiş erişim kontrol listeleriyle bir ağ hizmeti açmanıza rağmen trafiği yine de engelleyebilir ...

4.2. Hiçbir hizmet dinlemiyorsa , güvenlik duvarı ayarlarına bakılmaksızın bağlanamaz ve bağlantı reddedilemez hatası alabilirsiniz . Bu nedenle:

  • Bir hizmetin dinlediğini (doğru ağ arabiriminde / ip adresinde) ve beklediğiniz [sudo] netstat -plnutveya alternatif olarak kullandığınız bağlantı noktası numaralarını kullandığını doğrulayın ss -tnlp.
  • Hizmetlerinizin henüz çalışmaması gerekiyorsa, örneğin netcat ile basit bir dinleyiciyi taklit edin: [sudo] nc -l -p 123veya openssl s_server -accept 1234 [options] bir TLS / SSL dinleyicisine ihtiyacınız varsa ( man s_serverseçenekleri kontrol edin ).
  • Uzak bir ana bilgisayardan denemeden önce sunucunun kendisinden telnet <IP of Server> 123veya yani echo "Hello" | nc <IP of Server> 123TLS / SSL güvenli hizmetini test ederken bağlanabildiğinizi doğrulayın openssl s_client -connect <IP of Server>:1234.

4.3. Hizmetleriniz tarafından kullanılan protokolleri öğrenin. Yeterince anlamadığınız hizmetleri düzgün bir şekilde etkinleştiremez / devre dışı bırakamazsınız. Örneğin:

  • TCP veya UDP kullanılıyor mu veya her ikisi de (DNS'de olduğu gibi)?
  • sabit bir varsayılan bağlantı noktası kullanıyor mu (örneğin bir web sunucusu için TCP bağlantı noktası 80 gibi bir şey)?
  • alternatif olarak değişebilen dinamik bir port numarası seçilir (yani Portmap'a kayıt olan klasik NFS gibi RPC hizmetleri)?
  • rezil FTP , pasif modu kullanmak için yapılandırıldığında hem sabit hem de dinamik bir bağlantı noktası numarası olmak üzere iki bağlantı noktası kullanır ...
  • içindeki hizmet, bağlantı noktası ve protokol açıklamalarının /etc/servicesbir bağlantı noktası kullanan gerçek hizmetle eşleşmesi gerekmez.

4.4. Çekirdek paket filtresi, ağ bağlantısını kısıtlayabilecek tek şey değildir:

  • SELinux ağ hizmetlerini de kısıtlıyor olabilir. getenforceSELinux'un çalışıp çalışmadığını onaylar.
  • Her ne kadar biraz belirsiz hale gelse de TCP Paketleyicileri hala ağ güvenliğini sağlamak için güçlü bir araçtır. Kontrol dosyaları ldd /path/to/service |grep libwrapve /hosts.[allow|deny]kontrol dosyaları.

5. INPUTveya FORWARDZincirler

Zincir kavramı burada daha ayrıntılı olarak açıklanmıştır, ancak kısaca:

INPUTAçabilir ve / veya iptables komutları nerede hizmetler için yakın ağ bağlantı noktaları ana bilgisayarda, yerel olarak çalışan nereye zinciridir.

FORWARDEğer Linux makine köprü, yönlendirici hypervisor gibi davranan ve / veya ağ adresini yapar diğer sistemlere çekirdek tarafından iletilen alır filtre trafik kuralları, fiili sistemlerini değil aynı zamanda Docker kapları ve Sanal konuk Sunucular sunucularını uygulamak nerede zinciridir çeviri ve liman yönlendirme.

Yaygın bir yanlış anlama, bir docker kapsayıcısı veya KVM konukunun yerel olarak çalıştığı için, geçerli filtre kurallarının INPUT zincirinde olması gerekir, ancak genellikle durum böyle değildir.

6. Çekirdek modülleri

Paket filtresi Linux çekirdeğinde çalıştığından, dinamik modül olarak da derlenebilir, aslında çoklu modüller. Çoğu dağıtım, modüller olarak netfilter içerir ve gerekli netfilter modülleri çekirdeğe gerektiği gibi yüklenir, ancak bazı modüller için bir güvenlik duvarı yöneticisinin yüklendiklerinden emin olması gerekir. Bu öncelikle nf_conntrack_ftpyüklenebilen bağlantı izleme modülleri ile ilgilidir insmod.

Çalışan çekirdeğe yüklü olan modüller ile görüntülenebilir lsmod.

Modüllerin yeniden başlatmalar arasında kalıcı olarak yüklenmesini sağlama yöntemi Linux dağıtımına bağlıdır.


1
Artan paket / bayt sayaçları ararken. Yararlı bir araç saati farklı modda kullanmaktır. Böyle Yani bir şey: watch --difference -n 1 iptables -L FORWARD -v -n. Aracın periyodik olarak komutu çalıştırmasına ve değişiklikleri vurgulamasına izin vermek çok daha kolay hale getirir.
Zoredache

1
Sadece zayıf yorumunu gördüm. Bu iyi bir cevap, çok fazla şey ekleyebileceğimden emin değilim. TRACE özelliğini kullanmaktan bahsetmek isteyebilirsiniz .
Zoredache

Bu korkunç (çeşitli argümanlarla) çıktı üzerinden iptables-saveçıktıyı (tercihen -c) her seferinde alacağım iptables -L.
0xC0000022L

7

Farklı protokollerle ilgili yaygın sorunlar

DNS: DNS varsayılan olarak bağlantı noktası 53 UDP'yi kullanır, ancak tek bir UDP veri birimine sığmayan iletiler bunun yerine TCP kullanılarak iletilir (genellikle bölge aktarımları vb.), Bir ad sunucusu çalıştırdığınızda bağlantı noktası 53 TCP'nin de açılmasını gerektirir .

E-posta: Birçok tüketici ISP'sinin SMTP trafiğini (veya en azından varsayılan bağlantı noktası TCP 25) engellemesi, doğrudan e-posta almayı veya göndermeyi imkansız hale getirir ve müşterileri, tüm giden e-postalar ve bazen de gelen e-postalar için ISS'nin SMTP rölesini kullanmak zorunda kalır. . §1.1 ile ilgilidir.

FTP: FTP, iki bağlantının kullanılması konusunda garip bir protokoldür . Birincisi kontrol bağlantısıdır, varsayılan olarak bir FTP sunucusu bunun için TCP bağlantı noktası 21'i dinler. Kontrol bağlantısı, kimlik doğrulama ve düzenleme komutları için kullanılır. Gerçek dosya aktarımları ve dizin listesinin çıktısı gibi şeyler ikinci bir TCP bağlantısı, DATA bağlantısı üzerinden geçer. Aktif FTP'de bu DATA bağlantısı, FTP sunucusundan TCP bağlantı noktası 20'den başlatılır ve FTP istemcisine bağlanır. Aktif FTP, güvenlik duvarlarının ve NAT ağ geçitlerinin arkasındaki kullanıcılarla çok iyi çalışmadığından, çoğunlukla kullanılmaz hale gelmiştir. Çoğu FTP sunucusu bunun yerine Pasif FTP'yi destekler. Pasif FTP ile FTP sunucusu, daha sonra FTP istemcisinin bağlanabileceği ikinci bir bağlantı noktasında DATA bağlantısı için bir dinleyici açar. Güvenlik duvarının sorunu, DATA bağlantı noktasının 1024-65536 arasında kullanılabilir herhangi bir özelleştirilmemiş bağlantı noktası olabilmesidir.

FTP sunucusunun atayabileceği pasif bağlantı noktası sayısının kısıtlanması ve daha sonra bu bağlantı noktalarının açıkça açılmasıyla çözülen durumsuz bir güvenlik duvarında. yani

iptables -A INPUT -p tcp --match multiport --dports 21000:21050 -j ACCEPT

Durum bilgisi olan bir güvenlik duvarında, DATA bağlantı noktasını açıkça açmanız gerekmez, netfilter yardımcı modülü, atanan dinamik bağlantı noktasını tanır ve DATA bağlantısını RELATEDgenel kuralla eşleşecek şekilde işaretleyerek doğru istemci için bu bağlantı noktasını dinamik olarak açar. :

  iptables -I INPUT -p tcp -m state ESTABLISHED,RELATED -j ACCEPT

Bu, doğru çekirdek çekirdeğinin , örneğin FTP durumunda manuel olarak yüklenmesini gerektirir; bu insmod nf_conntrack_ftp, kalıcı yeniden başlatmaya bağlı kalmanın dağıtımına bağlıdır.

Not: FTP SSL ile kullanıldığında FTP bağlantı izleme modülü başarısız olur, çünkü kontrol bağlantısı şifrelenir ve nf_conntrack_ftp artık PASV yanıtını okuyamaz.

NFS ve benzeri RPC hizmetleri: RPC hizmetleriyle ilgili sorun, tasarım gereği belirli bir sabit bağlantı noktası kullanmamalarıdır. RPC Portmap arka plan programına kaydedilecek olan herhangi bir bağlantı noktasını rasgele seçebilirler. Bağlanmaya çalışan bir istemci Portmap arka plan programını sorgulayacak ve daha sonra doğrudan doğru bağlantı noktasına bağlanacaktır. Bu ayrılmış limanların bitmesi sorununu çözdü ...

Güvenlik duvarı açısından, TCP / UDP bağlantı noktası 111'in ve RPC hizmetinin şu anda kullanmakta olduğu gerçek bağlantı noktasının açılması gerekir. Bu tür rasgele bir bağlantı noktasını bir güvenlik duvarında açma sorunu genellikle NFS sunucusu gibi RPC hizmetinin önceden belirlenmiş bir sabit bağlantı noktası kullanmasıyla kısıtlanarak çözülür.


7

Iptables / Güvenlik duvarı "giriş"

Güvenlik Duvarı temelde ilke tabanlı bir ağ filtresidir. Linux güvenlik duvarları Netfilter etrafında inşa edilmiştir; belirli görevleri gerçekleştiren birkaç çekirdek modülünden oluşan çekirdeğin ağ paketi işleme çerçevesi:

  1. FİLTRE modülü (her zaman varsayılan olarak yüklenir) temel olarak belirli bir eşleşme ölçütlerine göre IP paketlerini KABUL ETMEYE veya DROP ETMEMİZE izin verir.
  2. NAT modül seti, Ağ Adresi Çevirileri (SNAT, DNAT, MASQUERADE) yapmamızı sağlar.
  3. MANGLE modülü, belirli IP paket alanlarını (TOS, TTL) değiştirmemizi sağlar.

Kullanıcılar Netfilter çerçevesini, komut satırından iptables kullanarak güvenlik duvarı gereksinimlerine uyacak şekilde yapılandırır. İptables ile çekirdeğe, Linux kutumuza girdiğinde, içinden geçtiğinde veya Linux kutumuzu terk ettiklerinde IP paketleriyle ne yapmaları gerektiğini bildiren kurallar tanımlarız. Her Netfilter ana işlemi iptables lingo üzerinde bir TABLO (FİLTRE, NAT, MANGLE) ile temsil edilir. Ağ paket akış haritasında, çekirdek tarafından görevlerini yerine getirmeleri için çağrıldıkları birkaç özel kanca noktası vardır. Özel olarak konumlandırılan belirli TABLO çağrıları dizileri genel olarak PREROUTING, INPUT, FORWARD, OUTPUT ve POSTROUTING adlarını alan yerleşik ZİNCİRLER olarak adlandırılır. Bir TABLOyu bir "işlem türü" ile ve bir ZİNCİR, ağ paket akış haritasında bu süreçlerin örneklerinin çağrıldığı "konum" ile ilişkilendirip ilişkilendirmediğimizi hatırlamak kolaydır.

resim açıklamasını buraya girin

Bir IP paketi bir ağ arabiriminde alındığından veya yerel bir işlem tarafından oluşturulduğundan, sonunda teslim edilene veya atılana kadar Netfilter motoru, ağ paketi akış haritası boyunca bulunan kuralları sırayla test eder ve uygular. TABLE @ CHAIN ​​çifti tarafından tanımlanan her blokta kullanıcı, bir IP paketi eşleştirme ölçütleri ve karşılık gelen bir hareket tarzı içeren bu ardışık kurallardan birini veya daha fazlasını ekleyebilir. Birden fazla TABLO ve TABLO'ya özgü diğer eylemler (örn. SNAT, DNAT, vb.) Tarafından gerçekleştirilebilen eylemler (yani KABUL, DÜŞÜR, vb.) Vardır.

yani bir IP paketi bir ağ arayüzünden geldiğinde, önce PREROUTING zinciri tarafından MANGLE tablosu kullanıcı tanımlı kuralları varsa çağırılır. Geçerli paketle eşleşen kurallar yoksa, karşılık gelen MANGLE @ PREROUTING varsayılan hareket şekli veya "ilke" uygulanır. Bu noktada paket düşürülmezse, işlem şimdi PREROUTING zincirindeki NAT tablosunun kurallarını (haritaya bakın) çağırmaya devam edecektir. Kural düzenini kolaylaştırmak için, kullanıcılar kendi özel zincirlerini de oluşturabilir ve haritanın farklı noktalarından istedikleri gibi "zıplayabilirler".

resim açıklamasını buraya girin

Yerleşik zincirler, ACCEPT veya DROP paketlerinin kullanıcı tanımlı politikalarına sahip olsa da, kullanıcı tanımlı zincirlerin, işleme devam etmek için arayana sürekli olarak değiştirilemez bir RETURN varsayılan politikası vardır.

Iptables komutları

İptables ana komutları, ağ paket akış haritasını gerekli işleme kurallarıyla doldurur.

Genel iptables kuralı şu şekilde yazılabilir:

# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>

Şöyle okunabilir:

Netfilter (kernel module) please <Add/Insert/Delete> this rule for <table> at <CHAIN> where packets matching <PKT_MATCHING_CRITERIA> have to be <ACTION>ed

<table>
  -t filter       (the filter table is assumed when omitted)
  -t nat
  -t mangle 

<Add/Insert/Delete>
  -A              (append rule at the end of the chain list)
  -I              (insert rule at the begining of the chain list)
  -D              (Delete rule)

<CHAIN>
  PREROUTING
  INPUT
  FORWARD
  OUTPUT
  POSTROUTING
  USER_DEFINED_CHAIN

<PKT_MATCHING_CRITERIA>
ISO Level-2 matching:
  -i [!] <if_name>    or --in-interface [!] <if_name>
          (OUTPUT and POSTROUTING chains cannot match on input  interfaces)
  -o [!] <if_name>    or --out-interface [!] <if_name>
          (INPUT  and PREROUTING  chains cannot match on output interfaces) 
    -mac-source [!] <xx-xx-xx-xx-xx-xx>
            (OUTPUT and POSTROUTING chains cannot match on input  interfaces)

ISO Level-3 matching:
  -s [!] <src_ip>     or --src [!] <src_ip>   or --source [!] <src_ip>
  -d [!] <dst_ip>     or --src [!] <dst_ip>   or --destination [!] <dst_ip>

ISO Level-4 matching:
  -p [!] <prot_name>    or --protocol [!] <prot_name>  (udp|tcp|icmp)

  Also available when ICMP protocol is defined
  --icmp-type [!] <icmp_type>

  Also available when UDP protocol is defined
  --source-port [!] <udp_src_port>      or --sport [!] <udp_src_port>
  --destination-port [!] <udp_dst_port> or --dport [!] <udp_dst_port>

  Also available when TCP protocol is defined
  --source-port [!] <tcp_src_port>      or --sport [!] <tcp_src_port>
  --destination-port [!] <tcp_dst_port> or --dport [!] <tcp_dst_port>
  --tcp-flags [!] <tcp_flags>   (SYN|ACK|FIN|RST|URG|PSH|ALL|NONE)
    --syn
  --tcp-option [!] <tcp_option#>

  --state [!] <state>
  -m <match> [options]

    note: [!] = negation operator

<ACTION>                (also called TARGET)
  -j ACCEPT             (process continues with rules of the next table in map)
  -j DROP               (discard current packet)
  -j REJECT             (discard current packet with ICMP notification)
      option:
      --reject-with <reject_type>
  -j USER_DEFINED_CHAIN   (start traversing USER_DEFINED_CHAIN rules)
  -j RETURN               (return from USER_DEFINED_CHAIN)
  -j LOG                  (log to syslog, then process next rule in table)
      options:
      --log-level <level>
      --log-prefix <prefix>
      --log-tcp-sequence
      --log-tcp-options
      --log-ip-options
      --log-uid

nat table specific
  -j SNAT             (rewrite the source IP address of the packet)
      option:
      --to <ip_address>
  -j SAME             (idem SNAT; used when more than one source address)
      options:
      --nodst 
      --to <a1-a2>
  -j MASQUERADE       (idem SNAT; used when the replace IP is dynamic)
  -j DNAT             (rewrite the destination IP address of the packet)
      option:
      --to <ip_address>
  -j REDIRECT         (rewrite dst IP to 127.0.0.1, PREROUTING and OUTPUT only)
      option:
      –-to-port <port#>

mangle table specific
  -j ROUTE            (explicitly route packets, valid at PREROUTING)
      options:
      --iface <iface_name>
      --ifindex <iface_idx>
  -j MARK             (set Netfilter mark values)
      options:
      --set-mark <value>
      --and-mark <value>
      --or-mark <value> 
  -j TOS              (set the IP header Type of Service field) 
      option:
      --set-tos <value>
  -j DSCP             (set the IP header Differentiated Services Field)
      options:
      --set-dscp <value>
      --set-dscp-class <class>
  -j TTL              (set the IP header Time To Live field)
      options:
      --ttl-set <value>
      --ttl-dec <value>
      --ttl-inc <value>

İptables yardımcı komutları, varsayılan koşulların, listeleme kurallarının, yıkama kurallarının vb. Ayarlanması senaryosunu tamamlar.

#iptables -t <table> -L             
       (Lists the <table> rules in all chains)
#iptables -t <table> -L <CHAIN>     
       (Lists the <table> rules in <CHAIN>)

#iptables -t <table> -N <CHAIN>     
       (Creates a user-defined <CHAIN> for holding <table> rules)
#iptables -t <table> -E <CHAIN> <NEWCHAIN>  
       (Renames <CHAIN> that holds <table> rules to <NEWCHAIN>)

#iptables -t <table> -X   
       (Deletes all user-defined chains created for holding <table> rules)
#iptables -t <table> -X <CHAIN>
       (Deletes user-defined <CHAIN> created for holding <table> rules)

#iptables -t <table> -P <CHAIN> <ACTION>     where <ACTION> = ACCEPT|DROP
       (Sets the default policy of <table> rules at <CHAIN> to <ACTION>)

#iptables -t <table> -F             
       (Flushes (deletes) all <table> rules in all chains)
#iptables -t <table> -F <CHAIN>
       (Flushes (deletes) all <table> rules in <CHAIN>)

#iptables -t <table> -R <CHAIN> <INDEX> <NEWRULE>
       (Replaces <table> rule at position <INDEX> in <CHAIN> with <NEWRULE>

Iptables komutlarımızı çalışma zamanında Netfilter motoruna yükler, Netfilter inmediatelly yüklenen kuralları ve ayarları zorlar ancak kalıcı değildir. Afeter, önceden yüklenen tüm Netfilter kurallarını ve ayarlarını yeniden başlatır. Bu nedenle, şu anda etkin olan kural kümesini bir dosyaya kaydetmeye ve daha sonra yeniden yüklemeye izin veren iptables yardımcı programları vardır.

#iptables-save > fileName
      (Save the currently active Netfilter ruleset to fileName)

#iptables-restore < fileName
      (Restore Netfilter ruleset to the one saved in fileName)

Iptables Özeti

Netfilter son derece esnek ve güçlü bir çerçevedir ancak bunun için bir bedel vardır; Iptables karmaşıktır. Kullanıcı açısından, TABLO, ZİNCİR, HEDEF gibi belirli terimler temsil ettikleri konseptle çok iyi uyuşmuyor ve ilk başta pek bir anlam ifade etmiyor. Konu uzun, komutların sonsuz bir parametre listesi var gibi görünüyor. İşleri daha da kötüleştirmek için Iptables'da ustalaşan tek bir kitap yok. Çoğunlukla iki kategoriye ayrılırlar: "tarif kitabı" veya "manpage kitabı". Bu girişin size Netfilter / Iptables manzarasının anlık görüntüsünü ve gerekli sindirilmiş manpage malzemelerinin gerekli dozunu verdiğini düşünüyorum. İptables'da yeniyseniz, bu paragrafları birkaç kez okuduktan sonra iptables örneklerini okumaya hazır olacaksınız. Biraz alıştırma yaparak kendinizi kendi kurallarınızı yazarken bulacaksınız.

Güvenlik duvarları

Güvenlik duvarı temel olarak bir dizi kurala dayalı olarak ağ trafiğine dinamik olarak izin vermek veya reddetmek için tasarlanmıştır. Bu noktada, Linux Netfilter / Iptables çerçevesinin güvenlik duvarı yapımı için neden mükemmel olduğunu anlamak kolaydır. Ağ paketi akış haritasına baktığımızda INPUT ve FORWARD zincirlerindeki FILTER tablosunda özellikle ilginç iki nokta buluyoruz; Belirli bir IP paketini KABUL, Reddet veya sadece DROP yaparsak, IP kaynak adresi, IP protokolü (UDP / TCP), hedef portu (80, 21, 443, vb.) Vb. Bu, bir web sunucusunu yetkisiz ağ isteklerine karşı koruduğunda% 80'inin yaptığı bir güvenlik duvarıdır. Zamanın diğer% 20'si (NAT, MANGLE) ağ paketlerini işlemektedir.

Güvenlik Duvarları Senaryoları

Farklı ihtiyaçlar yaratan yüzlerce farklı güvenlik duvarı düzeni vardır, ancak 3 tanesi en tipik güvenlik duvarı senaryoları olarak kabul edilebilir.

  1. Internet'e bağlı bir veya daha fazla arabirime sahip basit web sunucusu. Politika, kısıtlı gelen erişime, kısıtlanmamış giden erişime ve kimlik sahtekarlığıyla mücadele kurallarına izin veren temel kuralları içerir. IP yönlendirme kapalı.
  2. Bu güvenlik duvarı Internet'e ve korumalı bir iç alana bağlanır. Politika, kısıtlı gelen erişime, kısıtlanmamış giden erişime ve kimlik sahtekarlığıyla mücadele kurallarına izin veren temel kuralları içerir. Korunan alan özel IP adresleri kullandığından NAT kaynağı gereklidir. IP yönlendirme açık.
  3. Bu güvenlik duvarı Internet'e, dahili korumalı ve askerden arındırılmış alana bağlanır. Politika, kısıtlı gelen erişime, sınırsız giden erişime ve kimlik sahtekarlığı önleme kurallarına izin veren temel kuralları içerir. Korunan ve DMZ alanları özel IP adresleri kullandığından kaynak ve hedef NAT'a ihtiyaç duyarlar. IP yönlendirme açık. resim açıklamasını buraya girin

Bunu şu için yazdım: http://www.vercot.com/~jeoss/howto/JeossEasyFirewall.html

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.