配置openwrt的网络请求日志


背景

前些天排查搬瓦工垃圾邮件问题,需要记录经过openwrt的网络请求,这里记录下。

说明:以下配置的环境为LEDE,某些GUI方法在不同的openwrt版本可能略有不同,具体方法请根据openwrt版本微调。

日志收集

默认情况下,以下几种日志都会输出到openwrt的syslog里面,验证方法如下:

# 查看最新syslog
logread

dns请求

openwrt使用dnsmasq提供dns和dhcp服务,所以直接记录dnsmasq的日志就可以了。

命令行

取消记录删除对应行即可。

vi /etc/dnsmasq.conf
# 在dnsmasq.conf中添加以下内容
log-queries

GUI

系统->进阶设置->配置dnsmasq,添加以下内容

log-queries

效果如下

ip报文

这里使用iptables进行记录,出处见参考资料。

实践起来记录line7&8的包就行了,line11&12没必要记。

取消日志可以使用最后一行的iptables -F,也可以直接重启openwrt。

#创建一个用于记录转发数据包(内网到外网)的区域
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

如果需要指定特定几个端口,可以使用如下命令

iptables -A forwarding_log_chain -p tcp -m multiport --dport 80,443,993 --tcp-flags ALL SYN -j LOG --log-prefix "HTTP-SYN:"
iptables -A forwarding_log_chain -p tcp -m multiport --dport 80,443,993 --tcp-flags ALL ACK,FIN -j LOG --log-prefix "HTTP-ACK-FIN:"

效果如图

shadowsocks请求

这是比较tricky的部分了,所以我会写的稍微详细一点。我这边使用的是koolshare的koolss插件,其他版本的插件还需要自行试验下。

首先,koolss并没有暴露出记录日志的配置,不过这难不倒我们,一番研究,我们发现,koolss的可执行文件位于/koolshare/ss和/koolshare/bin下面。

而ss服务的入口,就是这个ssstart.sh!

仔细研读下这个脚本,就会发现它在开启服务的时候,调用了ss-local,ss-redir等服务。于是加日志的方法就来了,我们把ss-local的公共参数加上-v就好了。

得益于作者代码质量还不错,修改起来非常容易。

# 备份ssstart.sh,防止手滑
cp /koolshare/ss/ssstart.sh /koolshare/ss/ssstart.sh.bak
# 修改脚本,修改方法见下文
vi /koolshare/ss/ssstart.sh
# 替换回原有脚本
cp /koolshare/ss/ssstart.sh.bak /koolshare/ss/ssstart.sh

修改方法如下:

vi /koolshare/ss/ssstart.sh
找到第32行,将 SPECIAL_ARG="" 修改为SPECIAL_ARG="-v"

如下图

重启koolss以后即可生效,效果如图。美中不足的是ss没有打印源ip,不过结合iptables日志勉强够用了。

rsyslog配置

以上配置在正常情况下一天的日志量大约在几MB数量级,考虑到大部分人软路由配置都不太高,时间久了很容易爆硬盘或者丢日志。如果需要长时间收集日志,有必要将日志上传到日志服务器上。

网上资料有很多,这里就流水账以下,详细配置请看文末参考资料。

openwrt配置

命令行

# 编辑config,配置远程日志服务器
vim /etc/config/system

添加以下内容

config system
        option hostname 'OpenWrt'
        option conloglevel '8'
        option cronloglevel '8'
        option log_ip '192.168.1.247'
        option log_port '514'
        option log_size '200'

GUI

系统->系统->日志

服务端配置

# 修改rsyslog配置文件,开启服务
sudo vim /etc/rsyslog.conf

找到以下内容,去掉注释

# provides UDP syslog reception
#module(load="imudp")
#input(type="imudp" port="514")

# provides TCP syslog reception
#module(load="imtcp")
#input(type="imtcp" port="514"

配置客户端ip&日志目录

# 创建配置文件
sudo vi /etc/rsyslog.d/openwrt.conf

文件内容如下

:fromhost-ip, isequal, "192.168.1.1" /var/spool/rsyslog/openwrt.log
&~

重启服务

sudo systemctl restart rsyslog.service

如果没有意外的话,过几秒种就可以在配置的位置看到openwrt日志了。

参考资料

1.https://superuser.com/questions/632898/how-to-log-all-dns-requests-made-through-openwrt-router

2.openwrt记录互联网访问日志

3.OpenWrt之Log篇



——此处是内容的分割线——

除非注明,否则均为广陌原创文章,转载必须以链接形式标明本文链接

本文链接:https://www.utopiafar.com/2022/08/11/logging-network-requests-via-openwrt/

码字不易,如果觉得内容有帮助,欢迎留言or点赞!


《“配置openwrt的网络请求日志”》 有 1 条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注