บล็อกจีนด้วย iptables


10

ฉันเพิ่งเข้าสู่ระบบบนเซิร์ฟเวอร์ GitLab และพบว่ามีการเข้าสู่ระบบล้มเหลว 18.974 ครั้งนับตั้งแต่ฉันตรวจสอบเซิร์ฟเวอร์ครั้งล่าสุด - เกือบ 5 วัน ฉันตรวจสอบไอพีแล้วและดูเหมือนว่าพวกเขาเกือบทั้งหมดมาจากจีนและพยายามเข้าถึง SSH และ Brute Force ฉันเริ่มบล็อกไอพี แต่แล้วฉันก็รู้ว่ามันเสียเวลามากและความคิดที่ดีกว่าก็คือการปิดกั้นประเทศทั้งหมด

มีวิธีใดบ้างที่ฉันสามารถปิดกั้นจีนทั้งหมดหรือประเทศอื่น ๆ ด้วย iptables?

ฉันพบบทความบนอินเทอร์เน็ต แต่เกือบทั้งหมดเป็นบทความทุบตี ฉันเป็นมือใหม่บน Linux ดังนั้นฉันจึงไม่เข้าใจสคริปต์เหล่านั้นทั้งหมด ฉันพบว่า iptables น่าสนใจมากและฉันต้องการเรียนรู้เพิ่มเติมเกี่ยวกับมัน

ความคิดใด ๆ ขอบคุณ!


4
ฉันแก้ไขปัญหาเดียวกันในวิธีที่ต่างออกไป ฉันทำให้ SSH แข็งบนเซิร์ฟเวอร์ GitLab ของลูกค้าของฉันโดยการปิดรหัสผ่านและท้าทายการพิสูจน์ตัวตนตามและอนุญาตเฉพาะการเข้าสู่ระบบด้วยคีย์ SSL บางทีนั่นอาจเป็นไปได้ในสถานการณ์ของคุณ? การบล็อกช่วง IP อาจลด "สัญญาณรบกวน" แต่จะไม่ให้การป้องกันที่แท้จริงกับการบังคับให้เดรัจฉาน
mixenzo

จนถึงตอนนี้มันไม่ทำงาน เซิร์ฟเวอร์ gitlab ยังคงทำงานอยู่และฉันมีการหยุดพัก 0 ครั้ง การใช้ Ssh ทำขึ้นเฉพาะกับ ssh-keys และฉันปิดใช้งานการเข้าสู่ระบบรูท เป็นเพียงที่ฉันต้องการเรียนรู้ iptables แย่มาก ..
Caranfil Alegzandru

1
คุณยังสามารถเปลี่ยน ssh ของคุณเป็นพอร์ตที่ไม่ใช่ค่าเริ่มต้นในเราเตอร์ของคุณ นั่นทำให้ความพยายามในการโจมตีบอทของฉันจากหลายร้อยต่อวันเหลือศูนย์
หินอ่อนอินทรีย์

คำตอบ:


7

การใช้ iptables เพื่อระบุตัวตนโดยอัตโนมัติและหลังจากนั้นจะทำการบล็อกคนเลวสำหรับ ssh สามารถทำได้โดยใช้recentโมดูล ส่วนต่อไปนี้จะต้องอยู่หลัง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

ตอนนี้ปัญหาล่าสุด (สองหรือสามปีที่ผ่านมา) กับจีนคือพวกเขาฉลาดและบ่อยครั้งมากเมื่อพวกเขาถูกบล็อกจากที่อยู่ IP หนึ่งพวกเขาเพียงสลับไปที่อื่นบนเครือข่ายย่อยเดียวกันและดำเนินการต่อ นี่จะเสี่ยงต่อการหมดรายการในตารางล่าสุด (ฉันคิดว่าค่าเริ่มต้นคือ 200) ฉันตรวจสอบเรื่องนี้แล้วค้นหาส่วน IP จริงและปิดกั้นกลุ่มทั้งหมดอย่างถาวร ในกรณีของฉันฉันไม่สนใจเกี่ยวกับความเสียหายของหลักประกันนั่นคือการปิดกั้นผู้บริสุทธิ์:

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

ที่ไหนในข้างต้น:

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

คุณจะได้รับรายชื่อทั้งหมดของที่อยู่ IP สำหรับจีนหรือประเทศใด ๆ ใน iptables หรืออื่น ๆ รูปแบบที่นี่ อย่างไรก็ตามรายการมีทั้งยาวและน่าประหลาดใจ ตัวเองฉันตัดสินใจที่จะไม่ปิดกั้นรายการทั้งหมด


นี่ ^! อาจเป็นคำตอบที่ดีที่สุดที่ฉันเคยได้รับ อาจเป็นคำถามที่โง่เง่า แต่ฉันเดาว่ากฎเหล่านี้ทั้งหมดจะกลายเป็นสคริปต์ทุบตีใช่ไหม? ฉันยังคงมีปัญหาในการเข้าใจ iptables แต่ฉันคิดว่ามันน่าทึ่ง
Caranfil Alegzandru

ใช่ฉันใช้สคริปต์ทุบตี บางคนและฉันก็ใช้ด้วยเช่นกันใช้วิธีเรียกคืนโดยตรง iptables ซึ่งเร็วกว่าในการโหลด ฉันเปลี่ยนเพราะฉันรวมคำสั่งที่ไม่ใช่ iptables ไว้ในสคริปต์เดียวกัน
Doug Smythies

12

บล็อกจีนใช้ ipset

คุณไม่สามารถเพิ่มที่อยู่ IP หลายพันรายการใน iptables ของคุณได้ด้วยตนเองและการทำโดยอัตโนมัติเป็นความคิดที่ไม่ดีเพราะอาจทำให้โหลด CPU จำนวนมาก (หรืออย่างที่ฉันได้อ่าน) แต่เราสามารถใช้ ipset ที่ออกแบบมาสำหรับสิ่งนี้ ipset จัดการรายการใหญ่ของที่อยู่ IP; คุณเพิ่งสร้างรายการแล้วบอก iptables ให้ใช้รายการนั้นในกฎ

บันทึก; ฉันคิดว่าทั้งหมดต่อไปนี้เสร็จสิ้นเป็นราก ปรับให้เหมาะสมหากระบบของคุณใช้ sudo

apt-get install ipset

ต่อไปฉันเขียนสคริปต์ Bash ขนาดเล็กเพื่อทำงานทั้งหมดซึ่งคุณควรเข้าใจจากความคิดเห็นในนั้น สร้างไฟล์:

nano /etc/block-china.sh

นี่คือสิ่งที่คุณต้องการวางลงไป:

# 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

บันทึกไฟล์ ทำให้ปฏิบัติการ:

chmod +x /etc/block-china.sh

สิ่งนี้ยังไม่ได้ทำอะไรเลย แต่จะใช้เวลาสักครู่เมื่อเราเรียกใช้สคริปต์ อันดับแรกเราต้องเพิ่มกฎลงใน iptables ที่อ้างถึงรายการ ipset ใหม่ที่สคริปต์ด้านบนกำหนด:

nano /etc/iptables.firewall.rules

เพิ่มบรรทัดต่อไปนี้:

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

บันทึกไฟล์ เพื่อความชัดเจน iptables.firewall.rules ตอนนี้ของฉันจะมีลักษณะดังนี้:

*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

ตอนนี้ไม่มีอะไรเปลี่ยนแปลงกับเซิร์ฟเวอร์เนื่องจากไม่มีกฎใหม่ที่ใช้ หากต้องการทำเช่นนั้นให้เรียกใช้สคริปต์ block-china.sh:

/etc/block-china.sh

สิ่งนี้จะแสดงผลลัพธ์บางอย่างเมื่อดึงรายการ IP ที่อิงกับภาษาจีนใหม่หลังจากนั้นสองสามวินาทีหรือมากกว่านั้นก็จะเสร็จสมบูรณ์และส่งคุณกลับไปที่พร้อมท์คำสั่ง

หากต้องการทดสอบว่าใช้งานได้หรือไม่ให้เรียกใช้:

iptables -L

ตอนนี้คุณควรเห็นกฎใหม่ที่บล็อกจีน - ผลลัพธ์ควรมีลักษณะเช่นนี้:

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

เกือบเสร็จแล้ว! วิธีนี้ใช้ได้ผลและจะยังคงใช้งานได้กับบูทใหม่ แต่การเปลี่ยนแปลงที่อยู่ IP และรายการนั้นจะเพิ่มขึ้นเรื่อย ๆ เมื่อเวลาผ่านไป หากคุณต้องการดึงและใช้รายการ IP ที่อัปเดตคุณสามารถเรียกใช้สคริปต์ block-china.sh อีกครั้ง

นอกจากนี้เรายังสามารถตั้งค่าเครื่องให้ทำโดยอัตโนมัติผ่านงาน cron:

crontab -e

เพิ่มบรรทัดเช่นนี้:

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

สิ่งนี้จะรัน /etc/block-china.sh เวลา 5am ทุกวัน ผู้ใช้ที่เรียกใช้สคริปต์จะต้องเป็นรูทหรือมีสิทธิ์รูท

แหล่ง


ทำไม จำกัด เฉพาะโปรโตคอล TCP เท่านั้น ดูเหมือนว่าจะทำงานโดยไม่ระบุโปรโตคอล แนะนำให้ใช้รายการที่รวบรวมใหม่กว่าเนื่องจากสั้นกว่ามาก:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies

ไม่มีสิ่งใดที่นี่ที่คืนค่า ipset หลังจากรีบูต
Doug Smythies

4

คุณอาจต้องการติดตั้งบางอย่างเช่น fail2ban เพื่อบล็อก ips ที่พยายามเข้าสู่เซิร์ฟเวอร์ของคุณและล้มเหลว


ฉันสามารถใช้ไฟร์วอลล์ csf และบล็อกทุกประเทศที่ฉันต้องการจากไฟล์ปรับแต่ง สิ่งที่ฉันต้องการใช้ iptables จริง ๆ เพื่อให้ฉันสามารถเรียนรู้เพิ่มเติมเกี่ยวกับมัน
Caranfil Alegzandru

คุณจะต้องดูว่าประเทศใดมีบล็อกที่อยู่ IP ที่กำหนดให้กับพวกเขาเพื่อดูว่าใครจะบล็อก ไม่แน่ใจว่ามันจะแม่นยำหรือไม่ คุณสามารถใช้ iptables -L เพื่อแสดงกฎ iptables ปัจจุบัน iptables-save เพื่อแสดงว่าคำสั่งใดถูกเรียกใช้เพื่อสร้างกฎดังกล่าวจากนั้นออกแบบกฎของคุณเองและทดสอบโดยใช้เครื่องทดสอบเพื่อเรียนรู้เกี่ยวกับมัน นั่นคือวิธีที่ฉันเรียนรู้
Kyle H

0

คุณสามารถใช้โมดูล geoip สำหรับ iptables: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

เมื่อระบบของเราได้รับการอัพเกรดและติดตั้งการพึ่งพาเราจะติดตั้ง xtables-addons ในเครื่องของเรา ในการทำเช่นนั้นเราจะดาวน์โหลด tarball ล่าสุดจากไซต์ xtables-addons โครงการอย่างเป็นทางการโดยใช้ wget เมื่อดาวน์โหลดเสร็จแล้วเราจะแยก tarball จากนั้นรวบรวมและติดตั้งในเครื่องของเรา

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

ต่อไปเราจะเรียกใช้โมดูลที่เรียกว่า xt_geoip ที่มาพร้อมกับการขยาย xtables-addons ที่ดาวน์โหลดฐานข้อมูล GeoIP จาก MaxMind xt_geoipและแปลงเป็นรูปแบบไบนารีรับการยอมรับจาก เมื่อมีการดาวน์โหลดเราจะสร้างมันขึ้นมาและย้ายไปยังที่จำเป็น เช่นเส้นทางxt_geoip/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/

นี่คือไวยากรณ์พื้นฐานสำหรับการใช้ iptables กับโมดูล geoip เพื่อป้องกันการรับส่งข้อมูลที่มาจากหรือกำหนดเป้าหมายไปยังประเทศ ที่นี่เราจำเป็นต้องใช้รหัส ISO3166 สองตัวอักษรแทนประเทศเช่นสหรัฐอเมริกา, สหรัฐอเมริกา, IE สำหรับไอร์แลนด์, ในอินเดีย, CN สำหรับจีนและอื่น ๆ

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

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.