ฉันจะกำหนดค่า/etc/syslog.conf
ไฟล์เพื่อบันทึกข้อมูลบันทึกiptables
ในไฟล์ที่ต้องการได้อย่างไร
ฉันต้องการบันทึกข้อมูลเหล่านี้แยกต่างหากดังนั้นฉันสามารถแยกสิ่งที่ฉันต้องการได้อย่างง่ายดายและรวดเร็ว
ฉันจะกำหนดค่า/etc/syslog.conf
ไฟล์เพื่อบันทึกข้อมูลบันทึกiptables
ในไฟล์ที่ต้องการได้อย่างไร
ฉันต้องการบันทึกข้อมูลเหล่านี้แยกต่างหากดังนั้นฉันสามารถแยกสิ่งที่ฉันต้องการได้อย่างง่ายดายและรวดเร็ว
คำตอบ:
iptables
ลองดูในหน้าคนสำหรับ มันแสดงเป้าหมายที่เรียกว่าLOG
ซึ่งสามารถทำสิ่งที่คุณต้องการ
ตั้งค่าระดับการบันทึกLOG
เป็น 4
# DROP everything and Log it
iptables -A INPUT -j LOG --log-level 4
iptables -A INPUT -j DROP
กำหนดค่าsyslog.conf
ให้เขียนข้อความเหล่านี้ไปยังไฟล์แยกต่างหาก
# /etc/syslog.conf
kern.warning /var/log/iptables.log
รีสตาร์ท syslogd
Debian / Ubuntu
$ sudo /etc/init.d/sysklogd restart
Fedora / CentOS / RHEL
$ sudo /etc/init.d/syslog restart
หมายเหตุ:วิธีการบันทึกนี้เรียกว่าลำดับความสำคัญคงที่ เป็นตัวเลขหรือชื่อ (1,2,3,4, .. ) หรือ (DEBUG, WARN, INFO และอื่น ๆ )
หากบังเอิญที่คุณใช้rsyslog
คุณสามารถสร้างตัวกรองตามคุณสมบัติเช่น:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
จากนั้นเพิ่มสวิตช์เหล่านั้นในกฎ iptables ของคุณที่คุณต้องการบันทึก:
–log-prefix NETFILTER
นอกจากนี้คุณยังสามารถบันทึกข้อความโดยใช้ตัวกรองคุณสมบัติประเภทนี้:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
หมายเหตุ:วิธีการนี้ 2 iptables
ไม่จำเป็นต้องมีการเปลี่ยนแปลงใด
/var/log/iptables
/var/log/messages
ฉันต้องการเพียงหนึ่งสำเนาจากข้อมูลนี้ในiptables.log
สิ่งนี้จะถือว่าไฟร์วอลล์ของคุณสร้างบันทึกอยู่แล้วตามที่ควรจะเป็นไฟร์วอลล์มีสติ สำหรับตัวอย่างมันต้องการข้อความที่ระบุตัวตนได้เช่น "NETFILTER" ในตัวอย่างของ slm
ทำไฟล์ใน rsyslog.d
vim /etc/rsyslog.d/10-firewall.conf
สิ่งนี้ใช้งานได้ใน CentOS 7 ฉันไม่ทราบวิธีตรวจสอบว่ามาจากไฟร์วอลล์อื่นนอกเหนือจากการค้นหาเข้าและออก ... CentOS นั้นแปลก อย่าใช้สิ่งนี้เว้นแต่ว่าเวอร์ชั่นถัดไปจะใช้ไม่ได้
# into separate file and stop their further processing
if ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
สิ่งนี้ใช้ได้ใน CentOS 7 และตรวจสอบเนื้อหาข้อความด้วย (แทนที่ "Shorewall" ด้วยสิ่งที่คุณมีในข้อความของกฎ -j LOG):
# into separate file and stop their further processing
if ($msg contains 'Shorewall') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
สิ่งนี้ใช้ได้กับคนอื่น ๆ (Ubuntu, Debian, openSUSE) และนี่คือวิธีที่ดีที่สุดที่จะทำ ไม่มีการค้นหาสตริงในข้อความ:
# into separate file and stop their further processing
if ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then -/var/log/firewall
& ~
และนี่คือสิ่งที่เครื่อง openSUSE เริ่มต้นมี (ซึ่งฉันคิดว่าทุก distro ควรมีและหายไป) (ความแตกต่างนั้นน่าจะเป็น "หยุด" แทนที่จะเป็น "& ~"; ไม่ใช่ทุกระบบรองรับไวยากรณ์ทั้งสอง):
if ($syslogfacility-text == 'kern') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
stop
}
และสำหรับสิ่งที่กล่าวมาทั้งหมดอย่าลืมไฟล์ logrotate.d ด้วย:
vim /etc/logrotate.d/firewall
ที่มี:
/var/log/firewall {
rotate 7
size 500k
postrotate
# before using this, run the command yourself to make sure
# it is right... the daemon name may vary
/usr/bin/killall -HUP rsyslogd
endscript
}