搞了个整合 Aria2 和 AriaNg 的 Docker 镜像,确保了 Aria2 RPC 的安全性。

2019-12-26 10:13:18 +08:00
 sanjusss

简介

前几天想整个 Aria2,发现大部分镜像是需要暴漏 Aria2 RPC,或者是包含额外的文件浏览功能,又或者自带的 AriaNg 不能自动连接 Aria2 的。于是就研究了一下,自己整了一个。欢迎大家提出意见。
这个镜像有以下特点:

仓库地址

Docker Hub https://hub.docker.com/r/sanjusss/aria2-ariang-docker
Github https://github.com/sanjusss/aria2-ariang-docker

使用方法

快速启动

docker run -d --name aria2 -p 80:80 -v ./data:/data sanjusss/aria2-ariang-docker

访问服务器 IP 即可进入 AriaNg 界面,默认用户密码均为 admin。

假设我需要在 5003 端口开启服务,下载路径为 /home/data,aria2 设置保存到 /home/aria2,登录用户为 user,密码为 123456,UID/GID 为 1000

命令行启动

docker run -d --name aria2 \
	-p 5003:80 \
    -v /home/data:/data \
    -v /home/aria2:/conf \
    -e PUID=1000 \
    -e PGID=1000 \
    -e EXTERNAL_PORT=5003 \
    -e USER_NAME=user \
    -e PASSWORD=123456 \
    sanjusss/aria2-ariang-docker

Docker-Compose 示例

docker-compose.yml 文件

version: '3'
services:
    aria2:
        image: sanjusss/aria2-ariang-docker
        container_name: aria2
        environment:
            PUID: 1000
            PGID: 1000
            EXTERNAL_PORT: 5003
            USER_NAME: user
            PASSWORD: 123456
        volumes:
            - /home/aria2:/conf
            - /home/data:/data
        ports:
            - 5003:80

参数

可以直接参考 Github 上,这边表格发出来就乱了。

8001 次点击
所在节点    分享创造
32 条回复
pljhonglu
2019-12-26 11:18:39 +08:00
关注一下。Aria2 RPC 协议改成 ws 照样可以被外部访问,而且还是无密码的
sanjusss
2019-12-26 11:20:42 +08:00
@pljhonglu #1 我看看啊,确实没调试过 ws
Buges
2019-12-26 11:25:45 +08:00
为啥非要整到一个镜像里,按照 docker 最佳实践,一个镜像跑 aria2 一个跑 web 双方在一个网络里通信不好吗?
可以按需配置,暴露端口,远程调用等等。
sanjusss
2019-12-26 11:33:57 +08:00
@Buges #3 你说的已经有人做过了。我搞的这个镜像是为了方便有同样需求的人。
zyxfsky
2019-12-26 11:35:40 +08:00
我也觉得应该分两个容器,compose 整合到一起就行,一个容器里起了 aria2 和 nginx 进程,然后又自己搞个健康检查,为啥不分开呢
binux
2019-12-26 11:36:21 +08:00
Aria2 RPC 不是还是被 nginx 暴露了,你这是掩耳盗铃?
sanjusss
2019-12-26 11:39:45 +08:00
@binux #6 你试试除了容器里的 ariang,别的工具是不可以调用。
Buges
2019-12-26 11:40:09 +08:00
@sanjusss #4 你说的这个需求不应该打包一个镜像,只需要用独立的镜像配置好一个 docker-compose.yaml 文件就能满足并方便同样需求的人。
binux
2019-12-26 11:56:25 +08:00
@sanjusss #7 https://binux.github.io/yaaw/demo/#path=ws://admin:admin@localhost/jsonrpc

curl -d '{"jsonrpc":"2.0","method":"aria2.getGlobalOption","id":1,"params":[]}' http://admin:admin@localhost/jsonrpc

你压根就不懂 HTTP 协议。
julyclyde
2019-12-26 11:57:50 +08:00
@binux 现在不都这样么,做什么东西不看技术,完全看兴趣
看到什么东西感兴趣,就拿过来用 docker 包一下
sanjusss
2019-12-26 12:27:48 +08:00
@binux #9
我在 2 楼已经回复了,我之前没用过 websocket 的方式调用。
现在的更新的镜像里我直接干掉了 websocket 的转发。
关于 websocket 的认证,我需要研究一下。

我设想的是一个不需要更改 AriaNg 默认设置的场景,默认为 POST,对其他方式确实没有测试。
至于手动指定用户名密码后可以远程调用,这个是 AriaNg 的限制,确实和使用密钥连接没啥区别。后面的修改中,我或许可以通过一些方法限制远程调用。
————————————
@julyclyde #10
做东西,兴趣更重要。
binux
2019-12-26 12:59:54 +08:00
@sanjusss #11 我都写了 curl 命令你都看不懂?
这根本不是用不用 websocket 的问题,HTTP 在这里不行是因为你错误给 OPTIONS 请求配置了 basic authentication,导致“纯前端” 用 HTTP POST 访问受限。
如果不是 “纯前端”,直接请求 RPC 接口,一点问题都没有。这不就是掩耳盗铃吗?

另外一种 “纯前端” 能访问的方法是 HTTP GET (JSONP),但是现在没有人写 aria2 纯前端客户端的时候用 Aria2 RPC 的 GET 方法了(存在安全性问题),所以没办法展示给你看。
binux
2019-12-26 13:09:39 +08:00
@sanjusss #11 来来来,为了让你死得更难看一点,我给你找了一个用 HTTP GET 方式的客户端
https://rawcdn.githack.com/ziahamza/webui-aria2/c11c931f47c98daa97531712ba0064ef100565c6/index.html
设置地址 http://localhost/json 用户名 admin 密码 admin 就可以访问了。
sanjusss
2019-12-26 13:10:52 +08:00
@binux #12
我使用 get 方法调用 rpc,
curl http://192.168.1.3/jsonrpc?jsonrpc=2.0&method=aria2.getGlobalStat&id=QXJpYU5nXzE1NzczMzY3NjFfMC4wNDIyMzI4NzU3MTk3NzExOQ==

<html>
<head><title>401 Authorization Required</title></head>
<body>
<center><h1>401 Authorization Required</h1></center>
<hr><center>nginx</center>
</body>
</html>

请指教在不使用用户名密码情况下调用方法。
sanjusss
2019-12-26 13:12:05 +08:00
@binux #13
呃,你的意思是说,我在有钥匙的情况下偷了我自己的东西,所以我的大门有问题?
binux
2019-12-26 13:20:03 +08:00
@sanjusss #15
「大部分镜像是需要暴漏 Aria2 RPC 」?
你也要暴露。
「 Aria2 RPC 不能被外部调用」?
我已经给你证实可以被外部访问了。
「确保了 Aria2 RPC 的安全性」?
你这和 aria2 自带的 --rpc-user 有什么区别,而且 rpc-user 已经是不推荐的认证方式了。
7654
2019-12-26 13:46:08 +08:00
{
"language": "zh_Hans",
"title": "${downspeed}, ${upspeed} - ${title}",
"titleRefreshInterval": 5000,
"browserNotification": true,
"rpcAlias": "",
"rpcHost": "xxxxx.com",
"rpcPort": 8080,
"rpcInterface": "jsonrpc",
"protocol": "wss",
"httpMethod": "POST",
"secret": "XXXXXXXXXXXX=="
}
这是我自己的 AriaNG aria2 使用 LE 证书,wss+secret
sanjusss
2019-12-26 14:44:00 +08:00
@binux #16
现在你再用最新的镜像试试吧。
我加了个最简单的认证,直接阻止了未过访问首页的调用。当然这个基于 cookie 的验证太简单了,后面我再改就行了。

https://i.loli.net/2019/12/26/2fCAcJzEXLP1yN8.jpg
binux
2019-12-26 14:54:56 +08:00
@sanjusss #18 然而 cookie 并不能 CSRF,你作为用户访问过一次主页后,cookie 和 basic auth 已经存在浏览器中了,我用恶意脚本向你 aria2 RPC GET 请求是畅通无阻的。
我建议你别继续下去了,缺少知识情况下,你包括这条路就是错。“对 AriaNg 进行密码验证” 压根就没有意义。
sanjusss
2019-12-26 15:21:46 +08:00
@binux #19
搞了半天,原来你是“对 AriaNg 进行密码验证”有意见啊!我的重点又不是加密,而是访问 AriaNg 时无需手动更改设置。
登录即可用,这才是我要搞的。
对于你的其他观点,不能苟同。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/632435

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX