iptables İpuçları ve Püf Noktaları [kapalı]


60

Linux sistem yöneticilerinin iptables, netfilterpaket filtreleme çerçevesinin kullanıcı arayüzüne oldukça aşina olduklarından eminim .

Şimdi, bu "Soru", çeşitli bilgelik parçalarını bir araya toplamak için bir Topluluk Wiki'si anlamına geliyordu iptables. Hiçbir şey çok yaygın veya belirsiz değildir. Tanıdıklarınızı, diğerlerinden en iyi şekilde yararlanmaya yardımcı olacak bir şey yayınlayın iptables.

Yanıtlar:


26

Beyaz liste ve kara listeyi iptables ile kullanma

#!/bin/bash

WHITELIST=/whitelist.txt
BLACKLIST=/blacklist.txt

#THIS WILL CLEAR ALL EXISTING RULES!
echo 'Clearing all rules'
iptables -F

#
## Whitelist
#

for x in `grep -v ^# $WHITELIST | awk '{print $1}'`; do
        echo "Permitting $x..."
        $IPTABLES -A INPUT -t filter -s $x -j ACCEPT
done

#
## Blacklist
#

for x in `grep -v ^# $BLACKLIST | awk '{print $1}'`; do
        echo "Denying $x..."
        $IPTABLES -A INPUT -t filter -s $x -j DROP
done

Bağlantı noktalarını açmak için komut dosyası

#!/bin/bash
ALLOWEDTCP="80 3128 3784"
ALLOWEDUDP="3128 3784"

#
## Permitted Ports
#

for port in $ALLOWEDTCP; do
       echo "Accepting port TCP $port..."
       $IPTABLES -A INPUT -t filter -p tcp --dport $port -j ACCEPT
done

for port in $ALLOWEDUDP; do
        echo "Accepting port UDP $port..."
        $IPTABLES -A INPUT -t filter -p udp --dport $port -j ACCEPT
done

Portscan engelleme

# Attempt to block portscans
# Anyone who tried to portscan us is locked out for an entire day.
iptables -A INPUT   -m recent --name portscan --rcheck --seconds 86400 -j DROP
iptables -A FORWARD -m recent --name portscan --rcheck --seconds 86400 -j DROP

# Once the day has passed, remove them from the portscan list
iptables -A INPUT   -m recent --name portscan --remove
iptables -A FORWARD -m recent --name portscan --remove

# These rules add scanners to the portscan list, and log the attempt.
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A INPUT   -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j LOG --log-prefix "Portscan:"
iptables -A FORWARD -p tcp -m tcp --dport 139 -m recent --name portscan --set -j DROP

Sahte / Geçersiz paketler

# Reject spoofed packets
# These adresses are mostly used for LAN's, so if these would come to a WAN-only server, drop them.
iptables -A INPUT -s 10.0.0.0/8 -j DROP
iptables -A INPUT -s 169.254.0.0/16 -j DROP
iptables -A INPUT -s 172.16.0.0/12 -j DROP
iptables -A INPUT -s 127.0.0.0/8 -j DROP

#Multicast-adresses.
iptables -A INPUT -s 224.0.0.0/4 -j DROP
iptables -A INPUT -d 224.0.0.0/4 -j DROP
iptables -A INPUT -s 240.0.0.0/5 -j DROP
iptables -A INPUT -d 240.0.0.0/5 -j DROP
iptables -A INPUT -s 0.0.0.0/8 -j DROP
iptables -A INPUT -d 0.0.0.0/8 -j DROP
iptables -A INPUT -d 239.255.255.0/24 -j DROP
iptables -A INPUT -d 255.255.255.255 -j DROP

# Drop all invalid packets
iptables -A INPUT -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A OUTPUT -m state --state INVALID -j DROP

Şirin saldırı saldırılarını engelle

# Stop smurf attacks
iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
iptables -A INPUT -p icmp -m icmp -j DROP

# Drop excessive RST packets to avoid smurf attacks
iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

Blok ICMP (aka ping)

# Don't allow pings through
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j DROP

4
"Sahte" yorumlara bir yorum eklemeyi düşünün; böylece daha az deneyimli kullanıcılar kaynak adreslerinin neden sahtekar olarak değerlendirildiğini bilir (... bir wan arabirimine gelirken).
10mO

1
İyi karar :-). Bitti.
Bart De Vos

Bekle. Blok ICMP (aka ping) satırı blok şirin saldırı hattına engel değil mi: iptables -Bir GİRİŞ -p icmp -m icmp -j DROP?
Stann

2
Beyaz liste betiğini yeniden yazın: iptablesSatır 8 ve sonra $IPTABLESsonraki satırlar . Sadece iptablesher yerde kullanmak yeterli mi? Aksi halde, IPTABLES=/sbin/iptablesdoğru bir şey atamanız gerekebilir mi?
UpTheCreek

1
Portkansları bu şekilde engellemem. Bunun yerine, tcp / udp bağlantılarını kabul edecek ve ilişkili çok sayıda paket arayan bir şey bulun. tcp kolaydır, sadece bu bağlantı noktalarına kurulanları arayın. Başka herhangi bir şey, diğerleri bunun için sahte paketlerle test edebilir ve ağ geçidi gibi beyaz listeniz olmayan herhangi bir şeyi engelleyebilir.
Aaron,

25

Netfilter'ın Performansını Kullanarak Optimize Edin ipset

Yalnızca IP, port veya her ikisine de benzer pek çok kural yazarsanız , ipsetnetfilter'ın performansını optimize etmek için kullanmayı düşünün .

Örneğin:

iptables -s 192.168.1.11 -j ACCEPT
iptables -s 192.168.1.27 -j ACCEPT
iptables -s 192.168.1.44 -j ACCEPT
... hundreds of similar rules ...
iptables -s 192.168.251.177 -j ACCEPT

Bu, 192.168.251.177 kaynak adresine sahip bir paketin KABUL kararı vermeden önce yüzlerce kuralı geçmesi gerektiği anlamına gelir .

Tabii ki, deneyimli sysadmins kuralları alt ağa böler. Ama bu hala yüzlerce kural anlamına geliyor.

ipset kurtarmak için!

Öncelikle, bir tür IP seti tanımlayın ipmap:

ipset -N Allowed_Hosts ipmap --network 192.168.0.0/16

Ardından, adreslerle doldurun:

for ip in $LIST_OF_ALLOWED_IP; do ipset -A Allowed_Hosts $ip; done

Son olarak, yukarıdaki yüzlerce iptables kuralını bir kuralla değiştirin:

iptables -m set --match-set Allowed_Hosts src -j ACCEPT

Bir paket ulaştığında, netfilter paketin kaynağı (src) IP'sini IP Setine karşı çok hızlı bir bitmap araması gerçekleştirir Allowed_Hosts. 192.168.0.0/16'dan itibaren gelen tüm paketler tek bir kuralla karşılaşacaktır. Ve bir bitmap aramanın yüzlerce iptables kural denetimi gerçekleştirmekten daha az iki büyüklük sırası olduğuna inanıyorum.

ipsetIP adresleriyle sınırlı değildir. Aynı zamanda portlara, IP portuna, ağ / alt ağ adreslerine, IP-MAC'ye ve benzerlerine göre eşleşebilir. Ve bu kriterleri kaynak veya hedef olarak ya da her ikisinin bir karışımı olarak (tuples durumunda) eşleştirebilir.

Sonunda, ipsetIP adreslerini otomatik olarak kara listeye / beyaz listeye koyabilirsiniz. Bu kara listeler / beyaz listeler de yaşlanabilir, bu nedenle yapılandırılabilir bir süre geçtikten sonra IP adresini otomatik olarak siler.

Daha fazla bilgi için lütfen ipsetman sayfasına bakın.

ÇOK ÖNEMLİ NOT:

Bazı dağıtımlarda da olabilir değil 'out-of-the-box' için destek var ipset(örneğin Ubuntu 10,04 Bu sorunu vardı). Bu sistemlerde bir yöntem ipsetkaynak koddan yüklemektir .

Bunun yerine, ipsetkaynağını web sitesinden indirin: http://ipset.netfilter.org/install.html

Kullanmak Alternatif olarak, xtables-addons, ipset edilir kaynağında yer: http://xtables-addons.sourceforge.net/


3
Debian ve Ubuntu'da varsayılan olarak desteklenmiyor olması üzücü. Bazı takıntılı dağıtımları listeleyeceğini düşünmüştüm: /
UpTheCreek

@UpTheCreek Cevabımı düzelttim ... 'özel not' cevabın gönderilmesi sırasında uygulanabilir, ancak artık geçerli değil.
pepoluan

21

Kurallarınıza yorum ekleyin:

-m comment --comment "Comments help to read output of iptables -nvL"

16

Tanınmış TCP Saldırılarını Engelleyin

Aşağıdaki kuralları ekleyin, tercihen -t raw -A PREROUTING

-p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
-p tcp --tcp-flags SYN,RST SYN,RST -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,PSH,URG -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP

Engellenen saldırılar sırasıyla:

  • SYN-FIN saldırısı
  • SYN-RST saldırısı
  • X-Mas saldırısı
  • nmap FIN taraması
  • NULLflags saldırısı
  • ALLflags saldırısı

(yukarıdaki saldırıların adlarını düzenlemek için çekinmeyin)


4
-p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROPOlarak, çıkarılabildi -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROPbu blok olabilir, her paket çekecektir.

4
Security.stackexchange.com/questions/4603/… 'e göre . “Geçersiz veya hatalı biçimlendirilmiş paketleri düşürmeye gerek yok, bu saldırıların tümü on yıldan daha eski. Bazıları tartışabilir. Peki, gelecekteki hatanın iptables TCP ayrıştırıcısında değil, TCP işleyicisinde olacağını nasıl biliyorsunuz? "
Matt

1
@VlastimilBurian teorik olarak artık ihtiyaç duyulmuyor . Ancak bu kurallar grubunun eklenmesi ne ağını yavaşlatmaz ne de CPU Yükünü artırmaz, bu yüzden onları eklemek ve unutmamak için hiçbir neden göremiyorum 😊
pepoluan

7

NAT'ı Etkinleştirme

  1. echo 1 > /proc/sys/net/ipv4/ip_forward
  2. /sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Adım 1, ip yönlendirme için çekirdek parametresini ayarlar, adım 2, eth0 arayüzünde NAT sağlayan bir iptables kuralı oluşturur.


4
Bu bir yeniden başlatma ile ısrarcı olmayacak, değil mi? Düzenlemelisin /etc/sysctl.conf net.ipv4.ip_forward = 1. (Red Hat veya türev varsayalım.)
Aaron Copley

6

ICMP saldırılarını engelle

Aşağıdaki kuralları ekleyin, tercihen -t raw -A PREROUTING

-p icmp -m u32 ! --u32 "4&0x3FFF=0"   -j DROP
-p icmp -m length --length 1492:65535 -j DROP

İlk kural, "parçalanma bayrağı" 0 olmayan tüm ICMP paketlerini engeller (ICMP hiçbir zaman parçalanmamalı; küçük yükler taşımalıdır)

İkinci kural, büyük boyutlu parçalanmamış ICMP paketlerini engeller.


Bu MTU Discovery yolunu kırmaz mıydı?
Matt

@Harita hayır, çünkü Yol MTU keşfi sadece Ethernet yükü büyüklüğü kadar büyük paketler, yani 8 bayt IP başlığı ve ICMP başlığı tarafından kullanılan 1500 bayt kullanır.
pepoluan

Açıklama için teşekkürler, ama 1492-64k? neden 1500-65k değil. PPPoE için 1492'yi anlayabiliyorum ama düz ethernet.
Matt

Bu hala uygulanabilir mi?
LinuxSecurityFreak,

@VlastimilBurian evet derdim. Büyük boy ICMP paketlerine hala ihtiyaç yoktur.
pepoluan

4

FireHOL kullanarak - uygun iptables sarıcı

Bunu doğrudan iptables komutlarından daha sezgisel buldum. Özellikle diğer güvenlik duvarları ile geçmiş deneyime sahip kişiler için:

FireHOL, güvenlik duvarlarını filtreleyen durumsal iptables paket paketi üreten Linux tabanlı bir güvenlik duvarı jeneratörü, herhangi bir sayıda ağ arayüzüne sahip Linux ana bilgisayarlarında ve yönlendiricilerinde, herhangi bir sayıda rotada, sunulan hizmetlerin herhangi bir sayılarında, hizmetlerin varyasyonları arasındaki herhangi bir karmaşıklıkta (pozitif ve negatif dahil) ifade).


2
Aktif olarak geliştirilen, IPv4 ve IPv6'yı destekleyen ve diğer iptables sistemleri için güvenlik duvarları oluşturabilen Shorewall'u tercih ediyorum.
BillThor

4

(iptables_tricks.txt dosyamdan, birçok yerden yeniden derlendi: P)

IPtable'ları, 22 numaralı bağlantı noktasındaki (SSH) aynı IP'den yeni bağlantılar arasında 15 saniye bekletir:

 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
 iptables -A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

1
Aynı, ancak girişimlerin sayımı ile:-A INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 60 --hitcount 5 --rttl --name SSH -j DROP
alexm


3

IP setleri tekrar ziyaret edildi

IP setlerinden bahseden bir cevap zaten var. Bununla birlikte, klasik kurallar üzerinden elde edilen performansa odaklanması ve IP setlerinin CIDR notasyonunda kolayca bir alt ağ olarak ifade edilemeyecek birçok bireysel IP adresi olan sorunu hafifletmesi gerçeği bir boyutludur.

Aşağıda kullanılan gösterim

Çünkü ipsetyazım tarafından okunan ipset restoreve yazılan gösterimi kullanacağım ipset save.

Buna göre iptables(ve ip6tables) kurallar için gösterimi, okuduğu iptables-restoreve yazdığı şekilde kullanacağım iptables-save. Bu, daha kısa bir gösterim sağlar ve potansiyel IPv4-sadece (önek -4) veya IPv6-sadece (önek -6) kurallarını vurgulamama izin verir .

Bazı örneklerde paket akışını başka bir zincire yönlendireceğiz. Bu noktada zincirin olduğu varsayılır, bu nedenle zincirleri oluşturan satırlar üretilmez (sonunda tablo adı veya belirtilen komutlar da belirtilmez COMMIT).

Gelişmiş IP setleri

IP setleri diğer cevaplarda belirtilenden çok daha fazlasını yapabilir ve buradaki kısa girişin yanı sıra IP set belgelerini ( ipset(8)) kesinlikle okumanız gerekir iptables-extensions(8).

Mesela ben esas olarak üç set üzerinde duralım: hash:ip, hash:netve list:setfakat daha fazlası var ve hepsi geçerli kullanım durumları var.

Örneğin , yalnızca IP adreslerini değil, port numaralarını da eşleştirebilirsiniz .

Kaydetme ve ile IP kümelerini geri iptables-saveveiptables-restore

IP seti bildirimlerini toplu olarak oluşturabilir ve içine aktararak içe aktarabilirsiniz ipset restore. Komutunuzu mevcut girişlere karşı daha esnek hale getirmek istiyorsanız, kullanın ipset -exist restore.

Kurallarınız denilen bir dosyadaysa, default.setşunları kullanırsınız:

ipset -exist restore < default.set

Bunun gibi bir dosya, createkümelere ve addiçine girdiler için girdiler içerebilir . Ancak genellikle komut satırındaki komutların çoğunun dosyalarda karşılık gelen bir sürümü var gibi görünmektedir. Örnek (bir dizi DNS sunucusu oluşturma):

create dns4 hash:ip family inet
create dns6 hash:ip family inet6
# Google DNS servers
add dns4 8.8.8.8
add dns4 8.8.4.4
add dns6 2001:4860:4860::8888
add dns6 2001:4860:4860::8844

Burada IPv4 ( dns4) için bir tane ve IPv6 ( dns6) için bir set oluşturulur .

IP setlerinde zaman aşımları

IP setlerindeki zaman aşımları, set başına ve ayrıca giriş başına varsayılan olarak ayarlanabilir. Bu, birini geçici olarak engellemek istediğiniz senaryolar için çok yararlıdır (örneğin port taraması veya SSH sunucunuzu kaba şekilde zorlama girişiminde bulunmak için).

Bunun çalışması şu şekildedir (IP kümelerinin oluşturulması sırasında varsayılan):

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800

Aşağıda bu belirli kümelere ve neden oldukları gibi belirlenmelerinin gerekçesine geri döneceğiz.

Zaman aşımınızı belirli bir IP adresi için ayarlamak isterseniz, şunu söyleyebilirsiniz:

add ssh_dynblock4 1.2.3.4 timeout 7200

IP 1.2.3.4'ü (ayarlanan) varsayılan yarım saat yerine iki saat süreyle engellemek için.

ipset save ssh_dynblock4Kısa bir süre sonra buna bakarsanız, aşağıdaki satırlarda bir şeyler görürsünüz:

create ssh_dynblock4 hash:ip family inet hashsize 1024 maxelem 65536 timeout 1800
add ssh_dynblock4 1.2.3.4 timeout 6954

Zaman aşımı uyarıları

  • zaman aşımları verilen herhangi bir sette bulunan bir özelliktir. Set zaman aşımı desteği ile oluşturulmadıysa bir hata alırsınız (örn. Kernel error received: Unknown error -1).
  • zaman aşımları saniye cinsinden verilir. Örneğin, dakikadan saniyeye ulaşmak için Bash aritmetik ifadelerini kullanın. Örneğin:sudo ipset add ssh_dynblock4 1.2.3.4 timeout $((120*60))

Bir girişin belirli bir IP setinde olup olmadığını kontrol etme

Komut dosyalarınızın içinde bir girişin var olup olmadığını görmek yararlı olabilir. Bu ipset test, giriş varsa sıfırı döndürür, aksi takdirde sıfır saymazsa başarılabilir . Böylece normal kontroller bir betiğe uygulanabilir:

if ipset test dns4 8.8.8.8; then
  echo "Google DNS is in the set"
fi

Bununla birlikte, çoğu durumda -existanahtarı, ipsetmevcut girişler hakkında şikayet etmemek için yönlendirmek amacıyla kullanmak isteyeceksiniz .

IP kümelerini iptableskurallardan doldurma

Bu, benim görüşüme göre, IP setlerinin katil özelliklerinden biridir. Bir IP setinin girişleriyle eşleşmekle kalmaz, mevcut bir IP setine de yeni girişler ekleyebilirsiniz.

Örneğin, bu sorunun cevabında sizde:

-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --update --seconds 15 -j DROP
-A INPUT -p tcp -i eth0 -m state --state NEW --dport 22 -m recent --set -j ACCEPT

... hız sınırı bağlantısı amacıyla SSH'ye çalışmayı deniyor (TCP port 22). Kullanılan modül recentson bağlantı girişimlerini takip eder. Bununla birlikte , statemodül yerine, modülü tercih ederim conntrack.

# Say on your input chain of the filter table you have
   -A INPUT -i eth+ -p tcp --dport ssh -j SSH
# Then inside the SSH chain you can
# 1. create an entry in the recent list on new connections
   -A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
# 2. check whether 3 connection attempts were made within 2 minutes
#    and if so add or update an entry in the ssh_dynblock4 IP set
-4 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock4 src --exist
-6 -A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock6 src --exist
# 3. last but not least reject the packets if the source IP is in our
#    IP set
-4 -A SSH -m set --match-set ssh_dynblock4 src -j REJECT
-6 -A SSH -m set --match-set ssh_dynblock6 src -j REJECT

Bu durumda , her bir kural için SSHkendimi tekrar etmek zorunda kalmayacağım şekilde akışı zincire yönlendiriyorum -p tcp --dport ssh.

Tekrarlamak için:

  • -m setyapar iptablesbiz gelen anahtarları kullanıyoruz farkında set(hangi IP setlerini kolları) modülü
  • --match-set ssh_dynblock4 srcsource ( ) adresi ile belirtilen set ( ) iptablesile eşleşmesini söylersrcssh_dynblock4
    • bu, karşılık gelir sudo ipset test ssh_dynblock4 $IP( $IPpaket için kaynak IP adresini içeren)
  • -j SET --add-set ssh_dynblock4 src --existpaketteki source ( src) adresini IP setine ekler veya günceller ssh_dynblock4. Bir giriş varsa ( --exist) sadece güncellenir.
    • bu, karşılık gelir sudo ipset -exist add ssh_dynblock4 $IP( $IPpaket için kaynak IP adresini içeren)

Bunun yerine hedef / hedef adresiyle eşleştirmek istiyorsanız, dstyerine kullanırsınız src. Daha fazla seçenek için kılavuza bakın.

Kümeleri

IP kümeleri başka kümeler içerebilir. Şimdi makaleyi buraya kadar izlerseniz, kümeleri birleştirmenin mümkün olup olmadığını merak etmişsinizdir. Ve elbette öyle. Yukarıdaki IP kümeleri için iki ortak küme oluşturabiliriz ssh_dynblockve ssh_loggedonsırasıyla sadece IPv4 ve sadece IPv6 kümelerini içeririz:

create ssh_loggedon4 hash:ip  family inet  timeout 5400
create ssh_loggedon6 hash:ip  family inet6 timeout 5400
create ssh_dynblock4 hash:ip  family inet  timeout 1800
create ssh_dynblock6 hash:ip  family inet6 timeout 1800
# Sets of sets
create ssh_loggedon  list:set
create ssh_dynblock  list:set
# Populate the sets of sets
add ssh_loggedon ssh_loggedon4
add ssh_loggedon ssh_loggedon6
add ssh_dynblock ssh_dynblock4
add ssh_dynblock ssh_dynblock6

Ve aklınızda bulunması gereken bir sonraki soru, IP setlerini agnostik bir şekilde IP setleriyle eşleştirip manipüle etmemize izin verip vermeyeceğidir .

Ve bunun cevabı bir yankılandı: EVET! (ne yazık ki, bu son kontrol ettiğimde açıkça belgelenmedi)

Sonuç olarak, önceki bölümdeki kurallar okumak için yeniden yazılabilir:

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

Bu çok daha özlü. Ve evet, bu denenmiş ve test edilmiş ve bir cazibe gibi çalışıyor.

Hepsini bir araya getirmek: SSH kaba kuvvet savunması

Sunucularımda cron, bir sürü ana bilgisayar adı alan ve bunları IP adreslerine çözen, ardından "güvenilir ana bilgisayarlar" için ayarlanan IP'ye besleyen bir iş olarak çalışan bir komut dosyası var . Buradaki fikir, güvenilir ana makinelerin sunucuya giriş yapmak için daha fazla girişimde bulunmaları ve mutlaka başka hiç kimse tarafından engellenmemeleri gerektiğidir.

Bunun tersine, tüm ülkelerin SSH sunucuma bağlanmalarını engelledim, güvenilir ana bilgisayarların (potansiyel kurallar dışında) (potansiyel) istisnasıyla.

Ancak, bu okuyucu için bir egzersiz olarak bırakılmıştır. Burada ssh_loggedon, sonraki bağlantı girişimlerinin gerçekleştirilebilmesini ve diğer paketlerle aynı incelemeye tabi tutulmamasını sağlamak için sette bulunan setleri kullanacak temiz bir çözüm eklemek istiyorum .

Aşağıdaki kurallara bakarken, 90 dakikalık ssh_loggedonve 30 dakikalık varsayılan zaman aşımlarını hatırlamak önemlidir :ssh_dynblockiptables

-A INPUT -i eth+ -p tcp --dport ssh -j SSH
-A SSH -m set --match-set ssh_loggedon src -j ACCEPT
-A SSH -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A SSH -m conntrack --ctstate NEW -m recent --set --name tarpit
-A SSH -m conntrack --ctstate NEW -m recent --rcheck --seconds 120 --hitcount 3 --name tarpit -j SET --add-set ssh_dynblock src --exist
-A SSH -m set --match-set ssh_dynblock src -j REJECT

Şimdiye kadar kendinize, bağlı IP adresinin ssh_loggedonalt kümelerde nasıl sona erdiğini sormalısınız . Öyleyse okumaya devam et ...

Bonus: SSH oturumu sırasında giriş yaptığınız IP'yi eklemek

sshrcArkadaşlarınızla ve deneyimleriniz varsa , onun eksikliklerini öğrendiniz. Ancak PAM kurtarmaya gelir. Adlı modül pam_exec.so, kullanıcının kabul edildiğini bildiğimiz bir noktada SSH oturumu sırasında bir komut dosyası çağırmamızı sağlar.

In /etc/pam.d/sshdaşağıda pam_envve pam_selinuxgirişleri aşağıdaki satırı ekleyin:

session    optional     pam_exec.so stdout /path/to/your/script

ve betiğin ( /path/to/your/scriptyukarıdaki) sürümünün var olduğundan ve çalıştırılabilir olduğundan emin olun .

PAM, olup bitenleri iletmek için ortam değişkenlerini kullanır, böylece bunun gibi basit bir komut dosyası kullanabilirsiniz:

#!/bin/bash
# When called via pam_exec.so ...
SETNAME=ssh_loggedon
if [[ "$PAM_TYPE" == "open_session" ]] && [[ -n "$PAM_RHOST" ]]; then
    [[ "x$PAM_RHOST" != "x${PAM_RHOST//:/}" ]] && SETNAME="${SETNAME}6" || SETNAME="${SETNAME}4"
    ipset -exist add $SETNAME "$PAM_RHOST"
fi

Maalesef, ipsetyardımcı programın yerleşik netfilter akıllıları görünmüyor. Bu yüzden, girişimizi eklerken IPv4 ve IPv6 IP setlerini ayırt etmemiz gerekir. Aksi takdirde , IP yerine kümelere ipsetbaşka bir küme eklemek istediğimizi varsayacağız . Ve elbette, IP adresinden sonra bir set olması pek mümkün değildir :)

Bu yüzden :IP adresini kontrol ederiz ve 6bu durumda set adını 4ekleriz.

Son.


2

Iptables yapılandırmak için kullanılabilecek başka bir GUI Firewall Builder . Kullanıcıların veritabanında nesne olarak kural öğeleri oluşturmasını ve ardından istenen güvenlik duvarı ilkesini oluşturmak için bu nesneleri bir kural düzenleyicisine sürükleyip bırakmalarını sağlar. Ardından uygulama, kuralları uygulamak için gereken tüm iptables komutlarını içeren bir komut dosyası oluşturur.

Aynı anda yalnızca bir iptables yapılandırmasını yönetebileceğiniz diğer iptables GUI çözümlerinden farklı olarak, Firewall Builder ile tek bir uygulamadan çok sayıda iptables yapılandırmasını yönetebilirsiniz. Firewall Builder, Linux, Windows ve Mac OS X işletim sistemlerinde çalışmaktadır, 10 yılı aşkın bir süredir kullanılmaktadır ve dünya genelinde binlerce aktif kullanıcıya sahiptir.

Tam Açıklama - Firewall Builder'ı geliştiren şirket olan NetCitadel'in kurucu ortağıyım.


1

kullanıcı kimliği ile giden bağlantıyı günlüğe kaydet

iptables -A OUTPUT -m state --state NEW -m tcp -p tcp -m limit --limit 5/m -j LOG --log-uid --log-prefix="outgoing connection: "

liman / bağlantı yönlendirme:

iptables -A PREROUTING -t nat -i eth1 -p tcp --dport 80 -j DNAT --to 10.0.1.7:80
iptables -A INPUT -p tcp -m state --state NEW --dport 80 -i eth1 -j ACCEPT

1
NFLOGHedefi tercih ederim . Daha uzun bir satır öneki sağlar ve kullanıcı modu arka plan programı da veritabanlarına giriş yapabilir.
0xC0000022L

1

Çeşitli arayüz adlarını joker karakterle eşleştir

Örnek: Sahip eth0 ve eth1 aralarında herhangi bir trafiğe izin istersiniz?

iptables -A FORWARD -i eth+ -o eth+ -j ACCEPT

Bunu geçmişte veth<something>dinamik olarak yaratılmış ve LXC tarafından adlandırılmış arayüzlerle eşleştirmek için kullandım . Böylece aynı anda hepsini eşleştirebilirim veth+.

Ayrıca kasten _<something>eşleşmek için bazı arayüzler de koydum _+.


1

Yaygın olmayan MSS değerlerini engelle

iptables -t mangle -A PREROUTING -p tcp \
-m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

DDos koruması için SYNPROXY hedefi

Bu hedefin amacı, gönderilen SYN paketinin bağlantıyı kurduğunu veya SYN bağlantısı başlattıktan sonra hiçbir şey yapmadığını kontrol etmektir. Hiçbir şey yapmazsa paketi en az çabayla atar.

Ham tablodaki syn paketlerini bağlantı izleme tablosuna ayarlayın

iptables -t raw -A PREROUTING -p tcp -m tcp --dport 80 --syn -j CT --notrack

Http sunucusu için synproxy'yi etkinleştirin:

iptables -A INPUT -p tcp -m tcp --dport 80 -m conntrack --ctstate INVALID,UNTRACKED \
-j SYNPROXY --sack-perm --timestamp --wscale 7 --mss 1460

Kaynak: RHEL blogundan SYNPROXY hedefi


1

Tüm IP adreslerini IP Setleriyle giden bir bant genişliği kotasına sınırlama

Sunucunuzu, yalnızca ISS'nizdeki ölçülü bant genişliği kotanız için bir bant genişliği kullanım saldırısını yansıtması veya atlatması umuduyla, yalnızca her ay IP 15GiByte bant genişliği kullanımına izin verecek şekilde yapılandırabilirsiniz. Aşağıdaki gibi yapılabilir:

İlk önce IPv4 ve IPv6 için IP setlerini oluşturun:

ipset create IP_QUOTA_SET_OUT hash:ip timeout 345600 counters
ipset create IP_QUOTA_SET_OUT_INET6 hash:ip timeout 345600 counters family inet6

Şimdi iptables kurallarınızı ekleyin. Zaten orada değilse, ilk satır IP'yi sete ekler. Sette IP için aktarılan baytlar belirtilen miktardan büyükse, ikinci satır eşleşmeyecektir. Sonra aynı IPv6 için de aynı şekilde yapılır.

iptables -I OUTPUT -m set ! --match-set IP_QUOTA_SET_OUT dst -j SET --add-set IP_QUOTA_SET_OUT dst --timeout 345600
iptables -I OUTPUT -m set --match-set IP_QUOTA_SET_OUT dst --bytes-gt 16106127360 -j DROP

ip6tables -I OUTPUT -m set ! --match-set IP_QUOTA_SET_OUT_INET6 src -j SET --add-set IP_QUOTA_SET_OUT_INET6 src --timeout 345600
ip6tables -I OUTPUT -m set --match-set IP_QUOTA_SET_OUT_INET6 src --bytes-gt 16106127360 -j DROP

Bu, web sunucunuzdan uzun süre büyük bir dosya isteyen bir kullanıcı veya bu konuda herhangi bir hizmetten kaynaklanan saldırıları önler. Aynı INPUT zinciri için yapılabilir.


0

Daha zarif bir çözüm konusundaki cehaletim nedeniyle yaptığım bir şey, Nginx kayıtlarımı her 4 saatte bir manuel olarak kontrol etmek ve posta sunucusu bireysel IP'lerin aşırı erişimi için her 2 dakikada bir kaydını tutmak. Birkaç senaryoyu birlikte çalıştırıyorum:

  1. access.logSunucuya kaç tane vuruş yaptıkları ile düzenlenen ilk 10 IP'yi kontrol edin ve listeler.
  2. Sonuçları bir günlük dosyasına boşaltın
  3. Başka bir betiğin bu günlük dosyasına bakmasını ve son X saatte sunucuya X'ten daha fazla defa isabet eden IP'leri yasaklamasını isteyin
  4. Kurtar benim iptables.save

İşte göründüğü gibi:

autoBanIPs_mail.sh
#!/bin/bash

# This script checks the last 2 minutes of log entries to see if any 
# IP has made over 99 connections

now=$(date +"%m_%d_%Y")

/root/bin/checkBadIPs_mail.sh > /home/ipChecker/ipcheckMAIL_$now.txt
cat /home/ipChecker/ipcheckMAIL_$now.txt | \
    grep " \\(\\([9][9]\\)\\|\\([0-9][0-9][0-9]\\+\\)\\) " | \
    awk '{print $2}' > /home/ipChecker/badMailIPs_$now.sh
sed -i "s/^/\/usr\/local\/sbin\/blockIP /g" /home/ipChecker/badMailIPs_$now.sh
/bin/bash /home/ipChecker/badMailIPs_$now.sh
cat /home/ipChecker/ipcheckMAIL_$now.txt >> /home/ipChecker/ipcheckMAIL_$now.log
rm /home/ipChecker/ipcheckMAIL_$now.txt
rm /home/ipChecker/badMailIPs_$now.sh
checkBadIPs_mail.sh

Burada dikkat edilmesi gereken çok önemli şeylerden biri, bir beyaz liste oluşturmanız GEREKEN veya bir çok otantik IP’yi diğer günlüklerden veya diğer günlüklerde çok fazla e-posta aldığınız sunuculardan engellemeye başlayacak olmanızdır. sadece meşru sebeplerden dolayı sunucunuzu çok vurmak. Benim beyaz liste sadece sağ sonra grep boruları ekleyerek bu komut yerleşik | grep ']' | "grep -v 127.0 |" gibi görünen bir şey .
Sunucunuza hangi yüksek trafik IP'lerinin okunaklı olduğunu ve hangilerinin olmadığını öğretmek için zaman ayırmanız gerekir. Benim için bu, ilk haftayı harcamam gerektiği ve her birkaç saatte bir günlüklerimi manuel olarak kontrol ettiğim, iplocation.net'teki yüksek trafik iplerini ararken ve sonra amazon, box.com ve hatta ev / ofisim gibi okunaklı olanları ekleyerek geçirmem gerektiği anlamına geliyordu. IP bu beyaz listeye değişir. Bunu yapmazsanız, muhtemelen kendi sunucunuz tarafından engelleneceksiniz veya yasal posta / web sunucularını engellemeye başlayacak ve e-posta veya trafikte kesintilere neden olacaksınız.

cat /var/log/mail.log | awk \
    -v d1="$(date --date="-2 min" "+%b %_d %H:%M")" \
    -v d2="$(date "+%b %_d %H:%M")" \
    '$0 > d1 && $0 < d2 || $0 ~ d2' | \
    grep '\[' | grep '\]' | \
    grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | grep -v 127.0 | \
    awk '{print $1}' | sort | uniq -c | sort -n | tail -10
BlockIP
#!/bin/bash
sudo iptables -I INPUT -s $1 -j DROP
sudo bash -c "iptables-save > /etc/network/iptables.save"

Yine bunun cehennem kadar kabaca olduğunu ve muhtemelen bunların hepsini yapan güzel ve temiz, verimli bir protokol olduğunu biliyorum, ama bunu bilmiyordum ve bu şey bir iki yıldır devam ediyor ve kötü adamları uzak tutuyor. Ciddiyetle tavsiye edeceğim tek şey, ana sunucunuza erişmek için kullanabileceğiniz kanatlarda bir proxy veya başka bir sunucuya sahip olmanız. Bunun nedeni, bir gün web gelişimini mavi dışında bırakıyorsanız ve Bir proxy dışında geri dönüşü olmayan bazı testler için kendi kendinize 2000 kez 5 saatte ping atmak.

İçeri görebilirsiniz checkBadIPs.shGüncellemek unutmak, ben grep -v 127.0 ve benim gerçek dosyalarında koyduk Ben kendi IP'leri için kurallar ve diğer güvenilir IP aralıkları ama bazen IP değişiklikleri görmezden bir ton var ve o zaman kilitli kendi sunucunuz dışında.

Her neyse, yardımcı olacağını umuyorum.

GÜNCELLEME

Her şeyi birkaç saatte bir kontrol etmek yerine, her 2 dakikada bir kontrol ettiğimde, özellikle ssh auth günlüğümü ve dövülerek kullanılan posta günlüğünü: (.

Her bir günlük dosyası için özel komut dosyaları hazırlıyorum, ancak günlükleri incelemek için kendimi kullandığım el ile komut dosyasından yeterince kolay olurdu. Buna benzer:

#!/bin/bash

log=$1 time=$2

cat /var/log/${log} | awk \
    -v d1="$(date --date="-${time} min" "+%b %_d %H:%M")" \
    -v d2="$(date "+%b %_d %H:%M")" \
    '$0 > d1 && $0 < d2 || $0 ~ d2' | \
    grep '\[' | grep '\]' | \
    grep -Eo '[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}' | \
    sort | uniq -c | sort -n | tail -10

Bu, çalıştırıldığında 2 giriş, taramak istediğiniz günlük dosyası ve taramak istediğiniz geçmişe ne kadar geri gitmenizi gerektirir.

Bu yüzden ip sayımları için mail.log dosyasını kontrol etmek isteseydim, geçmişe 75 dakika kala kaçıracağım:

$ sudo script.sh mail.log 75


1
Güzel! ipsetİptables zincirini uzatmak yerine kullanırdım , ama fikir harika ve onları üretim sunucularına uygulayacağımı düşünüyorum. Paylaşım için teşekkürler!
pepoluan

2
Geçen gün ilk kez ipset'i okudum ve ne yaptığını öğrenmekten çok memnun oldum. Uygulamaktan biraz korktum, çünkü muhtemelen başlangıçta onu kapayıp sunucuyu kapattığım için ama burada öğreneceğim şeyler listemde. Bu benim iptable zincirimin muhtemelen 30-40 parça civarında olduğu ve her gün veya iki günde sadece 1 yenisini bulduğu için aşırı endişeli olduğum bir noktada değil.
unc0nnnected 19

Fail2ban'ı düşündün mü?
civcivler

0

İpsets ve tcp flagları hakkındaki yorumlara katılıyorum, ancak hala çok fazla eksik var:

Ülke listeleri için ipsets yerine xtables-addons coğrafi eşleşmesini kullanın. Coğrafi verileri düzenli olarak güncelleyin (en az ayda bir kez). Veriler, ateşle ve unut ipset listesinden daha dinamiktir.

Tcp bayraklarıyla bağlantı durumu izlemeyi göz önünde bulundurun. Örneğin, bir tcp RST veya ACK yalnızca kurulan bağlantı için anlamlıdır. SYN sadece yeni ve ilgili bağlantılar için anlamlıdır. Kurulan bir bağlantı için bir SYN, SYN + ACK'nızın kaybolduğu veya bir kesilme girişimi olduğu ve bağlantının her iki tarafının da durumu kabul etmediği için sıfırlanması gerektiği anlamına gelir.

Hiçbiri, SYN + RST ve FIN + RST geçersiz kombinasyonlar olsa da, SYN + FIN, özellikle DNS için, TCP hızlı açma (TCP seçenek 34) altında şimdi geçerlidir. SYN paketleri hızlı açılsa bile parçalanmamalıdır. PSH ve URG bayraklarıyla ilgili kuralları faydalı bulmuyorum. Bağlantı izleme durumunu TCP durumuyla karıştırmayın: İzleme amacıyla bir SYN paketine bir RST yanıtı kurulur.

SYNPROXY iletilen paketler içindir ve yerel olarak teslim edilenler için eşzamanlılık desteğinin ötesinde hiçbir şey eklemiyor.

ICMP hata paketleri her zaman ilgili durumda olacak ve geçerliyse 48: 576 uzunluğunda olacaktır. IPv6 için uzunluk 84: 1280. Diğerleri göz ardı edilmeli. Maksimum boyutları aynı zamanda minimum MTU olduğundan, asla parçalara ayrılmamaları gerekir. ICMP istekleri (pingler, zaman damgaları vb.) Her zaman yeni olacak ve cevaplar oluşturulacak. ICMP paketlerini diğer durumlara bırakın.

Yeni bir listeye sahip SSH örneği ve sadece sonraki SYN paketlerini kabul etmek gibi, aynı şey SMTP için de yapılmalı ve sadece IP adres verisinde “greylisting” e benzer.

Filtre tablosunda, giriş ve çıkış zincirlerinde birinci (veya ikincisi, ilk önce yerleşik durum paketlerini kabul ediyorsa) kuralının geridöngü arabirimindeki her şeyi kabul etmesi gerekir. Kendi iç paketlerine güvenmelisin. Yapamazsanız, bir güvenlik duvarı çözümünün ötesinde daha büyük sorunlarınız vardır.

Son olarak, ne yaptıklarını gerçekten anlamadığınız sürece, kuralları kör bir şekilde kopyalamayın. Pek çok benzer kural listesi bunu yapıyor ve çoğu zaman sonuç gülünç oluyor.


-2
#!/bin/bash
# The following iptables/ip6tables configurations have
# been kindly shared with us from ArckWiki. There are
# a few additions apart from what has been defined.
#
#=================Flush current definitions==============
    iptables -F
    ip6tables -F
    iptables -X
    ip6tables -X

#
#=================Chains=================================
#
#----Define chains for opened ports
    iptables -N TCP
    ip6tables -N TCP
    iptables -N UDP
    ip6tables -N UDP

#
#----Setting up the filter table for NAT
#   iptables -N fw-interfaces
#   ip6tables -N fw-interfaces
#   iptables -N fw-open
#   ip6tables -N fw-open

#
#================Default Chain reactions=================
#
#----Default FORWARD reaction
    iptables -P FORWARD DROP
    ip6tables -P FORWARD DROP

#
#----Default OUTPUT reaction
    iptables -P OUTPUT ACCEPT
    ip6tables -P OUTPUT ACCEPT

#
#----Shellshock
    iptables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP
    ip6tables -A INPUT -m string --algo bm --hex-string '|28 29 20 7B|' -j DROP

#
#----Default INPUT reaction
    iptables -P INPUT DROP
    ip6tables -P INPUT DROP
#
#----Drop spoofing packets
    iptables -A INPUT -i eth0 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -i wlan0 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -i wlan1 -s 127.0.0.0/8 -j DROP
    iptables -A INPUT -s 10.0.0.0/8 -j DROP
    iptables -A INPUT -s 169.254.0.0/16 -j DROP
    iptables -A INPUT -s 172.16.0.0/12 -j DROP
    iptables -A INPUT -s 224.0.0.0/4 -j DROP
    iptables -A INPUT -d 224.0.0.0/4 -j DROP
    iptables -A INPUT -s 240.0.0.0/5 -j DROP
    iptables -A INPUT -d 240.0.0.0/5 -j DROP
    iptables -A INPUT -s 0.0.0.0/8 -j DROP
    iptables -A INPUT -d 0.0.0.0/8 -j DROP
    iptables -A INPUT -d 239.255.255.0/24 -j DROP
    iptables -A INPUT -d 255.255.255.255 -j DROP

#
#================Ping rate limiting globally=============
    iptables -A INPUT -p icmp --icmp-type 8 -m limit --limit 30/min --limit-burst 8 -j ACCEPT
    ip6tables -A INPUT -p icmpv6 --icmpv6-type 8 --match limit --limit-burst 8 -j ACCEPT
    iptables -A INPUT -p icmp --icmp-type 8 -j DROP
    ip6tables -A INPUT -p icmpv6 --icmpv6-type 8 -j DROP

#
#----flooding RST packets, smurf attack Rejection
    iptables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags RST RST -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#
#----Bogus packet DROP
    iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
    iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
    ip6tables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP

#
#================RELATED,ESTABLISHED reaction============
    iptables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
    ip6tables -A INPUT --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

#
#================unfetered loopback======================
    iptables -A INPUT -i lo -j ACCEPT
    ip6tables -A INPUT -i lo -j ACCEPT

#
#================INVALID catagory of packets=============
    iptables -A INPUT -p 41 -j ACCEPT
    iptables -A INPUT --match conntrack --ctstate INVALID -j DROP
    ip6tables -A INPUT --match conntrack --ctstate INVALID -j DROP

#
#================IPv6 reactions and definitions==========
    ip6tables -A INPUT -s fe80::/10 -p icmpv6 -j ACCEPT
    ip6tables -t raw -A PREROUTING -p icmpv6 -s fe80::/10 -j ACCEPT
    ip6tables -t raw -A PREROUTING --match rpfilter -j ACCEPT
    ip6tables -t raw -A PREROUTING -j DROP
#
#=======Acceptable INVALIDs and a curteous response======
    iptables -A INPUT -p udp --match conntrack --ctstate NEW -j UDP
    ip6tables -A INPUT -p udp --match conntrack --ctstate NEW -j UDP
    iptables -A INPUT -p tcp --syn --match conntrack --ctstate NEW -j TCP
    ip6tables -A INPUT -p tcp --syn --match conntrack --ctstate NEW -j TCP

#
#================Defining the TCP and UDP chains
#
#########################################################
#            Notes for port open definitions            #
# It is important to note that this should be config-   #
# ured differently if you're providing any routing      #
# activity for any purpose. it is up to you to actively #
# define what suites your needs to get the job done.    #
# In this example, I'm exempting IPv6 from being able   #
# to interact with SSH protocols for two reasons. The   #
# first is because it is generally easier and more com- #
# for internal networks to be deployed with IPv4. The   #
# second reason is, IPv6 can be deployed globally.      #
#########################################################
#
#----SSH configured for eth0
    iptables -A TCP -i eth0 -p tcp --dport ssh -j ACCEPT

#!---Blocking SSH interactions in IPv6
    ip6tables -A TCP -p tcp --dport ssh -j DROP

#!---Leave commented for end service device
#   iptables -A TCP -p tcp --dport 80 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 80 -j ACCEPT
#   iptables -A TCP -p tcp --dport 443 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 443 -j ACCEPT
#
#!---Uncomment for remote service to this device
#   iptables -A TCP -p tcp --dport 22 -j ACCEPT
#   ip6tables -A TCP -p tcp --dport 22 -j ACCEPT
#
#!---Uncomment if you're providing routing services
#   iptables -A UDP -p udp 53 -j ACCEPT
#   ip6tables -A UDP -p udp 53 -j ACCEPT
#
#=================Tricking port scanners=================
#
#----SYN scans
    iptables -I TCP -p tcp --match recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
    ip6tables -I TCP -p tcp --match recent --update --seconds 60 --name TCP-PORTSCAN -j DROP
    iptables -A INPUT -p tcp --match recent --set --name TCP-PORTSCAN -j DROP
    ip6tables -A INPUT -p tcp --match recent --set --name TCP-PORTSCAN -j DROP

#
#----UDP scans
    iptables -I UDP -p udp --match recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
    ip6tables -I UDP -p udp --match recent --update --seconds 60 --name UDP-PORTSCAN -j DROP
    iptables -A INPUT -p udp --match recent --set --name UDP-PORTSCAN -j DROP
    ip6tables -A INPUT -p udp --match recent --set --name UDP-PORTSCAN -j DROP

#
#----For SMURF attack protection
    iptables -A INPUT -p icmp -m icmp --icmp-type address-mask-request -j DROP
    iptables -A INPUT -p icmp -m icmp --icmp-type timestamp-request -j DROP
    iptables -A INPUT -p icmp -m limit --limit 2/second --limit-burst 2 -j ACCEPT
    ip6tables -A INPUT -p icmpv6 -m limit --limit 2/second --limit-burst 2 -j ACCEPT

#
#----Ending all other undefined connections
    iptables -A INPUT -j DROP
    ip6tables -A INPUT -j DROP

#
#=======Defining the IN_SSH chain for bruteforce of SSH==
#
#!---I've elected to keep IPv6 out of this realm for
#!---ease of use
    iptables -N IN_SSH
    iptables -A INPUT -p tcp --dport ssh --match conntrack --ctstate NEW -j IN_SSH
    iptables -A IN_SSH --match recent --name sshbf --rttl --rcheck --hitcount 3 --seconds 10 -j DROP
    iptables -A IN_SSH --match recent --name sshbf --rttl --rcheck --hitcount 4 --seconds 1800 -j DROP
    iptables -A IN_SSH --match recent --name sshbf --set -j ACCEPT
    iptables -A INPUT -p tcp --dport ssh -m conntrack --ctstate NEW -j IN_SSH

#
#==================Setting up a NAT gateway==============
#
#########################################################
#                                                       #
# I commented this half out because it's not something  #
# that will apply to all setups. Make note of all par-  #
# tinate interfaces and what exactly is going on.       #
#                                                       #
#########################################################
#
#----Setting up the FORWARD chain
#   iptables -A FORWARD --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#   ip6tables -A FORWARD --match conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
#
#
#----Defining the fw-interfaces/open chains for FORWARD
#   iptables -A FORWARD -j fw-interfaces
#   ip6tables -A FORWARD -j fw-interfaces
#   iptables -A FORWARD -j fw-open
#   ip6tables -A FORWARD -j fw-open
#   iptables -A FORWARD -j DROP # Should be REJECT. But, fuck them
#   ip6tables -A FORWARD -j DROP
#   iptables -P FORWARD DROP
#   ip6tables -P FORWARD DROP
#
#
#----Setting up the nat table
#   iptables -A fw-interfaces -i ### -j ACCEPT
#   ip6tables -A fw-interfaces -i ### -j ACCEPT
#   iptables -t nat -A POSTROUTING -s w.x.y.z/S -o ppp0 -j MASQUERADE
#   ip6tables -t nat -A POSTROUTING -s fe::/10 -o ppp0 -j MASQUERADE
#----The above lines should be repeated specifically for EACH interface
#
#----Setting up the PREROUTING chain
#
#######################################################
#                             #
# The PREROUTING chain will redirect either port      #
# targets to be redirected. This can also redirect    #
# traffic inbound to your network from the gateway    #
# to this machine. This can be useful if you're using #
# a honeypot or have any service within your network  #
# that you want to be pointed to a specific device.   #
#                             #
#######################################################
#
#----SSH honeypot server
#   iptables -A fw-open -d HONEYPOT_IP -p tcp --dport 22 -j ACCEPT
#   ip6tables -A fw-open -d HONEYPOT_IP -p tcp --dport 22 -j ACCEPT
#----With intuition, you can configure the above to also direct specific
#----requests to other devices providing those services. The bellow will
#----be for a squid server
#   iptables -A fw-open -d SQUID_IP -p tcp --dport 80 -j ACCEPT
#   ip6tables -A fw-open -d SQUID_IP -p tcp --dport 80 -j ACCEPT
#   iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to SQUID_IP
#   ip6tables -t nat -A PREROUTING -i ppp0 -p tcp --dport 8000 -j DNAT --to SQUID_IP
#
#===============Declare configurations=================
    iptables -nvL
    ip6tables -nvL

1
Tüm bağırarak, gönderinizin mesajını anlayamıyorum.
Deer Hunter
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.