Làm cách nào tôi có thể định cấu hình /etc/syslog.conf
tệp để lưu thông tin nhật ký iptables
trong một tệp cụ thể.
Tôi muốn lưu các thông tin này một cách riêng biệt, vì vậy tôi có thể trích xuất những gì tôi muốn một cách dễ dàng và nhanh chóng.
Làm cách nào tôi có thể định cấu hình /etc/syslog.conf
tệp để lưu thông tin nhật ký iptables
trong một tệp cụ thể.
Tôi muốn lưu các thông tin này một cách riêng biệt, vì vậy tôi có thể trích xuất những gì tôi muốn một cách dễ dàng và nhanh chóng.
Câu trả lời:
Hãy xem trong trang người đàn ông cho iptables
. Nó cho thấy một mục tiêu được gọi là LOG
có thể làm những gì bạn muốn.
Đặt mức ghi nhật ký cho LOG
4.
# DROP everything and Log it
iptables -A INPUT -j LOG --log-level 4
iptables -A INPUT -j DROP
Cấu hình syslog.conf
để viết những tin nhắn này vào một tập tin riêng biệt.
# /etc/syslog.conf
kern.warning /var/log/iptables.log
Khởi động lại syslogd.
Debian / Ubuntu
$ sudo /etc/init.d/sysklogd restart
Fedora / CentOS / RHEL
$ sudo /etc/init.d/syslog restart
LƯU Ý: Phương pháp ghi nhật ký này được gọi là ưu tiên cố định. Chúng là số hoặc tên (1,2,3,4, ..) hoặc (DEBUG, WARN, INFO, v.v.).
Nếu tình cờ bạn đang sử dụng rsyslog
, bạn có thể tạo bộ lọc dựa trên thuộc tính như vậy:
# /etc/rsyslog.conf
:msg, contains, "NETFILTER" /var/log/iptables.log
:msg, contains, "NETFILTER" ~
Sau đó thêm chuyển đổi thils vào quy tắc iptables của bạn mà bạn muốn đăng nhập:
–log-prefix NETFILTER
Để thay thế, bạn cũng có thể ghi nhật ký các tin nhắn bằng loại bộ lọc thuộc tính này:
:msg, startswith, "iptables: " -/var/log/iptables.log
& ~
:msg, regex, "^\[ *[0-9]*\.[0-9]*\] iptables: " -/var/log/iptables.log
& ~
LƯU Ý: Phương pháp thứ 2 này không yêu cầu bất kỳ thay đổi nào iptables
.
/var/log/iptables
và cả trong /var/log/messages
. Tôi chỉ muốn một bản sao từ dữ liệu này trongiptables.log
Điều này giả định tường lửa của bạn đã tạo nhật ký, như bất kỳ tường lửa lành mạnh nào cũng nên. Đối với một số ví dụ, nó yêu cầu một thông điệp có thể nhận dạng, chẳng hạn như "NETFILTER" trong ví dụ của slm.
tạo một tập tin trong rsyslog.d
vim /etc/rsyslog.d/10-firewall.conf
Điều này hoạt động trong CentOS 7. Tôi không biết cách xác minh rằng nó đến từ tường lửa ngoài việc tìm kiếm IN và OUT ... CentOS thật kỳ lạ. Đừng sử dụng cái này trừ khi phiên bản tiếp theo không hoạt động.
# into separate file and stop their further processing
if ($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Điều này cũng hoạt động trong CentOS 7 và cũng kiểm tra nội dung tin nhắn (thay thế "Shorewall" bằng bất cứ thứ gì bạn có trong tin nhắn quy tắc -j LOG của bạn):
# into separate file and stop their further processing
if ($msg contains 'Shorewall') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
& ~
}
Điều này hoạt động trong những người khác (Ubuntu, Debian, openSUSE). Và đây là cách tốt nhất để làm điều đó. Không tìm kiếm chuỗi trong tin nhắn:
# into separate file and stop their further processing
if ($syslogfacility-text == 'kern') and \\
($msg contains 'IN=' and $msg contains 'OUT=') \\
then -/var/log/firewall
& ~
Và đây là những gì một máy openSUSE mặc định có (mà tôi nghĩ rằng mọi phân phối nên có và thiếu) (sự khác biệt dường như chỉ là "dừng" thay vì "& ~"; không phải tất cả các hệ thống đều hỗ trợ cả hai cú pháp):
if ($syslogfacility-text == 'kern') and \
($msg contains 'IN=' and $msg contains 'OUT=') \
then {
-/var/log/firewall
stop
}
Và đối với tất cả những điều trên, đừng quên một tệp logrotate.d:
vim /etc/logrotate.d/firewall
chứa:
/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
}