ฉันยังใหม่กับ Ubuntu ที่ย้ายจากการโฮสต์บน CentOS7 ซึ่งใช้ iptables และฉันรู้สึกสบายใจกับวิธีที่ apf และ bfd จัดการ (ซ่อน) iptables จากฉัน .. และมันก็ทำงานได้ดี
ดังนั้นฉันจึงย้ายไปที่ Ubuntu (20.04 LSR) และ "ubuntu-way" เพื่อทำไฟร์วอลล์ด้วยการพยายามแบนอัตโนมัติเพื่อเจาะระบบดูเหมือนจะเป็น nftables และ fail2ban
ฉันใช้ iRedMail เพื่อตั้งค่าเซิร์ฟเวอร์อีเมลพื้นฐาน nginx, postfix, dovecot, clamav, roundcube และอื่น ๆ และกำหนดค่า fail2ban เพื่อดูบันทึกสำหรับความพยายามในการแฮ็กเข้าสู่บริการอีเมลและ ssh และอื่น ๆ และฉันได้เห็น มันแยกวิเคราะห์บันทึกเมลของฉันอย่างถูกต้องและจัดเก็บ fial2ban ips ที่ถูกบล็อกในตาราง inet f2b-table
สิ่งนี้รอดจากการรีบูตอย่างถูกต้อง แต่ฉันสังเกตเห็นว่าไฟล์ /etc/nftables.conf ไม่มีตารางที่ล้มเหลวใด ๆ อยู่ในนั้น - มันมีไฟร์วอลล์พื้นฐานของฉันซึ่งฉันสามารถอัปเดตแบบคงที่เพื่อปฏิเสธพอร์ต tcp ทั้งหมดที่ฉันต้องการ (โดยพื้นฐานแล้ว เมลและเว็บเซิร์ฟเวอร์และ ssh)
แต่เท่าที่ฉันเห็น กฎของ fail2ban ไม่ได้อยู่ในไฟล์ config แต่ดูเหมือนว่าจะถูกสร้างขึ้นใหม่เมื่อบูตจากรายการในตาราง fail2ban ในฐานข้อมูล mysql ที่ตั้งค่าโดย iRedMail
ไม่เป็นไร .. แต่นี่คือภาวะที่กลืนไม่เข้าคายไม่ออก:
ถ้าฉันเพิ่มกฎในไฟร์วอลล์ด้วยตนเองโดยใช้ประโยชน์จากตารางที่มีอยู่สำหรับ fail2ban ฉันสามารถ..
nft เพิ่มองค์ประกอบ inet f2b-table addr-set-postfix-pregreet { spammer.ip.addr.here }
มันปรากฏขึ้นและใช้งานได้ .. ฉันทดสอบโดยการล็อคตัวเองสำเร็จแล้วลบออกผ่านคอนโซลในเครื่อง ..
ยกเว้นเมื่อฉันรีบูท ตารางทั้งหมดจะสูญหายไปและสร้างขึ้นใหม่โดย fail2ban จากรายการตาราง (ฉันก็ยังเจ๋งเหมือนเดิม)
ดังนั้นฉันไปข้างหน้าและเพิ่มโต๊ะ / สิ่งของใหม่ของฉันเอง
ผู้ส่งสแปมตาราง inet {
ตั้งหลุมดำ {
พิมพ์ ipv4_addr
องค์ประกอบ = { sample.ip.addr.here }
}
เชนสแปมเมอร์-เชน {
ประเภท ตัวกรองเบ็ด ตัวกรองลำดับความสำคัญของอินพุต - 2; นโยบายยอมรับ;
ip saddr @blackhole ดรอป
}
}
ทดสอบสิ่งนี้อีกครั้งและใช้งานได้ดี แต่เพื่อที่จะคงอยู่ฉันต้องเขียนไปที่ /etc/nftables.conf หรือตั้งค่าไดเร็กทอรีนั้นให้อ่านในกฎของฉัน ฯลฯ
ฉันสามารถทำได้โดยการเพิ่มการรวมใน nftables.conf ของฉันในไดเร็กทอรีของกฎตามอำเภอใจแล้วเก็บตารางของฉันไว้ทุกครั้งที่ฉันเพิ่มที่อยู่ แต่สิ่งนี้ดูน่าเกลียดและผิด
ราวกับว่าฉันต้องการเพิ่มสแปมเมอร์รายใหม่ในรายการของฉัน ฉันสามารถทำได้
nft เพิ่มองค์ประกอบ inet ผู้ส่งอีเมลขยะ blackhole { new.ip.addr.here }
แต่แล้วจะต้อง.. ยืนยันตารางไปยังไฟล์ของฉันหรือไม่
รายการ nft ตารางผู้ส่งอีเมลขยะ inet > /etc/nftables.d/spammers.conf
นั่นเป็นวิธีหนึ่งที่ฉันสามารถทำได้ แต่ฉันเคยเห็นคนอื่นพูดถึง netfilter-persist แต่นั่นไม่ใช่ส่วนหนึ่งของ Ubuntu ดังนั้นก่อนที่ฉันจะออกไปทั้งประดิษฐ์วงล้อของตัวเองหรือลงไปที่โพรงกระต่าย netfilter-persist หรือ (ไม่ ขอบคุณ) ทำบางสิ่งที่คล้ายกับที่ Fail2ban ดูเหมือนจะทำไปแล้ว... (จัดเก็บ IP ที่ถูกแบนในฐานข้อมูลและสร้างรายการใหม่เมื่อเข้าสู่ระบบ)
ฉันสามารถคิดได้หลายวิธี .. แต่ฉันสงสัยว่ามี "แนวทางปฏิบัติที่ดีที่สุด" "Ubuntu-way" ที่ฉันหายไปที่นี่หรือไม่ ...
อัปเดต/แก้ไข: เว้นแต่ฉันจะได้รับคำแนะนำที่ดีกว่า "วิธีแก้ปัญหา" ของฉันในตอนนี้คือ
mkdir /etc/nftables.d/
รายการ nft ตารางผู้ส่งอีเมลขยะ inet > /etc/nftables.d/spammers.conf
จากนั้นฉันก็แก้ไข /etc/nftables.conf เพื่อเพิ่มบรรทัดนี้ที่ด้านล่าง
รวม "/etc/nftables.d/*.conf"
ตอนนี้ เมื่อฉันเพิ่มบล็อกลงในตาราง มันเป็น 2 ขั้นตอน:
nft เพิ่มองค์ประกอบ inet ผู้ส่งอีเมลขยะ blackhole { some.evildoer.ip.address }
รายการ nft ตารางผู้ส่งอีเมลขยะ inet > /etc/nftables.d/spammers.conf
มันไม่ได้สวยงามที่สุด แต่ใช้งานได้จริง .. แน่นอนว่าฉันสามารถรวมทั้งหมดนี้ไว้ในสคริปต์ที่กำหนดเองของฉันเองเพื่อที่ฉันจะได้เรียกสิ่งที่ต้องการ
สแปมเมอร์ "badguy.ip.addr.here"
และ banspammer จะเพิ่มองค์ประกอบที่อยู่ที่ระบุและบันทึกตารางที่อัปเดต def...
อีกครั้งนี่รู้สึกเหมือน "ไม่ใช่แนวปฏิบัติที่ดีที่สุด" ดังนั้นคำถามของฉัน
แก้ไข: 2021-12-22
โอเค ฉันค่อนข้างคุยกับตัวเองแต่เนื่องจากฉันไม่ได้รับคำติชมใดๆ ฉันจึงทำตามไอเดียของฉัน - มันใช้ได้ผลและฉันได้เขียนสคริปต์แบนสแปมเมอร์เล็กๆ นี้...มันดิบและอาจอันตรายมาก - ฉันไม่ได้ตรวจสอบสุขภาพจิต เช่น รบกวนตรวจสอบว่าเส้นทางไฟล์ config นั้นถูกต้องหรือไม่ และไม่ได้ทำการสำรองข้อมูลไฟล์ดังกล่าว ฯลฯ ...
เนื่องจากรายการตารางเป็นประเภท ipv4_addr nftables จึงทำการตรวจสอบ ดังนั้นฉันจึงไม่ต้องกังวลเกี่ยวกับเรื่องนี้มากนัก
โปรดทราบว่าการตั้งค่าเฉพาะของฉันมีตัวกรองชื่อ fileter ในตระกูล inet แล้ว - ฉันเพิ่มสิ่งนี้เป็นพิเศษเป็นรายการที่มีลำดับความสำคัญต่ำกว่าเล็กน้อย ฉันยังสร้างไดเร็กทอรี /etc/nftables.d และเพิ่มในโค้ดของฉันเพื่อให้แยกวิเคราะห์ไดเร็กทอรี config เป็น ฉันกล่าวถึงข้างต้น
หวังว่าบางคนจะพบว่าสิ่งนี้มีประโยชน์
ฉันยังคงสนใจ "Ubuntu-way" มากกว่าหากมีสิ่งนี้
#!/usr/bin/sh
#################################################### ##############################
# banspammer 2021-12-22 DigitalSorceress
#
# สรุป
# สคริปต์นี้เพิ่ม ip หรือช่วงของ Ips (ดูการเพิ่มองค์ประกอบ) ให้กับ nftables
# โดยเฉพาะกับหลุมดำสแปมเมอร์ของฉัน
# มันยังคงอยู่ที่ /etc/nftables.d/spammers.conf
#
# วางสิ่งนี้ไว้ที่ใดที่หนึ่งเช่น /root/tandautils
# จากนั้นไปที่ /user/local/sbin และ ln -s /root/tandautils/banspammer.sh banspammer
#
#################################################### ##############################
# จัดการบรรทัดคำสั่ง args
คำสั่ง = $1
ที่อยู่=$2
# ตำแหน่งของไฟล์กำหนดค่า ssh daemon
# ค่าเริ่มต้นสำหรับ CentOS คือ CONFIG_FILE=/etc/ssh/sshd_config
#
CONFIG_FILE=/etc/nftables.d/spammers.conf
# นี่คือรูทีนย่อยสำหรับการดำเนินการแต่ละรายการ
ban_spammer () {
# ออกคำสั่งพื้นฐานเพื่อแบนผู้ส่งสแปม
echo "เพิ่มสแปมเมอร์ใน blackhole ..."
nft เพิ่มองค์ประกอบ inet ผู้ส่งอีเมลขยะ blackhole { ${ADDRESS} }
BAN_SPAMMER_RESULT=$?
ถ้า [ $BAN_SPAMMER_RESULT -eq 0 ]
แล้ว
echo " เสร็จสิ้น: เพิ่ม ${ADDRESS} ไปยังตารางสแปมเมอร์"
ไฟ
เสียงก้อง ""
}
unban_spammer () {
# ออกคำสั่งพื้นฐานเพื่อแบนผู้ส่งสแปม
echo "ลบ spammer จาก blackhole ..."
nft ลบองค์ประกอบ inet สแปมเมอร์ หลุมดำ { ${ADDRESS} }
UNBAN_SPAMMER_RESULT=$?
ถ้า [ $UNBAN_SPAMMER_RESULT -eq 0 ]
แล้ว
echo " เสร็จสิ้น: ลบ ${ADDRESS} จากตาราง"
ไฟ
เสียงก้อง ""
}
ถาวร_spamtable () {
echo "ยังคงส่งสแปมไปยัง ${CONFIG_FILE}..."
# เราจำเป็นต้องยืนยันตารางสแปมเพื่อกำหนดค่า
รายการ nft ตารางผู้ส่งอีเมลขยะ inet > ${CONFIG_FILE}
ถ้า [ $? -eq 0 ]
แล้ว
echo "เสร็จแล้ว..แสดงตาราง..."
เสียงก้อง ""
nft รายการตารางผู้ส่งสแปม inet
อื่น
echo "ตารางเกิดข้อผิดพลาด.."
ไฟ
เสียงก้อง ""
}
list_spamtable () {
echo "รายชื่อ spamtable"
เสียงก้อง ""
nft รายการตารางผู้ส่งสแปม inet
เสียงก้อง ""
}
kill_spamtable () {
echo "กำลังรีเซ็ต / สร้างตารางสแปมว่าง ${CONFIG_FILE}..."
#rm -f /etc/nftables.d/spammers.conf
ที /etc/nftables.d/spammers.conf <<EOF
ผู้ส่งสแปมตาราง inet {
ตั้งหลุมดำ {
พิมพ์ ipv4_addr
}
เชนสแปมเมอร์-เชน {
ประเภท ตัวกรองเบ็ด ตัวกรองลำดับความสำคัญของอินพุต - 2; นโยบายยอมรับ;
ip saddr @blackhole ดรอป
}
}
อฟ
เสียงก้อง ""
ถ้า [ $? -eq 0 ]
แล้ว
echo "สำเร็จ.. นี่คือไฟล์ใหม่:"
เสียงก้อง ""
แมว /etc/hftables.d/spammers.conf
อื่น
echo "เขียนไฟล์ผิด..."
ไฟ
เสียงก้อง ""
}
ช่วยฉันด้วย () {
echo "นี่คือเครื่องมือที่ช่วยลดความซับซ้อนในการบล็อกที่อยู่ IP ของผู้ส่งสแปม"
เสียงสะท้อน " "
echo "banspammer 2021-12-22 DigitalSorceress"
เสียงสะท้อน " "
echo "สรุป"
echo " สคริปต์นี้ใช้เพื่อลดความซับซ้อนของการเพิ่ม/ลบสแปมเมอร์จาก "
echo " ตารางสแปมเมอร์ในชุดกฎ nftables "
เสียงสะท้อน " "
เสียงสะท้อน " "
echo "การใช้งาน: $0 คำสั่งแบนสแปมเมอร์ [ที่อยู่] "
เสียงสะท้อน " "
echo " ตัวเลือกคำสั่ง: "
echo " ที่อยู่ห้าม "
echo " แบนที่อยู่เป้าหมาย สามารถเป็น singe IP หรือ comma sep list "
เสียงสะท้อน " "
echo "ปลดแบนที่อยู่"
echo " ลบที่อยู่เป้าหมายอาจเป็น single IP หรือรายการเครื่องหมายจุลภาค "
เสียงสะท้อน " "
เสียงสะท้อน "รีเซ็ต"
echo " ล้างรายการทั้งหมดจากตารางผู้ส่งอีเมลขยะ "
echo " โปรดทราบว่าสิ่งนี้สามารถใช้เพื่อสร้างตารางว่างใหม่ "
เสียงสะท้อน " "
เสียงสะท้อน "แสดง"
echo " แสดงรายการตารางสแปมปัจจุบัน "
เสียงสะท้อน " "
ก้อง "ช่วย"
echo " แสดงกล่องโต้ตอบความช่วยเหลือนี้"
}
#ที่นี่เราทำงานจริงตามคำสั่งที่ผ่านไป
กรณี "$COMMAND" ใน
ห้าม)
ถ้า [ $# -eq 2 ]
แล้ว
echo "ที่อยู่ห้าม: ${ADDRESS}"
ban_spammer ${ADDRESS}
ถ้า [ $BAN_SPAMMER_RESULT -eq 0 ]
แล้ว
ถาวร_spamtable
ไฟ
อื่น
echo "คำสั่งห้ามต้องการ IP เดียวหรือรายการ IP ที่คั่นด้วยเครื่องหมายจุลภาค "
ไฟ
;;
ปลดแบน)
ถ้า [ $# -eq 2 ]
แล้ว
echo "ยกเลิกการแบนที่อยู่: ${ADDRESS}"
unban_spammer ${ADDRESS}
ถ้า [ $UNBAN_SPAMMER_RESULT -eq 0 ]
แล้ว
ถาวร_spamtable
ไฟ
ไฟ
;;
แสดง)
list_spamtable
;;
รีเซ็ต)
kill_spamtable
;;
ช่วย)
ช่วยฉันด้วย
;;
*)
echo "การใช้งาน: $0 ban|unban comma-separated-ip-list or $0 show|reset"
ทางออก 1
เอสแซค