iptables kuralları yalnızca bir alana HTTP trafiğine izin verir


20

Makinemi HTTP sunucusuna yalnızca serverfault.com'a izin verecek şekilde yapılandırmam gerekiyor. Diğer tüm web sitelerine, hizmet bağlantı noktalarına erişilemez. Bu iptables kuralları ile geldim:

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

Oldukça iyi çalışmıyor:

  • Her şeyi bıraktıktan ve kural 3'e geçtikten sonra:

    iptables -A ÇIKIŞ -p tcp -d serverfault.com - dport 80 -j KABUL

Bu hatayı alıyorum:

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

DNS ile ilgili olduğunu düşünüyor musunuz? Ben de izin vermeli miyim? Yoksa sadece IP adreslerini kurallara mı koymalıyım? Yapmaya çalıştığım şeyin daha basit kurallarla elde edilebileceğini düşünüyor musunuz? Nasıl?

Bununla ilgili herhangi bir yardım veya ipucunu takdir ediyorum. Çok teşekkürler!


2
Sstatic.net ve diğerlerini unutmayın. serverfault.com tamamen serverfault.com
Zoredache

Başka bir sistemde proxy çalıştırabilir misiniz? Bu en iyi / en kolay çözümdür: serverfault.com/questions/215134
mattdm

Yanıtlar:


29

IPTables kuralları ile sipariş önemlidir. Kurallar sırayla eklenir ve uygulanır. Ayrıca, kuralları manuel olarak eklerken hemen uygulanır. Böylece, örneğinizde, INPUT ve OUTPUT zincirlerinden geçen tüm paketler, varsayılan ilke ayarlandığı anda bırakılmaya başlar. Bu aynı zamanda, neden yaptığınız hata mesajını aldığınızdır. Olan şu:

  1. Varsayılan DROP politikası uygulanır
  2. IPTable'lar hedef olarak bir ana bilgisayar adı alır
  3. IPTable'lar 'serverfault.com' da DNS araması yapmaya çalışır
  4. DNS araması DROP eylemi tarafından engellendi

Kaynak / hedef seçenekleri ana bilgisayar adlarını kabul ederken, kesinlikle önerilmez. Man sayfasını alıntılamak için,

Ana makine adları, kural çekirdeğe gönderilmeden önce yalnızca bir kez çözümlenir. DNS gibi uzak bir sorgu ile çözümlenecek herhangi bir ad belirtmenin gerçekten kötü bir fikir olduğunu lütfen unutmayın.

Slillibri kafasına çiviyi vurdu, cevabını DNS KABUL kuralını kaçırdınız. Sizin durumunuzda bu önemli olmayacak, ancak genellikle varsayılan politikayı daha sonra işlemde belirleyeceğim. İstediğiniz son şey, uzaktan çalışmak ve varsayılan bir reddetmeyi açtıktan sonra SSH'ye izin vermektir .

Ayrıca, dağıtımınıza bağlı olarak, güvenlik duvarı kurallarınızı başlangıç ​​zamanında otomatik olarak uygulanacak şekilde kaydedebilmeniz gerekir.

Tüm bunları bilmek ve senaryonuzu yeniden düzenlemek, işte size tavsiye edeceğim şey.

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

3
Güzel, iyi hazırlanmış cevap.
JakeRobinson

1
Bunu takdir ediyorum, ama benim hatamı da kaçırmış olmalısın. Hata.
Scott Pack

3
Aslında, iptables -Pzincir ilkeleri yalnızca paketler zincirin sonunda "düştüğünde" uygulandığından, ifadelerinizi komut dosyanızın herhangi bir yerine koyabilirsiniz . Genellikle ilke deyimlerini (genellikle DROPilkeler) iptables komut dosyalarımın üstüne koyarım.
Steven Pazartesi

1
@Steven: Kesinlikle haklısın. OP bunları etkileşimli olarak giriyor gibi görünüyor. SSH üzerinden ana makinenize bağlı olduğunuzu varsayalım ve ilk kuralınız DROP politikası içindir. Daha fazla kural girmeden önce SSH bağlantınız kesilecektir. Bu, farklı bir tezahür ederse, karşılaştığı zamanlama ile aynıdır.
Scott Pack

Teşekkürler. Bunu deniyordum. Ama eklemeden çalışmadı sudo iptables -I OUTPUT 1 -o lo -j ACCEPT. Bu eklenmemeli mi?
Kiran

7

Eklemek

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

DNS aramalarına izin vermek için.


5

Bu tür bir gereksinim bir web proxy ve / veya filtre ile daha iyi ele alınabilir. Dansgaurdian bunu yapacak şekilde yapılandırılabilir. Trafiği filtre boyunca zorlamak için NAT kurallarını kullanmanız gerekir.

Filtrelemek için iptables kullanmak, ilgili IP adreslerinden kullanılabilen sitelere izin verir. Bu normalde tüm ağın küçük bir alt kümesidir.


1
Buna tamamen katılıyorum. iptablesmuhtemelen DNS adları ile iyi ilgilenmediği için burada yanlış bir araçtır. Uygun filtre ayarlarına sahip bir web proxy çok daha uygundur.
Steven Pazartesi

2

Korkarım iptables bu seviyede çalışmıyor, sadece ip adresini önemsiyor, ana bilgisayar adını değil. Aynı ip üzerinde diğer ad sanal bilgisayarlarına erişimi engellemek istiyorsanız, .htaccess dosyaları koymaya bakmanız gerekir.


Mesele şu ki, "her şeyi bırakmadan" kural 3'ü denediğimde iptables ile iyi çalışıyor!
Zenet

2
hmm, soruyu yanlış okudum. Doğru, arka planda olan şey, iptables'ın serverfault.com'u 64.34.119.12'ye çözümleyeceğidir (çözümlemenin neden çalışmadığını anlamak için slillibri'nin cevabına bakınız). Ancak, iptables ana bilgisayar adlarını anlamadığı ve sadece ip'e izin verdiği için, birden fazla siteye sahipse, bu ip üzerindeki herhangi bir web sitesine bağlanabileceksiniz.
Niall Donegan

2
@Emily, kuralın eklenmesi iyi çalışabilir, ancak serverfault.com IP'si değişirse trafiğe izin verilmez. Sık sık değiştirilen yüzlerce adresi olan google.com gibi bir siteye izin vermek hiç işe yaramaz.
Zoredache

1

Bunu web sunucunuzda yapılandırmanız gerekir. iptables bir paket filtredir. HTTP işlemleri site adını (yani stackoverflow) TCP yükünün bir parçası olarak gönderir (yani iptables'ın kolayca okuduğu TCP başlığının bir parçası olarak değil).

Bu ve HTTP işlemlerinin neredeyse kesinlikle birden fazla pakete yayılacağı göz önüne alındığında (yani, HTTP başlığındaki bir dizeyle eşleşemezsiniz), bu web sunucusu yapılandırmanız veya öndeki bir proxy tarafından çok daha iyi işlenir onun.

Bunun ardındaki mantığı bilmek faydalı olacaktır, birkaç başka alternatif daha vardır:

  1. Yanlış URL girerse doğru URL'ye yönlendirin (örn. Www.stackoverflow.com girerse stackoverflow.com adresine yönlendirin)
  2. Web sunucunuza stackoverflow.com dışında bir sunucu sunmamasını söyleyin
  3. Siteyi, başka hiçbir şeyin çözmediği ayrı bir IP'ye yerleştirin ve web sunucunuzun bunu dinlemesini sağlayın.

Merhaba Phil, hangi web sunucusunu anladığımdan emin değilim? Web sunucum yok. Bu yapılandırmayı bilgisayarımda yapıyorum.
Zenet
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.