V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
爱意满满的作品展示区。
sanjusss
V2EX  ›  分享创造

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

  •  1
     
  •   sanjusss ·
    sanjusss · 2019-12-26 10:13:18 +08:00 · 8200 次点击
    这是一个创建于 1827 天前的主题,其中的信息可能已经有所发展或是发生改变。

    简介

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

    • 对 AriaNg 进行密码验证。
    • Aria2 RPC 不能被外部调用,和 AriaNg 使用一个端口。(除非主动暴露)
    • 自动更新 BT Tracker,可关闭。
    • 提供 linux/amd64、linux/arm/v6、linux/arm/v7、linux/arm64、linux/386、linux/ppc64le、linux/s390x 等平台 /CPU 下的 Docker 镜像。
    • 支持 AriaNg 自动连接容器内的 Aria2,根据实际场景可能需要指定EXTERNAL_PORT

    仓库地址

    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 上,这边表格发出来就乱了。

    第 1 条附言  ·  2019-12-26 19:00:09 +08:00
    增加了:每次启动 /重启容器时都会随机化 rpc 的路径和密钥。
    32 条回复    2020-01-02 12:06:52 +08:00
    pljhonglu
        1
    pljhonglu  
       2019-12-26 11:18:39 +08:00   ❤️ 1
    关注一下。Aria2 RPC 协议改成 ws 照样可以被外部访问,而且还是无密码的
    sanjusss
        2
    sanjusss  
    OP
       2019-12-26 11:20:42 +08:00
    @pljhonglu #1 我看看啊,确实没调试过 ws
    Buges
        3
    Buges  
       2019-12-26 11:25:45 +08:00 via Android   ❤️ 2
    为啥非要整到一个镜像里,按照 docker 最佳实践,一个镜像跑 aria2 一个跑 web 双方在一个网络里通信不好吗?
    可以按需配置,暴露端口,远程调用等等。
    sanjusss
        4
    sanjusss  
    OP
       2019-12-26 11:33:57 +08:00
    @Buges #3 你说的已经有人做过了。我搞的这个镜像是为了方便有同样需求的人。
    zyxfsky
        5
    zyxfsky  
       2019-12-26 11:35:40 +08:00
    我也觉得应该分两个容器,compose 整合到一起就行,一个容器里起了 aria2 和 nginx 进程,然后又自己搞个健康检查,为啥不分开呢
    binux
        6
    binux  
       2019-12-26 11:36:21 +08:00
    Aria2 RPC 不是还是被 nginx 暴露了,你这是掩耳盗铃?
    sanjusss
        7
    sanjusss  
    OP
       2019-12-26 11:39:45 +08:00
    @binux #6 你试试除了容器里的 ariang,别的工具是不可以调用。
    Buges
        8
    Buges  
       2019-12-26 11:40:09 +08:00
    @sanjusss #4 你说的这个需求不应该打包一个镜像,只需要用独立的镜像配置好一个 docker-compose.yaml 文件就能满足并方便同样需求的人。
    binux
        9
    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
        10
    julyclyde  
       2019-12-26 11:57:50 +08:00
    @binux 现在不都这样么,做什么东西不看技术,完全看兴趣
    看到什么东西感兴趣,就拿过来用 docker 包一下
    sanjusss
        11
    sanjusss  
    OP
       2019-12-26 12:27:48 +08:00
    @binux #9
    我在 2 楼已经回复了,我之前没用过 websocket 的方式调用。
    现在的更新的镜像里我直接干掉了 websocket 的转发。
    关于 websocket 的认证,我需要研究一下。

    我设想的是一个不需要更改 AriaNg 默认设置的场景,默认为 POST,对其他方式确实没有测试。
    至于手动指定用户名密码后可以远程调用,这个是 AriaNg 的限制,确实和使用密钥连接没啥区别。后面的修改中,我或许可以通过一些方法限制远程调用。
    ————————————
    @julyclyde #10
    做东西,兴趣更重要。
    binux
        12
    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
        13
    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
        14
    sanjusss  
    OP
       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
        15
    sanjusss  
    OP
       2019-12-26 13:12:05 +08:00
    @binux #13
    呃,你的意思是说,我在有钥匙的情况下偷了我自己的东西,所以我的大门有问题?
    binux
        16
    binux  
       2019-12-26 13:20:03 +08:00
    @sanjusss #15
    「大部分镜像是需要暴漏 Aria2 RPC 」?
    你也要暴露。
    「 Aria2 RPC 不能被外部调用」?
    我已经给你证实可以被外部访问了。
    「确保了 Aria2 RPC 的安全性」?
    你这和 aria2 自带的 --rpc-user 有什么区别,而且 rpc-user 已经是不推荐的认证方式了。
    7654
        17
    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
        18
    sanjusss  
    OP
       2019-12-26 14:44:00 +08:00
    @binux #16
    现在你再用最新的镜像试试吧。
    我加了个最简单的认证,直接阻止了未过访问首页的调用。当然这个基于 cookie 的验证太简单了,后面我再改就行了。

    https://i.loli.net/2019/12/26/2fCAcJzEXLP1yN8.jpg
    binux
        19
    binux  
       2019-12-26 14:54:56 +08:00
    @sanjusss #18 然而 cookie 并不能 CSRF,你作为用户访问过一次主页后,cookie 和 basic auth 已经存在浏览器中了,我用恶意脚本向你 aria2 RPC GET 请求是畅通无阻的。
    我建议你别继续下去了,缺少知识情况下,你包括这条路就是错。“对 AriaNg 进行密码验证” 压根就没有意义。
    sanjusss
        20
    sanjusss  
    OP
       2019-12-26 15:21:46 +08:00
    @binux #19
    搞了半天,原来你是“对 AriaNg 进行密码验证”有意见啊!我的重点又不是加密,而是访问 AriaNg 时无需手动更改设置。
    登录即可用,这才是我要搞的。
    对于你的其他观点,不能苟同。
    binux
        21
    binux  
       2019-12-26 15:43:03 +08:00 via Android
    @sanjusss #20 问题是你是在以降低 aria2 安全性的方式做的。
    保存一个带 RPC 地址的书签就这么难吗?实在不行你把默认地址硬编码到 AriaNg 也比你画蛇添足反代 aria2 好啊。
    pljhonglu
        22
    pljhonglu  
       2019-12-26 17:16:04 +08:00
    @sanjusss #20 @binux 说的有道理,这么反代 aria2 没有任何密码保护确实是降低了 aria2 的安全性,感觉 aria2 打开 token 功能,把 token 硬编码到 ariang 里面比较好
    sanjusss
        23
    sanjusss  
    OP
       2019-12-26 17:30:41 +08:00
    @pljhonglu 嗯,我现在在这么搞的。还没推送。
    pljhonglu
        24
    pljhonglu  
       2019-12-26 18:12:37 +08:00
    @sanjusss #23 坐等推送~
    sanjusss
        25
    sanjusss  
    OP
       2019-12-26 18:59:22 +08:00
    @pljhonglu #24 已经推送,每次启动 /重启容器时,都会随机化 rpc 的路径和密钥,可能需要清空浏览器缓存才能正常显示。
    Maskeney
        26
    Maskeney  
       2019-12-26 19:10:25 +08:00
    恭喜你重复造了一个没什么卵用的轮子
    deorth
        27
    deorth  
       2019-12-26 19:35:56 +08:00
    好奇你怎么实现自动填写 rpc-sercet 的。
    justin2018
        28
    justin2018  
       2019-12-27 09:40:21 +08:00
    可以完美配合 115 下载助手么 😁
    emtry
        29
    emtry  
       2020-01-01 20:53:15 +08:00
    issue:内网穿透后 RPC 连不上
    emtry
        30
    emtry  
       2020-01-01 20:57:22 +08:00
    需求:aria-ng rpc 端口可自定义
    sanjusss
        31
    sanjusss  
    OP
       2020-01-01 21:31:32 +08:00 via iPhone
    @emtry 设置 EXTERNAL_PORT 为你外网访问最终网页的端口。这样设置后会导致内网访问时只能用外网访问的方法(除非你内外网用同样的 http 端口)
    emtry
        32
    emtry  
       2020-01-02 12:06:52 +08:00
    @sanjusss 重启容器 seesion 没了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2486 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 15:55 · PVG 23:55 · LAX 07:55 · JFK 10:55
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.