Blokir China dengan iptables

10

Saya baru saja masuk pada server GitLab dan memperhatikan bahwa itu gagal login 18.974 sejak saya terakhir memeriksa server - hampir 5 hari. Saya memeriksa Ip dan sepertinya hampir semuanya berasal dari China dan mencoba untuk mendapatkan akses dengan SSH dan Brute Force. Saya mulai memblokir beberapa Ip tetapi kemudian saya menyadari bahwa itu adalah buang-buang waktu dan ide yang lebih baik adalah memblokir seluruh negara.

Apakah ada cara saya bisa memblokir SEMUA China atau negara lain dengan iptables?

Saya menemukan beberapa artikel di internet tetapi hampir semuanya adalah skrip bash. Saya seorang pemula di Linux jadi saya tidak begitu mengerti semua skrip itu. Saya menemukan iptables sangat menarik dan saya ingin belajar lebih banyak tentang itu.

Ada ide? Terima kasih!

Caranfil Alegzandru
sumber
4
Saya memecahkan masalah yang sama dengan cara yang berbeda. Saya mengeraskan SSH di server GitLab pelanggan saya dengan mematikan kata sandi dan otentikasi berdasarkan tantangan dan hanya mengizinkan masuk dengan kunci SSL. Mungkin itu akan berhasil dalam situasi Anda? Memblokir rentang IP mungkin mengurangi "noise" tetapi itu tidak akan memberi Anda perlindungan nyata terhadap kekerasan.
blendenzo
sejauh ini tidak berhasil. server gitlab masih menyala dan saya mendapat 0 pembobolan. Akses ssh hanya dibuat dengan ssh-keys dan saya menonaktifkan login root. Hanya saja saya ingin belajar iptables sangat buruk ..
Caranfil Alegzandru
1
Anda juga dapat mengganti ssh ke port non-default di router Anda. Itu menjatuhkan upaya serangan bot ssh saya dari ratusan per hari ke nol.
Marmer Organik

Jawaban:

7

Menggunakan iptables untuk secara otomatis mengidentifikasi, dan setelah itu memblokir, orang jahat untuk ssh dapat dilakukan dengan menggunakan recentmodul. Segmen berikut harus muncul setelahESTABLISHED,RELATED garis generik Anda :

...
$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

Sekarang, masalah terakhir (satu atau dua tahun terakhir) dengan China adalah bahwa mereka menjadi sangat pintar dan sangat sering begitu mereka diblokir dari satu alamat IP mereka hanya beralih ke yang lain di sub-net yang sama dan melanjutkan. Ini menjalankan risiko kehabisan entri tabel terkini standar (saya pikir standarnya adalah 200). Saya memonitor ini dan kemudian mencari segmen IP yang sebenarnya, dan secara permanen memblokir seluruh segmen. Dalam kasus saya, saya tidak peduli dengan kerusakan jaminan, yaitu memblokir seseorang yang tidak bersalah:

#
# 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
...

Di mana di atas:

# 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"

Anda bisa mendapatkan seluruh daftar alamat IP untuk China, atau negara mana saja, dalam format iptables, atau lainnya, di sini . Namun daftar itu panjangnya mengejutkan dan agak dinamis. Saya sendiri, saya memutuskan untuk tidak memblokir seluruh daftar.

Doug Smythies
sumber
Ini ^! Mungkin jawaban terbaik yang pernah saya terima. Ini mungkin pertanyaan bodoh, tapi saya kira semua aturan ini masuk ke skrip bash, kan? Saya masih memiliki beberapa masalah dalam memahami iptables tetapi saya merasa itu menarik.
Caranfil Alegzandru
Ya, saya menggunakan skrip bash. Beberapa, dan saya juga menggunakan, menggunakan metode pemulihan iptables langsung, yang lebih cepat memuat. Saya berubah karena saya menyertakan beberapa perintah non-iptables dalam skrip yang sama.
Doug Smythies
12

Blok China menggunakan ipset

Anda tidak dapat secara manual menambahkan beberapa ribu alamat IP ke iptables Anda, dan bahkan melakukannya secara otomatis adalah ide yang buruk karena dapat menyebabkan banyak beban CPU (atau jadi saya sudah baca). Sebaliknya kita dapat menggunakan ipset yang dirancang untuk hal semacam ini. ipset menangani daftar besar alamat ip; Anda cukup membuat daftar dan kemudian kirim iptables untuk menggunakan daftar itu dalam aturan.

Catatan; Saya berasumsi bahwa keseluruhan hal berikut dilakukan sebagai root. Sesuaikan sesuai jika sistem Anda didasarkan pada sudo.

apt-get install ipset

Selanjutnya, saya menulis skrip Bash kecil untuk melakukan semua pekerjaan, yang Anda harus bisa mengerti dari komentar di dalamnya. Buat file:

nano /etc/block-china.sh

Inilah yang ingin Anda rekatkan ke dalamnya:

# 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

Simpan file. Jadikan itu dapat dieksekusi:

chmod +x /etc/block-china.sh

Ini belum melakukan apa-apa, tetapi akan dalam semenit ketika kita menjalankan skrip. Pertama, kita perlu menambahkan aturan ke iptables yang merujuk ke daftar ipset baru yang ditentukan oleh skrip di atas:

nano /etc/iptables.firewall.rules

Tambahkan baris berikut:

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

Simpan file. Supaya jelas, iptables.firewall.rules lengkap saya sekarang terlihat seperti ini:

*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

Saat ini, tidak ada yang berubah dengan server karena tidak ada aturan baru yang diterapkan; untuk melakukannya, jalankan skrip block-china.sh:

/etc/block-china.sh

Ini akan menunjukkan beberapa output karena menarik daftar baru IP berbasis Cina dan kemudian, setelah beberapa detik, itu akan menyelesaikan dan menjatuhkan Anda kembali ke command prompt.

Untuk menguji apakah itu berhasil, jalankan:

iptables -L

Anda seharusnya sekarang melihat aturan baru yang memblokir Cina - hasilnya akan terlihat seperti ini:

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

Hampir selesai! Ini berfungsi, dan akan terus bekerja pada boot ulang. Tapi, alamat IP berubah dan daftar itu akan menjadi basi seiring waktu. Jika Anda ingin menarik dan menerapkan daftar IP yang diperbarui, Anda dapat menjalankan skrip block-china.sh lagi.

Kami juga dapat mengatur mesin untuk melakukan itu secara otomatis melalui tugas cron:

crontab -e

Tambahkan baris seperti ini:

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

Ini akan menjalankan /etc/block-china.sh pukul 5 pagi setiap hari. Pengguna yang menjalankan skrip harus root atau memiliki hak akses root.

sumber

Surjit Sidhu
sumber
Mengapa membatasi hanya pada protokol tcp? Tampaknya berfungsi tanpa menentukan protokol. Sarankan untuk menggunakan daftar teragregasi yang lebih baru, karena lebih pendek:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies
Tidak ada yang mengembalikan ipset setelah boot ulang.
Doug Smythies
4

Anda mungkin ingin menginstal sesuatu seperti fail2ban sehingga ia memblokir ips yang mencoba masuk ke server Anda dan gagal.

Kyle H
sumber
saya juga bisa menggunakan csf firewall dan memblokir setiap negara yang saya inginkan dari file konfigurasi. Masalahnya adalah saya benar-benar ingin menggunakan iptables sehingga saya bisa belajar lebih banyak tentangnya.
Caranfil Alegzandru
Anda harus melihat negara mana yang memiliki blok alamat IP yang ditugaskan untuk mereka untuk mencari tahu siapa yang akan diblokir. Tidak yakin apakah itu akan sangat akurat atau tidak. Anda dapat menggunakan iptables -L untuk menampilkan aturan iptables saat ini, iptables-save untuk menunjukkan perintah apa yang dijalankan untuk membuat aturan tersebut, lalu rancang aturan Anda sendiri dan uji menggunakan mesin uji untuk mempelajarinya. Begitulah cara saya mempelajarinya.
Kyle H
0

Anda dapat menggunakan modul geoip untuk iptables: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

Setelah sistem kami ditingkatkan dan dependensi diinstal, kami sekarang akan menginstal xtables-addons di mesin kami. Untuk melakukannya, kami akan mengunduh tarball terbaru dari situs proyek resmi xtables-addons menggunakan wget. Setelah diunduh, kami akan mengekstrak tarball, lalu mengkompilasi dan menginstalnya di mesin kami.

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 [...]

Selanjutnya, kita akan menjalankan modul bernama xt_geoip yang dilengkapi dengan ekstensi xtables-addons yang mengunduh basis data GeoIP dari MaxMind dan mengubahnya menjadi bentuk biner yang dikenali oleh xt_geoip. Setelah diunduh, kami akan membangunnya dan memindahkannya ke xt_geoipjalur yang diminta, yaitu /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/

Berikut sintaks dasar untuk menggunakan iptables dengan modul geoip untuk memblokir lalu lintas yang berasal dari atau ditakdirkan ke suatu negara. Di sini, kita perlu menggunakan kode ISO3166 dua huruf sebagai pengganti negara, misalnya, AS untuk Amerika Serikat, IE untuk Irlandia, IN untuk India, CN untuk Cina dan sebagainya.

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]
Markus Lenger
sumber
0

Anda gunakan untuk Daftar Firewall IP2Location untuk menghasilkan iptables untuk Cina.

File ini dalam format berikut. Jalankan di shell dan Anda harus memblokir semua alamat IP China.

iptables -A INPUT -s 8.8.8.8/24 -j DROP
Michael C.
sumber