Yanıtlar:
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.
SSH üzerinden uzaktan çalışıyorsanız, bunu eklemek isteyebilirsiniz ( -I
diğ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.
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-persistent
yeniden başlattıktan sonra kuralların geri yüklenmesini sağlayabilirsiniz . Kurallar kapatma sırasında otomatik olarak kaydedilmez, bu nedenle netfilter-persistent save
kalıcı kuralları güncellemek için çalıştırın .
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 state
modü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 DROP
giden trafiğinizi kaydetmek için ile değiştirin (ret işaretini göndermeyecektir)