阿里云的数据库服务到期不准备继续用了,准备把数据库迁移到物理机上,考虑灵活性在docker上部署数据库服务,但是发现一个问题,就是在不暴露端口到外网的情况下,官方的mysql镜像似乎没办法监听本地请求,但是container的内部ip从wireguard又没办法访问,遂只能将mysql服务部署成内网服务,所以需要一个方法来解决来自host的访问转发到container的路由问题。
早年曾经测试过treafik来做内网路由,但是配置略复杂,最后还是用的apache的反向代理。最后还是下决心,重新来研究一下treafik的部署。
在研究的路程中遇到了几个大坑,其实回过头来看,treafik的架构还是非常简单的,由entrypoints、routers、services组成,entrypoints定义入口,routers定义映射规则,services定义后端服务。
而通过providers提供自动配置刷新,可以直接通过监听自动热更新服务配置,这点是比apache强很多的部分。
这次使用到的providers是docker和file,docker用于自动配置services,file用于配置routers。
这样有任何变动就只需要修改file所在的配置文件就可以修改反代规则了,加上watch后修改可以实时生效。
经过实验,在使用http的Path规则后,不需要域名,直接可以通过ip+路径来进入不同的服务
1 2 3 4 5 6 7 |
http: routers: Router-whoami: entryPoints: - "web" rule: "Path(`/test`)" service: "whoami-treafik@docker" |
这样配置后,也可以直接通过wireguard的内网ip来访问内网服务了,这样显著的减小了服务对外暴露的风险。
traefik的配置文件分成Dynamic和Static,entryPoints和providers只能在Static里设置,如果修改需要重启container。而Dynamic配置文件里配置routers和services,这样可以实现实时对routers和services配置修改的动态调整。
有一个大坑,如果traefik运行在container里,那么network_mode要设置为host,不然traefik无法在系统上创建entryPoints的端口映射。
另外如果用了ufw,还需要添加一个规则来允许wireguard访问内网端口,否则也是无法连接上内网服务,假设wireguard的网卡是wg0
1 |
ufw allow in on wg0 |
另外如果不清楚哪些端口被docker开放到公网,可以用一下命令来查看docker直接透传到外网的端口,检查一下是否内网服务被错误的配置到可公网访问
1 |
iptables --list DOCKER |
There are no comments yet