Iptables ile Çin'i engelle


10

Bir GitLab sunucusunda oturum açtım ve sunucuyu son kontrol ettiğimden beri 18.974 başarısız oturum açma hatası olduğunu fark ettim - neredeyse 5 gün. Ipleri kontrol ettim ve neredeyse hepsinin Çin'den olduğu ve SSH ve Brute Force ile erişmeye çalıştığı anlaşılıyor. Bazı Ip'leri engellemeye başladım, ancak daha sonra büyük bir zaman kaybı olduğunu ve tüm ülkeyi engellemek için daha iyi bir fikir olacağını fark ettim.

TÜM Çin'i veya iptables ile başka bir ülkeyi engelleyebilmemin herhangi bir yolu var mı?

İnternette bazı makaleler buldum ama neredeyse hepsi bash betikleri. Linux'ta yeni başlayan biriyim, bu yüzden tüm bu komut dosyalarını gerçekten anlamıyorum. Iptables'ı gerçekten ilginç buluyorum ve daha fazla bilgi edinmek istiyorum.

Herhangi bir fikir ? Teşekkür ederim!


4
Aynı sorunu farklı bir şekilde çözdüm. Parola ve sınama tabanlı kimlik doğrulamayı kapatarak müşterimin GitLab sunucusunda SSH'yi sertleştirdim ve yalnızca SSL anahtarlarıyla oturum açmaya izin verdim. Belki bu sizin durumunuzda işe yarar mı? IP aralıklarının engellenmesi "gürültüyü" azaltabilir, ancak size kaba zorlamaya karşı gerçek koruma sağlamaz.
blendenzo

şimdiye kadar işe yaramadı. gitlab sunucusu hala yukarı ve 0 break-in vardı. Ssh erişim sadece ssh tuşları ile yapılır ve ben kök giriş devre dışı. Sadece iptables çok kötü öğrenmek istiyorum ..
Caranfil Alegzandru

1
Ssh'nizi yönlendiricinizdeki varsayılan olmayan bir bağlantı noktasına da değiştirebilirsiniz. Bu, ssh bot saldırı girişimlerimi günde yüzlerceden sıfıra düşürdü.
Organik Mermer

Yanıtlar:


7

Otomatik olarak tanımlamak ve daha sonra engellemek için iptables kullanarak ssh için kötü adamlar recentmodül kullanılarak yapılabilir . Aşağıdaki segment genel hattınızdan sonra gelmelidir ESTABLISHED,RELATED:

...
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT
...
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

Şimdi, Çin ile ilgili son (son bir iki yıl) problemi çok zeki hale gelmeleri ve bir IP adresinden engellendikleri zaman aynı alt ağda diğerine geçip devam etmeleri. Bu varsayılan son tablo girişleri tükenme riski (varsayılan 200 olduğunu düşünüyorum) çalışır. Bunu izler ve ardından gerçek IP segmentini ararım ve tüm segmenti kalıcı olarak engellerim. Benim durumumda, teminat hasarını umursamıyorum, yani masum birini engelleme:

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
...

Yukarıda nerede:

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

Çin veya herhangi bir ülke için IP adreslerinin tam listesini iptables veya başka bir biçimde buradan alabilirsiniz . Ancak liste hem şaşırtıcı derecede uzun hem de oldukça dinamik. Ben, tüm listeyi engellememeye karar verdim.


Bu ^! Şimdiye kadar aldığım en iyi cevap olabilir. Aptalca bir soru olabilir, ama sanırım tüm bu kurallar bir bash senaryosuna giriyor, değil mi? Hala iptables anlamakta bazı problemlerim var ama büyüleyici buluyorum.
Caranfil Alegzandru

Evet, bash betiği kullanıyorum. Bazıları ve ben de kullandım, daha hızlı yüklemek için doğrudan bir iptables geri yükleme yöntemi kullanın. Aynı komut dosyasına bazı iptables olmayan komutları eklediğim için değiştim.
Doug Smythies

12

İpset kullanarak Çin bloğu

Iptables'ınıza el ile birkaç bin IP adresi ekleyemezsiniz ve hatta otomatik olarak yapmak kötü bir fikirdir çünkü çok fazla CPU yüküne neden olabilir (ya da okudum). Bunun yerine, bu tür şeyler için tasarlanmış olan ipset'i kullanabiliriz. ipset ip adreslerinin büyük listelerini işler; sadece bir liste oluşturun ve iptables'a bu listeyi bir kuralda kullanmasını söyleyin.

Not; Aşağıdakilerin bütününün kök olarak yapıldığını varsayıyorum. Sisteminiz sudo tabanlıysa buna göre ayarlayın.

apt-get install ipset

Sonra, tüm çalışmaları yapmak için küçük bir Bash senaryosu yazdım, içindeki yorumları anlayabilmelisin. Bir dosya oluşturun:

nano /etc/block-china.sh

İşte içine yapıştırmak istediğiniz şey:

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules

Dosya 'yı kaydet. Yürütülebilir yap:

chmod +x /etc/block-china.sh

Bu henüz bir şey yapmadı, ancak senaryoyu çalıştırdığımızda bir dakika içinde gerçekleşecek. İlk olarak, yukarıdaki komut dosyasının tanımladığı bu yeni ipset listesine başvuran iptables'a bir kural eklememiz gerekir:

nano /etc/iptables.firewall.rules

Aşağıdaki satırı ekleyin:

-A INPUT -p tcp -m set --match-set china src -j DROP

Dosya 'yı kaydet. Açık olmak gerekirse, tam iptables.firewall.rules'üm şimdi şöyle görünüyor:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

Şu anda, yeni kurallar uygulanmadığı için sunucuda hiçbir şey değişmedi; bunu yapmak için block-china.sh betiğini çalıştırın:

/etc/block-china.sh

Bu, Çin tabanlı IP'lerin yeni bir listesini çektiğinde bazı çıktıları göstermeli ve birkaç saniye sonra tamamlanıp bir komut istemine geri dönecektir.

Çalışıp çalışmadığını test etmek için şunu çalıştırın:

iptables -L

Şimdi Çin'i engelleyen yeni bir kural görmelisiniz - çıktı şu şekilde görünmelidir:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             match-set china src
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

Neredeyse bitti! Bu işe yarar ve yeniden botlar üzerinde çalışmaya devam eder. Ancak, IP adresleri değişir ve bu liste zamanla eski haline gelir. Güncellenmiş bir IP listesi almak ve uygulamak istiyorsanız block-china.sh betiğini tekrar çalıştırabilirsiniz.

Makineyi bir cron işi aracılığıyla otomatik olarak yapacak şekilde de ayarlayabiliriz:

crontab -e

Bunun gibi bir satır ekleyin:

* 5 * * * /etc/block-china.sh

Bu, /etc/block-china.sh dosyasını her gün 05: 00'da çalıştıracaktır. Komut dosyasını çalıştıran kullanıcının kök olması veya kök ayrıcalıklarına sahip olması gerekir.

kaynak


Neden sadece tcp protokolü ile sınırlandırmalıyım? Protokol belirtmeden çalışıyor gibi görünüyor. Çok daha kısa olduğu için daha yeni toplu listeler kullanmanızı wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
öneririz

Burada yeniden önyüklemeden sonra ipset'i geri yükleyen hiçbir şey yoktur.
Doug Smythies

4

Sunucunuza giriş yapma ve başarısız olma girişiminde bulunan ips'leri engellemek için fail2ban gibi bir şey yüklemek isteyebilirsiniz.


Ayrıca csf güvenlik duvarı kullanabilir ve yapılandırma dosyalarından istediğim her ülkeyi engelleyebilirim. Şey gerçekten iptables kullanmak istiyorum, bu yüzden daha fazla bilgi edinebilirsiniz.
Caranfil Alegzandru

Hangi ülkelerde hangi ip adresi bloklarının kime engelleneceğini belirlemek için atanmış olduğunu görmeniz gerekir. Süper doğru olup olmayacağından emin değilim. Geçerli iptables kurallarını göstermek için iptables -L, söz konusu kuralları oluşturmak için hangi komutların çalıştırıldığını göstermek için iptables-save komutunu kullanabilir, ardından kendi kurallarınızı tasarlayabilir ve bunu öğrenmek için test makinelerini kullanarak test edebilirsiniz. Ben böyle öğrendim.
Kyle H

0

Coğrafi modülü iptables için kullanabilirsiniz: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

Sistemimiz yükseltildikten ve bağımlılıklar yüklendikten sonra, şimdi xtables-eklentileri makinemize yükleyeceğiz. Bunu yapmak için, resmi xtables-addons proje sitesinden en yeni tarball'ı wget kullanarak indireceğiz . İndirildikten sonra tarball'ı çıkarırız, sonra derler ve makinemize kurarız.

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

Daha sonra, GeoIP veritabanını MaxMind'den indiren ve tarafından tanınan bir ikili forma dönüştüren xtables-addons uzantısıyla birlikte gelen xt_geoip adlı bir modül çalıştıracağız xt_geoip. Bir kez indirildikten sonra, onu oluşturacağız ve gerekli xt_geoipyola taşıyacağız /usr/share/xt_geoip.

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

Bir ülkeden kaynaklanan veya bir ülkeye giden trafiği engellemek için iptables'ı geoip modülüyle kullanmak için temel sözdizimi. Burada, ülke yerine iki harfli ISO3166 kodunu kullanmalıyız, örneğin ABD, ABD için İrlanda, İrlanda için IE, Hindistan için IN, Çin için CN ve benzeri.

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]

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.