在使用 NASCTL 这类软件,在手机上管理 transmission 和 qBittorrent 时,我们可能会担心它会不会使坏。
假如开发者恶意设置这个选项,可能会破坏我们的 NAS,是能在我们的系统中植入木马程序的。

iShot_2023-12-27_13.17.21.png

有没有办法监控所有操作

答案是的,我们可以使用 Nginx 代理 qb 的所有流量,并记录 request_body。这样此类客户端对我们 tr 和 qb 做的所有操作就都能被记录了,如果发现被植入了木马,我们可以查看日志,搜索相关内容,确认是不是客户端给我们植入了非我们控制的程序。

前提条件

假如我们的下载程序之前应该使用下面地址访问:

我们想要使用 Nginx 代理所有流量,代理之后我们使用下面地址访问:

注意:原先的端口为 90918080,代理之后的端口为 1909118080

找到 NGINX 配置文件

一般情况下这个文件的位置位于 /etc/nginx/nginx.conf,这个文件的位置可以通过下面方式找到。
在命令行中执行 nginx -V,即可输出编译参数,其中 --conf-path=/etc/nginx/nginx.conf 就是默认的 nginx.conf 路径。

[root@server02 nginx]# nginx -V
nginx version: nginx/1.20.2
built by gcc 4.8.5 20150623 (Red Hat 4.8.5-44) (GCC) 
built with OpenSSL 1.0.2k-fips  26 Jan 2017
TLS SNI support enabled
configure arguments: --prefix=/etc/nginx --sbin-path=/usr/sbin/nginx --modules-path=/usr/lib64/nginx/modules --conf-path=/etc/nginx/nginx.conf --error-log-path=/var/log/nginx/error.log

分析 NGINX 初始配置

以下是一个初始的 NGINX 配置:

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;
    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

以下部分指定了NGINX需要在日志中记录的内容:

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

这是定义了一个 main 日志格式,包含了后面的所有参数。

创建新的日志记录格式

我们的需求是记录所有 POST 内容,因此我们需要在 main 基础上新增一个自定义的日志记录格式。
我们在这三行文件下方新增一个配置,并将 $request_body 加入到末尾,这样调用这个新的日志格式时,即可在日志中同时记录 POST BODY 了。

下面我们定义了一个名为 mainWithBody 的日志格式,并在末尾添加了 $request_body,由 3 行变成了 4 行。

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';
    log_format  mainWithBody  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      '"$request_body"';

将修改同步到 NGINX 主配置

修改后的完整配置应该是这样的:

user  nginx;
worker_processes  auto;
error_log  /var/log/nginx/error.log notice;
pid        /var/run/nginx.pid;

events {
    worker_connections  1024;
}

http {
    include       /etc/nginx/mime.types;
    default_type  application/octet-stream;

    log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"';

    log_format  mainWithBody  '$remote_addr - $remote_user [$time_local] "$request" '
                      '$status $body_bytes_sent "$http_referer" '
                      '"$http_user_agent" "$http_x_forwarded_for"'
                      '"$request_body"';

    access_log  /var/log/nginx/access.log  main;
    sendfile        on;
    #tcp_nopush     on;
    keepalive_timeout  65;
    #gzip  on;
    include /etc/nginx/conf.d/*.conf;
}

代理下载程序并指定使用新的日志记录格式

在上述配置文件的末尾,我们可以看到这一行 include /etc/nginx/conf.d/*.conf;,此行配置指定了 NGINX 在启动时会查找 /etc/nginx/conf.d/ 下的所有结尾为 .conf 的配置文件,并载入一并启动。

我们需要在这个目录下新建一个 proxy.conf 用来启动反向代理。

以下是这个配置文件的内容和说明:

server {
    # 指定监听端口为 18080
    listen       18080;
    server_name  localhost;

    charset utf-8;

    # 指定日志的位置为 /var/log/nginx/qb.18080.access.log
    # 日志格式为刚才定义的 mainWithBody
    access_log  /var/log/nginx/qb.18080.access.log  mainWithBody;

    location / {
        # 代理 qBittorrent
        proxy_pass  http://192.168.1.80:8080/;
        proxy_set_header X-Forwarded-Host $http_host;
    }

    location /transmission/ {
        # 代理 qBittorrent
        proxy_pass  http://192.168.1.80:9091/transmission/;
        proxy_set_header X-Forwarded-Host $http_host;
    }
}

验证 NGINX 配置

使用下面的命令来验证配置是否正确,如果输出为 ok 和 successful 则表示配置文件无误:

[root@server02 conf.d]# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

当配置出现错误时,会输出下面这种包含 emergfailed 的文本。

[root@ server02 conf.d]# nginx -t
nginx: [emerg] unknown directive "iproxy_pass" in /etc/nginx/conf.d/proxy.conf:14
nginx: configuration file /etc/nginx/nginx.conf test failed

重载 NGINX 配置

当确认配置正确后,我们可以在命令行执行以下指令来通知 NGINX 重新载入新配置,正确重载时没有任何输出:

nginx -s reload

检验端口是否已经启动

我们可以使用 netstat 工具检查 nginx 是否已经成功监听代理端口。
当输出中有 0.0.0.0:18080时,即表示 nginx 已经成功载入配置,启动了 18080 端口的监听。

[root@nas conf.d]# netstat -tunlp|grep nginx
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1908/nginx: master  
tcp        0      0 0.0.0.0:18080           0.0.0.0:*               LISTEN      1908/nginx: master  

修改 NASCTL 的配置

在 NASCTL 软件中编辑配置,将地址由之前的修改为反向代理的地址(主要是端口)。

其他配置保持不变。
保存后重启 NASCTL 可以保证它一定会重新读取配置。

查看日志

在命令行中我们可以执行以下指令来监控日志的新增内容:

tail -f -n 10 /var/log/nginx/qb.18080.access.log

执行完上述命令后,命令行中会持续输出该日志文件新增的内容,我们可以看到以下格式的日志数据,其中每行日志最后由双引号包裹的部分就是由 NASCTL 发送给 qb 的数据。

192.168.123.2 - - [27/Dec/2023:13:53:23 +0800] "POST /api/v2/torrents/pause HTTP/1.1" 200 0 "http://192.168.1.80:18080" "Dart/3.2 (dart:io)" "-""----dio-boundary-1830941146\x0D\x0Acontent-disposition: form-data; name=\x22hashes\x22\x0D\x0A\x0D\x0Ac157c358117b817af79001b62cd0ab811811d755\x0D\x0A----dio-boundary-1830941146--\x0D\x0A"

注意:一般情况下只有 POST 请求才会有 request_body 记录到日志中,GET 请求日志中会显示为 -

注意

若您将此反向代理映射到公网,仍然可能会遭到黑客攻击,当黑客破解了您的密码后,由于黑客和nasctl都是从同一入口访问qb的,此时您将无法分辨是由谁执行了非法操作。

比较安全的方法是实用 虚拟专用网 连接,不将其开放到公网上。

工具说明

您可能需要使用下面指令来安装必要的工具,如 netstat tail

yum install net-tools tail -y

结论

这样当我们发现自己的 NAS 中出现恶意程序时,就可以查看日志,搜索相关程序的名称,查看是不是由 NASCTL 导致的。

以上配置只是一个示例,它在 CentOS 和 Fedora 等 yum 包管理器系统中肯定能够使用,其他环境的用户,可能要根据实际情况修改。