openwrt记录互联网访问日志

openwrt标准的日志记录功能是使用logd ubox 日志守护程序实现的。默认日志会以固定大小、循环覆盖的方式存储在内存中,可以使用命令logread在路由器上读取。logd还支持通过TCP/UDP的方式将日志发送到远程syslog服务器中。 用iptables标记转发的数据包后,通过logd记录至本地或发送到syslog服务器。

日志

本地记录

在配置文件:/etc/config/systemconfig system字段下面加入以下行:

1
2
3
4
config system 
...
option log_file '/var/log/mylog'
option log_remote '0'

重启服务

1
2
/etc/init.d/log restart
/etc/init.d/system restart

网络记录

在配置文件:/etc/config/systemconfig system字段下面加入以下行:

1
2
3
4
5
config system
...
option log_ip <destination IP>
option log_port <destination port>
option log_proto <tcp or udp>

重启服务

1
2
/etc/init.d/log restart
/etc/init.d/system restart

IPTABLES

记录网络流量

iptables的规则配置文件在/etc/firewall.user中,该配置文件被/etc/config/firewall加载 以下配置仅记录出向的HTTP/HTTPS流量,记录双向网络流量会明显降低路由器速度。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#创建一个用于记录转发数据包(内网到外网)的区域
iptables -N forwarding_log_chain
#附加到forwarding_rule区域
iptables -A forwarding_rule -j forwarding_log_chain

#记录目的端口为80、443的SYN日志(可以使用--syn代替--tcp-flags和FIN-ACK事件)
iptables -A forwarding_log_chain -p tcp --dport 80:443 --tcp-flags ALL SYN -j LOG --log-prefix "HTTP-SYN:"
iptables -A forwarding_log_chain -p tcp --dport 80:443 --tcp-flags ALL ACK,FIN -j LOG --log-prefix "HTTP-ACK-FIN:"

#记录所有源、目的端口为80、443的日志,会增大网络延迟
# iptables -A forwarding_log_chain -p tcp --dport 80:443 -j LOG --log-prefix "HTTP-DPRT-ALL:"
# iptables -A forwarding_log_chain -p tcp --sport 80:443 -j LOG --log-prefix "HTTP-SPRT-ALL:"

#记录出向ICMP
iptables -A forwarding_log_chain -p icmp --icmp 8 -j LOG --log-prefix "ICMP-OUT:"

#清空forwarding_log_chain区域
iptables -F forwarding_log_chain

重启服务

1
2
3
/etc/init.d/log restart 

/etc/init.d/system restart

效果

使用网络记录的方式收取日志,重启服务后即可收到最新的iptables日志。

参考文章

https://openwrt.org/docs/guide-user/firewall/netfilter_iptables/iptables_log_targets https://openwrt.org/docs/guide-user/base-system/log.essentials