Contents
背景
前些天排查搬瓦工垃圾邮件问题,需要记录经过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
——此处是内容的分割线——
除非注明,否则均为广陌原创文章,转载必须以链接形式标明本文链接
本文链接:https://www.utopiafar.com/2022/08/11/logging-network-requests-via-openwrt/
码字不易,如果觉得内容有帮助,欢迎留言or点赞!
《“配置openwrt的网络请求日志”》 有 1 条评论
[…] 在openwrt上记录了内网dns请求,iptables报文和shadowcks链接。操作方法见配置openwrt的网络请求日志。 […]