บทนำ
iptables
เป็นเครื่องมือที่มีประสิทธิภาพที่ใช้ในการกำหนดค่าไฟร์วอลล์รวมของเคอร์เนล Linux มันติดตั้งมาล่วงหน้าบน Ubuntu ส่วนใหญ่อย่างไรก็ตามถ้าคุณใช้รุ่น Ubuntu ที่กำหนดเองหรือใช้งานภายในคอนเทนเนอร์คุณมักจะต้องติดตั้งด้วยตนเอง
sudo apt-get install iptables iptables-persistent
หลังจากการติดตั้งหากคุณถูกถามว่าจะบันทึกกฎปัจจุบันของคุณหรือไม่มันไม่สำคัญในขณะนี้เพราะคุณกำลังจะลบหรือสร้างกฎใหม่ในภายหลัง
เคล็ดลับ
คุณสามารถใช้netcat
คำสั่ง (ในที่แตกต่างกันคอมพิวเตอร์กว่าเซิร์ฟเวอร์ของคุณ) ในการทดสอบซึ่งของพอร์ตของคุณจะเปิดหรือปิด
nc -z -w5 -v SERVER_IP PORT
nc
คือคำสั่ง netcat
-z
เพียงแค่ส่งแพ็คเก็ตที่ไม่มีน้ำหนักบรรทุก
-w5
รอนานถึง 5 วินาทีสำหรับการตอบกลับ
-v
โหมด verbose
- แทนที่
SERVER_IP
ด้วยที่อยู่เซิร์ฟเวอร์ของคุณ
- แทนที่
PORT
ด้วยพอร์ตที่คุณต้องการทดสอบว่าเปิดอยู่หรือไม่ (เช่น22
)
บนเซิร์ฟเวอร์ของคุณคุณสามารถใช้netstat
คำสั่งเพื่อดูพอร์ตที่กำลังรับฟังการเชื่อมต่ออยู่
sudo netstat -tulpn
หมายเหตุ: แม้ว่าnetstat
เป็นประโยชน์ในการค้นหาพอร์ตที่คุณต้องการที่จะทำงานร่วมกับคุณควรจะตระหนักถึงการใช้งานในปัจจุบันคุณได้ติดตั้งบนเซิร์ฟเวอร์ของคุณและพอร์ตกำลังฟังเพลงคุณไม่ต้องอนุญาตให้มีพอร์ตที่คุณพบในทุกnetstat
เอาท์พุท
วากยสัมพันธ์
sudo iptables -A INPUT -p tcp -m tcp --dport 22 --m geoip --src-cc PE -j ACCEPT
-A INPUT
เพิ่มกฎกับINPUT
ห่วงโซ่ห่วงโซ่คือกลุ่มของกฎที่เราใช้มากที่สุดในคู่มือนี้จะเป็นINPUT
, และOUTPUT
PREROUTING
-p tcp
ชุดtcp
เป็นโปรโตคอลกฎนี้จะมีผลกับคุณยังสามารถใช้โปรโตคอลอื่น ๆ เช่นudp
, หรือicmp
all
-m tcp
ใช้tcp
โมดูล iptables
รองรับคุณสมบัติเพิ่มเติมผ่านโมดูลซึ่งบางส่วนได้ติดตั้งไว้แล้วiptables
และอื่น ๆ เช่นgeoip
โมดูล
--dport 22
คำสั่งที่เริ่มต้นด้วย--
ระบุตัวเลือกเพิ่มเติมสำหรับโมดูลที่ใช้ก่อนหน้านี้ในกรณีนี้เราจะบอกให้tcp
โมดูลใช้กับพอร์ต22
เท่านั้น
-m geoip
ใช้geoip
โมดูล มันจะ จำกัด แพ็คเก็ตในแต่ละประเทศ (ข้อมูลเพิ่มเติมในขั้นตอนที่ 5)
--src-cc PE
บอกให้geoip
โมดูล จำกัด จำนวนแพ็คเก็ตที่เข้ามาให้กับคนที่มาจากเปรู สำหรับรหัสประเทศเพิ่มเติมค้นหาISO 3166 country codes
บนอินเทอร์เน็ต
-j ACCEPT
-j
อาร์กิวเมนต์บอกiptables
ว่าจะทำอย่างไรถ้าแพ็คเก็ต จำกัด ตรงกับที่ระบุไว้ในข้อโต้แย้งก่อนหน้านี้ ในกรณีนี้มันจะACCEPT
แพ็คเก็ตเหล่านั้นตัวเลือกอื่น ๆREJECT
, DROP
และอื่น ๆ คุณสามารถค้นหาตัวเลือกเพิ่มเติมได้โดยค้นหาiptables jump targets
บนอินเทอร์เน็ต
1. พื้นฐาน
รายการกฎทั้งหมด
sudo iptables -L
รายการคำสั่งทั้งหมดที่ใช้ในการสร้างกฎที่ใช้ในปัจจุบันมีประโยชน์ในการแก้ไขหรือลบกฎ
sudo iptables -S
ลบกฎที่เฉพาะเจาะจงเลือกจากกฎsudo iptables -S
และแทนที่ด้วย-A
-D
# -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
sudo iptables -D INPUT -p tcp -m tcp --dport 22 -j ACCEPT
รายการกฎที่มีหมายเลขทั้งหมดในINPUT
ห่วงโซ่
sudo iptables -L INPUT --line-numbers
ลบกฎที่มีหมายเลข
sudo iptables -D INPUT 2
เพื่อล้างกฎทั้งหมด
sudo iptables -F
คำเตือน: คุณอาจสูญเสียการเชื่อมต่อถ้าเชื่อมต่อกันด้วย SSH
ล้างกฎเท่านั้นในOUTPUT
ห่วงโซ่
sudo iptables -F OUTPUT
2. สร้างกฎเริ่มต้น
อนุญาตให้ใช้SSH
บนeth0
ส่วนต่อประสาน
sudo iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-i eth0
ใช้กฎกับอินเตอร์เฟสเฉพาะเพื่ออนุญาตจากอินเตอร์เฟสใด ๆ ให้ลบคำสั่งนี้
เพื่อ จำกัด แพ็คเก็ตที่เข้ามาให้เฉพาะ IP (เช่น10.0.3.1/32
)
sudo iptables -A INPUT -i eth0 -s 10.0.3.1/32 -p tcp -m tcp --dport 22 -j ACCEPT
-s 10.0.3.1/32
ระบุ IP / ซับเน็ตเพื่ออนุญาตการเชื่อมต่อ
ตั้งกฎลูกโซ่เริ่มต้น
คำเตือน: ก่อนที่จะดำเนินการให้แน่ใจว่าคุณได้ใช้กฎ SSH ที่ถูกต้องถ้าทำงานบนเซิร์ฟเวอร์ระยะไกล
sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT
-P INPUT DROP
ปฏิเสธแพ็กเก็ตที่เข้ามาทั้งหมด (เช่นจะไม่มีใครสามารถเชื่อมต่อกับเซิร์ฟเวอร์ที่ใช้งานอยู่ของคุณเช่น Apache, SQL, ฯลฯ )
-P FORWARD DROP
ปฏิเสธแพ็กเก็ตที่ส่งต่อทั้งหมด (เช่นเมื่อคุณใช้ระบบของคุณเป็นเราเตอร์)
-P OUTPUT ACCEPT
อนุญาตให้ใช้แพ็กเก็ตขาออกทั้งหมด (เช่นเมื่อคุณดำเนินการHTTP
ตามคำขอ)
อนุญาตการรับส่งข้อมูลทั้งหมดบนอินเทอร์เฟซวนรอบ ( แนะนำ )
sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT
3. สร้างกฎถาวร
บันทึกiptables
กฎปัจจุบัน
sudo netfilter-persistent save
sudo netfilter-persistent reload
หากคุณกำลังทำงานภายในคอนเทนเนอร์netfilter-persistent
คำสั่งส่วนใหญ่จะไม่ทำงานดังนั้นคุณต้องกำหนดค่าiptables-persistent
แพคเกจใหม่
sudo dpkg-reconfigure iptables-persistent
4. อนุญาตการเชื่อมต่อขาออก
อนุญาตการสืบค้น DNS
sudo iptables -A OUTPUT -p tcp --dport 53 -m state --state NEW -j ACCEPT
sudo iptables -A OUTPUT -p udp --dport 53 -m state --state NEW -j ACCEPT
ใช้state
โมดูลเพื่ออนุญาตRELATED
และESTABLISHED
ส่งแพ็กเก็ต
sudo iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
อนุญาตพอร์ตที่ต้องการ ในกรณีนี้HTTP
พอร์ต
sudo iptables -A OUTPUT -p tcp --dport 80 -m state --state NEW -j ACCEPT
พอร์ตอื่น ๆ ที่คุณอาจต้องการใช้
FTP
: tcp ที่พอร์ต 21
HTTPS
: tcp ที่พอร์ต 443
DHCP
: udp ที่พอร์ต 67
NTP
: udp ที่พอร์ต 123
หมายเหตุ: หากคุณต้องการให้apt-get
มันอาจจะเป็นสิ่งจำเป็นที่จะช่วยให้FTP
HTTPS
และ
อนุญาตการรับส่งข้อมูลที่ส่งคืนสำหรับการเชื่อมต่อRELATED
แล้วเท่านั้นESTABLISHED
( แนะนำเนื่องจากบางครั้งจำเป็นต้องใช้การสื่อสารแบบสองทิศทาง)
sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
กฎที่มีประโยชน์อื่น ๆ
อนุญาตคำขอ ping จากภายนอก
sudo iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
sudo iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
ส่งต่อทราฟฟิกบนeth0
พอร์ต2200
ไปยัง10.0.3.21:22
(มีประโยชน์หากคุณต้องการเปิดเผยเซิร์ฟเวอร์ SSH ที่กำลังทำงานอยู่ภายในคอนเทนเนอร์)
sudo iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 2200 -j DNAT --to-destination 10.0.3.21:22
หากคุณลงชื่อเข้าใช้เซิร์ฟเวอร์ของคุณสำเร็จโดยใช้ SSH การเชื่อมต่อแบบถาวรจะถูกสร้างขึ้น (เช่นไม่มีการเชื่อมต่อใหม่แม้ว่าคุณจะเชื่อมต่อมากกว่า 1 ชั่วโมง) หากคุณล้มเหลวและลองลงชื่อเข้าใช้อีกครั้งการเชื่อมต่อใหม่จะถูกสร้างขึ้น วิธีนี้จะบล็อกความพยายามในการเข้าสู่ระบบ SSH อย่างต่อเนื่องโดย จำกัด การเชื่อมต่อใหม่ต่อชั่วโมง
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set
sudo iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 3600 --hitcount 4 -j DROP
เปลี่ยนเส้นทางคำร้องขอทั้งหมดบนพอร์ต443
ไปยังพอร์ต4430
(มีประโยชน์หากคุณต้องการผูกกับพอร์ต443
โดยไม่มีroot
)
sudo iptables -t nat -A PREROUTING -i ens3 -p tcp --dport 443 -j REDIRECT --to-port 4430
sudo iptables -A INPUT -p tcp -m tcp --dport 4430 -m geoip --src-cc PE -j ACCEPT
ens3
เชื่อมต่อเครือข่าย
-m geoip
โมดูลบล็อกประเทศ (ดูขั้นตอนที่ 5)
คำเตือน: อย่าใช้lo
ระบบปฏิบัติการจะยกเลิกแพ็กเก็ตทั้งหมดเปลี่ยนเส้นทางไปยังอินเตอร์เฟซที่ย้อนกลับ
5. อนุญาตหรือบล็อกทั้งประเทศ
5.1 การติดตั้ง xtables-addons
คุณสามารถติดตั้งxtables-addons
โมดูลได้หลายวิธีอย่าลังเลที่จะใช้วิธีการติดตั้งที่เหมาะกับคุณที่สุด
-
apt-get
ติดตั้งโดยใช้
sudo apt-get install xtables-addons-common
-
module-assistant
ติดตั้งโดยใช้
sudo apt-get install module-assistant xtables-addons-source
sudo module-assistant --verbose --text-mode auto-install xtables-addons
-
ติดตั้งจากแหล่งที่มา
sudo apt-get install git bc libncurses5-dev libtext-csv-xs-perl autoconf automake libtool xutils-dev iptables-dev
git clone git://git.code.sf.net/p/xtables-addons/xtables-addons
cd xtables-addons
./autogen.sh
./configure
make
sudo make install
สร้างฐานข้อมูล "ประเทศ"
sudo apt-get install libtext-csv-xs-perl unzip
sudo mkdir /usr/share/xt_geoip
sudo /usr/lib/xtables-addons/xt_geoip_dl
sudo /usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
sudo rm GeoIPCountryCSV.zip GeoIPCountryWhois.csv GeoIPv6.csv
รีบูตระบบของคุณ
sudo reboot
หลังจากxtables-addons
ติดตั้งสำเร็จแล้วหลังจากรีบูตครั้งแรกให้รันdepmod
มิฉะนั้นการบล็อกประเทศจะไม่สามารถทำงานได้อย่างถูกต้อง (จำเป็นต้องใช้ในครั้งแรกเท่านั้น)
sudo depmod
สร้างสคริปต์ที่/etc/cron.monthly/geoip-updater
เพื่ออัปเดตgeoip
ฐานข้อมูลรายเดือน
#!/usr/bin/env bash
# this script is intended to run with sudo privileges
echo 'Removing old database---------------------------------------------------'
rm -rf /usr/share/xt_geoip/*
mkdir -p /usr/share/xt_geoip
echo 'Downloading country databases-------------------------------------------'
mkdir /tmp/geoip-updater
cd /tmp/geoip-updater
/usr/lib/xtables-addons/xt_geoip_dl
echo 'Building geoip database-------------------------------------------------'
/usr/lib/xtables-addons/xt_geoip_build -D /usr/share/xt_geoip *.csv
echo 'Removing temporary files------------------------------------------------'
cd /tmp
rm -rf /tmp/geoip-updater
ทำให้/etc/cron.monthly/geoip-updater
ปฏิบัติการ
sudo chmod +x /etc/cron.monthly/geoip-updater
5.2 ตัวอย่างกฎ
_Note: หากคุณได้รับiptables: No chain/target/match by that name
ข้อผิดพลาดเมื่อพยายามใช้geoip
กฎอาจเป็นไปได้ว่าxtables-addons
ติดตั้งไม่ถูกต้อง ลองวิธีการติดตั้งอื่น
บล็อกแพ็คเก็ตที่เข้ามาทั้งหมดจากจีน, ฮ่องกง, รัสเซียและเกาหลี
sudo iptables -A INPUT -m geoip --src-cc CN,HK,RU,KR -j DROP
อนุญาตให้แพ็คเก็ตที่เข้ามาในพอร์ต80
จากทุกที่ยกเว้นประเทศข้างต้น
sudo iptables -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
อนุญาตให้แพ็กเก็ตที่เข้ามาบนens3
อินเทอร์เฟซบนพอร์ต22
จากเปรูเท่านั้น (อย่าลังเลที่จะเลือกรหัสประเทศที่คุณต้องการรับแพ็คเก็ตจากตัวอย่างเช่นUS
สำหรับสหรัฐอเมริกา)
sudo iptables -A INPUT -i ens3 -p tcp -m tcp --dport 22 -m geoip --src-cc PE -j ACCEPT
อนุญาตให้แพ็กเก็ตขาเข้าบนพอร์ต443
จากเปรูเท่านั้น
sudo iptables -A INPUT -p tcp -m tcp --dport 443 -m geoip --src-cc PE -j ACCEPT