MinIO 外网访问与 mc 使用说明

1. 目的

本文面向需要在外网访问当前 MinIO 的同事,说明:

  1. 外网应该连接哪个地址
  2. 哪个地址不能用于 mc
  3. mc 应该如何配置
  4. 配置后能做哪些管理动作
  5. 当前风险和注意事项

2. 先说结论

当前外网可用的 MinIO API 地址是:

http://tx2.898311.xyz:9010/

不能用于 mc 的地址是:

https://minio.898311.xyz/

原因:

  1. tx2.898311.xyz:9010frpc 映射出去的真实 MinIO API
  2. minio.898311.xyz 当前是自定义上传页面,不是 S3 API 根入口

3. 外网地址是怎么来的

当前本机 MinIO 实际监听:

127.0.0.1:9000

frpc 配置中存在这条代理:

[[proxies]]
name = "bj-minio"
type = "tcp"
localIP = "127.0.0.1"
localPort = 9000
remotePort = 9010

对应含义是:

  1. 本机 127.0.0.1:9000
  2. 通过 tx2.898311.xyz:9010 对外暴露

因此外网访问时,应该连:

http://tx2.898311.xyz:9010

4. 为什么不能用 minio.898311.xyz

https://minio.898311.xyz/ 当前返回的是:

  1. 200 OK
  2. Content-Type: text/html
  3. 页面标题 MinIO 图片上传器

这说明它是一个上传页,而不是 MinIO API。

直接拿它给 mc 用,会报类似错误:

mc: <ERROR> Unable to list folder. XML syntax error on line 8: attribute name without = in element

所以不要这样配:

mc alias set remote https://minio.898311.xyz 用户名 密码

5. 外网如何配置 mc

5.1 标准配置

mc alias set remote http://tx2.898311.xyz:9010 <MINIO_ROOT_USER> <MINIO_ROOT_PASSWORD>

含义:

  1. remote 是你给这个连接起的本地别名
  2. http://tx2.898311.xyz:9010 是真实外网 API 地址
  3. 后面的用户名密码是 MinIO 账号凭证

5.2 普通上传账号示例

当前已创建一个最小权限普通账号:

  • 用户名:uploadrw0511a
  • 授权桶:generalandroidblog-assetsblogfileuploadtmp-image

该账号具备:

  1. 列出授权桶
  2. 上传文件
  3. 下载文件
  4. 删除文件
  5. 分片上传需要的对象权限

该账号不具备:

  1. 访问 blogimg
  2. 访问 image
  3. 管理用户和策略
  4. 管理未授权桶

凭证:

  • 密码:UpRw_20260511_Tm9Qx7L2

配置命令:

mc alias set uploadrw http://tx2.898311.xyz:9010 uploadrw0511a UpRw_20260511_Tm9Qx7L2

5.3 配置后验证

先执行:

mc ls remote

如果能列出桶,说明配置成功。

进一步可以执行:

mc admin info remote
mc ls remote/blogimg
mc anonymous get remote/blogimg

如果使用普通上传账号,则建议执行:

mc ls uploadrw
mc ls uploadrw/blog-assets
mc ls uploadrw/tmp-image
mc cp ./example.txt uploadrw/tmp-image/
mc cat uploadrw/tmp-image/example.txt
mc rm uploadrw/tmp-image/example.txt

6. 配置后能做什么

按当前验证结果,外网 mc 已经可以成功:

mc ls remote
mc admin info remote

这说明:

  1. 外网地址确实连到了 MinIO 本体
  2. 当前账号具备管理权限
  3. 不是只能访问上传页

因此理论上可以做完整管理动作:

  1. 查:列桶、看对象、看策略、看版本化、看生命周期
  2. 增:新建桶、上传对象、加标签
  3. 改:改匿名策略、改版本化、改生命周期
  4. 删:删对象、删空桶

常见命令示例:

mc ls remote
mc mb remote/new-bucket
mc anonymous set download remote/blogimg
mc version enable remote/blogimg
mc rb remote/old-bucket

注意:

  1. 本次实际只验证了“读”和“管理信息查询”
  2. 没有直接执行生产环境写删操作
  3. 但当前账号是 root,所以按权限判断,增删改查都具备能力

6.1 普通上传账号能做什么

普通上传账号 uploadrw0511a 当前只针对授权桶开放对象级操作。

已实际验证成功的动作:

  1. mc ls uploadrw
  2. 上传对象到 tmp-image
  3. 列出上传对象
  4. 读取对象内容
  5. 删除对象
  6. mc ls uploadrw/generalandroid
  7. generalandroid/external-check/minio-uploadrw0511a-ga-test.txt 上传新的小测试文件
  8. mc cat uploadrw/generalandroid/external-check/minio-uploadrw0511a-ga-test.txt
  9. mc rm uploadrw/generalandroid/external-check/minio-uploadrw0511a-ga-test.txt

其中 generalandroid 相关验证结果为:

  • 可以正常列出一级目录:books/ media/ releases/ tools/ traces/
  • 可以成功写入测试文件
  • 可以成功读回内容:ga-check-2026-05-11
  • 可以成功删除测试文件
  • 删除时返回 delete marker,说明桶已开启版本化,行为正常

已实际验证失败的动作:

  1. mc ls uploadrw/blogimg

返回结果为:

mc: <ERROR> Unable to list folder. Access Denied.

说明授权边界生效正常。

当前可以正式下结论:

  • uploadrw0511a 已满足 generalandroid 桶的列、读、写、删需求
  • 可以作为 GeneralAndroid 远程 clone 恢复主账号使用

6.2 关于多线程上传与断点续传

这里要明确一点:

  1. 多线程上传
  2. 断点续传

主要由客户端工具或 SDK 决定,不是账号本身“开一个权限开关”就自动拥有。

当前这个账号已经包含了分片上传相关权限:

  1. s3:ListBucketMultipartUploads
  2. s3:AbortMultipartUpload
  3. s3:ListMultipartUploadParts
  4. s3:PutObject

这意味着:

  1. 如果你用支持 multipart 的 mc / SDK
  2. 就可以基于这个账号做多线程上传和断点续传类能力

但是否真的“多线程”,取决于具体客户端实现。


7. 风险与注意事项

当前外网使用方式有几个明显风险:

  1. 使用的是 root 凭证
  2. 走的是外网暴露口
  3. 当前地址是 http,不是 https

这意味着:

  1. 一旦凭证泄漏,外部可直接操作全部桶
  2. 不适合长期多人共享 root 账号
  3. 不适合在不可信网络环境长期使用

更建议的后续改造:

  1. 单独创建运维子账号
  2. 按桶或按操作范围授权
  3. 尽量补上 https
  4. 只给确有需要的同事分配外网管理权限

普通上传账号相对更合适:

  1. 不直接暴露 root
  2. 只开放授权桶
  3. 更适合同事日常上传和对象维护

8. 建议的使用边界

如果只是上传内容:

  1. 优先使用现有上传页

如果需要做桶管理:

  1. 使用 mc
  2. 先做只读巡检
  3. 先备份,再改配置
  4. 改完后做校验
  5. 最后更新仓库文档

推荐配套阅读: