Iptables ile gelen tüm bağlantılar reddedilsin mi?


17

Tüm gelen bağlantıları reddetmek ve giden izin vermek için bazı basit iptables kuralları yapmak istiyorum. Bunu nasıl yapabilirim?

Yanıtlar:


27

Kök erişimi ile bunu deneyin:

# Set default chain policies
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT

# Accept on localhost
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

# Allow established sessions to receive traffic
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Bunun tüm çalışan bağlantıları acımasızca keseceğini unutmayın - buna sunucuyu yönetmek için kullanabileceğiniz SSH bağlantısı gibi şeyler de dahildir. Bunu yalnızca yerel bir konsola erişiminiz varsa kullanın.

SSH için bir istisna ekleme hakkında bilgi için Miphix'in cevabına bakınız.


2
Kuralınızın ilk satırını yaptığımda, SSH ile bağlantım
koptu

7
Soru "gelen tüm bağlantıları reddet" ve "SSH hariç tüm gelen bağlantıları reddet" :)
Yohann

Ben ilk kural hakkında çok geç @holms uyarı okumak ...
DenisKolodin

Bunun ipv6 Trafik üzerinde bir etkisi olmadığını unutmayın. İpv6 etkinse aşağıdaki cevabımı okuyun.
bhelm

13

SSH üzerinden uzaktan çalışıyorsanız, bunu eklemek isteyebilirsiniz ( -Idiğer tüm kurallardan önce ekler INPUT):

iptables -I INPUT -p tcp --dport 22 -j ACCEPT

SSH hizmetiniz başka bir bağlantı noktasını dinliyorsa, bunun yerine bu bağlantı noktasını kullanmanız gerekir 22.

Aksi takdirde, erişimi yanlışlıkla kaybedebilirsiniz.


3

Diğer cevapların IPv6'yı kapsamadığını unutmayın! Sisteminiz IPv6 trafiğini kabul ederse, ipv6 trafiğine tek bir iptables kuralı uygulanmaz.

doğrudan iptables / ip6tables kullanmak yerine, iptables-restore ve save kullanmanızı öneririm. Bu araçlar, birden çok kurala sahip bir iptables yapılandırması belirtmeye ve bir komutla kolayca yüklemeye izin verir.

Aşağıdaki içeriğe sahip bir dosya (i iptables.rules olarak adlandırdım) oluşturun:

*filter

# drop forwarded traffic. you only need it of you are running a router
:FORWARD DROP [0:0]

# Accept all outgoing traffic
:OUTPUT ACCEPT [623107326:1392470726908]


# Block all incoming traffic, all protocols (tcp, udp, icmp, ...) everything.
# This is the base rule we can define exceptions from.
:INPUT DROP [11486:513044]

# do not block already running connections (important for outgoing)
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

# do not block localhost
-A INPUT -i lo -j ACCEPT

# do not block icmp for ping and network diagnostics. Remove if you do not want this
# note that -p icmp has no effect on ipv6, so we need an extra ipv6 rule
-4 -A INPUT -p icmp -j ACCEPT
-6 -A INPUT -p ipv6-icmp -j ACCEPT

# allow some incoming ports for services that should be public available
-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

# commit changes
COMMIT

Belirli bağlantı noktalarına ICMP ve trafiğe izin vermek istiyorsanız bazı ekstra örnekler ekledik.

şimdi bu komutlarla yükleyebilirsiniz:

iptables-restore < iptables.rules
ip6tables-restore < iptables.rules

Artık kurallarınız ipv6'yı da kapsar ve yönetimi kolaydır.

Debian kullanıcıları için ek not: kurallarınızdan memnunsanız, apt install iptables-persistentyeniden başlattıktan sonra kuralların geri yüklenmesini sağlayabilirsiniz . Kurallar kapatma sırasında otomatik olarak kaydedilmez, bu nedenle netfilter-persistent savekalıcı kuralları güncellemek için çalıştırın .


1

Yukarıdaki her iki cevap da bir şekilde doğrudur, ancak yanıtın kaynağı olacak kadar doğru değildir. (Üzgünüm yorum eklemek için yeterli üne sahip değilim, bu yüzden tam cevap yazıyorum).

Benim durumumda aşırı yüklü apache sunucusu, cron işleri ile aşırı yüzen, cpu kullanarak tanıştım. Konu sınırları SQL veritabanında saklandı, ancak bağlantı sınırını karşıladım. Yerel ana bilgisayardan gelen apache bağlantılarını sınırlamak istedim (bu bölüm isteğe bağlıdır), ancak diğer tüm bağlantıları mümkün kılmak. Gerçekten kurulmuş olanlar dahil.

Komuta ile yaptım

sudo iptables -I INPUT -p tcp --dport 80 -m state --state NEW -j REJECT

Bunun anlamı: 80 numaralı bağlantı noktasındaki her gelen tcp paketi için yük statemodülü ve eğer bu ilk paketse (gelen bağlantı) reddeder. Localhost için şunları kullanabilirsiniz:-s 127.0.0.0/8

Ve gerçek dünya kullanımı için, bazı durumlarda eyaletlere 'GEÇERSİZ' ekleyebilirsiniz NEW,INVALID, çünkü biri kurallarınızı atlamaya çalışarak "kötü amaçlı" paketler gönderebilir. Ve ayrıca -j DROPgiden trafiğinizi kaydetmek için ile değiştirin (ret işaretini göndermeyecektir)

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.