Contents
前言
因为IPv6和IPv4协议本质的不同,导致在未来IPv6公网IP为主流的趋势中,一些存在于IPv4上的由来已久的的传统技术失去了作用:例如端口映射、NAT等。在我正构思的家庭数据中心IPv6公网地址出口解决方案中,其中有些功能(比如端口映射)是需要类似的替代技术的,毕竟虽然IPv6地址无限,我也不可能让每个家里的设备都直接暴露在公网上。从安全角度来说,暴露一个点,然后经过这个点再访问其他点才是比较正常的逻辑,也更利于安全策略的制定。
要实现上述功能,就必须要传统IPv4上端口映射技术的升级替代技术:IPv6—>IPv4端口转发功能。可惜的是,现在除了openwrt可以通过安装lucky或者socat来实现,其他的路由器没看到有哪家支持的(其实openwrt严格上来说也不是支持,只是可以安装支持的软件),加之现在用openwrt做主路由的人也不多("旁路由"的倒是不少),所以,在路由器没有正式支持该功能之前,我的IPv6出口解决方案的主角可能要换人了。。
本篇文章就以方案主角之一,lucky的docker版为例,介绍lucky的主要功能。
搭建lucky
部署lucky
先说句题外话,正如我在上一篇文章(参见:OpenWrt软路由系列 docker版openwrt最佳使用方式探讨)所说:”我觉得docker方式部署最适合的是对外提供内容的应用(比如nginx,mysql),而不是需要频繁从容器内部访问外部网络这类(比如lucky、cloudtunnel、openwrt)“,特别是lucky这种还需要涉及IPv6—>IPv4转换的,对操作系统底层依赖很大,lucky的作者也有类似的说法:
所以如果真的要把lucky作为主力工具使用并且要跑大流量,更推荐其他非docker的方式部署。当然,如果是轻度使用,docker方式也可以,只是尽量采用host方式部署。
使用docker run格式搭建lucky的代码很简单,如下:
docker run -d --name lucky --restart=always --net=host gdy666/lucky
初始化lucky
使用链接http://宿主机ip:16601
登录进入lucky的控制台,默认用户名密码均为"666":
配置lucky功能
动态域名
lucky内置支持的域名基本覆盖了常见的域名供应商(爱快只支持6个~~),且还支持自定义:
且支持多种获取IP的方式:
其中最后一种通过odhcpd获取的方式和openwrt是好搭配(openwrt的IPv6功能就是通过odhcpd来实现的)。
注:动态域名在IPv6时获取公网IP的方式和IPv4时候不同,IPv4其实是通过访问一个外部页面来获取自身公网地址的(运行在路由器上的动态域名除外,直接对应wan口IP即可),而IPv6就比较灵活了,既可以通过外部页面来获取(如上图中第一种方式),也可以直接获取自身的地址(如上图中的第2,3种获取方式)。其实我更推荐第2种方式,既通过自身网卡来获取,只不过这里有点要注意的是,网卡上既有私有IPv6地址,也有公网IPv6地址,为了保证识别的准确,可以添加IP选择匹配规则:
因为我是电信宽带,电信的IPv6是240e开头的,所以我加上了"^240e",这样就不会识别错误了,因为我遇到过不加ip选择匹配规则,有时动态域名会识别成fe开头的私网地址的情况,搞得我排了半天错~~~。
还有一种特殊情况,就是获取内网其他设备的IPv6地址,这种其实是比较麻烦的,一般情形如果刚好lucky和openwrt部署在一起且lucky不是docker部署方式且其他设备是使用的有状态的方式,可以用上图第4种方式获取;类似的,对于爱快来说,如果对方是有状态,可以查询自身的dhcp服务器上对应的DUID:
而如果是无状态的,爱快比lucky多提供一个根据对方mac地址来获取IPv6地址的方式:
不过这种方式不是很稳定,有时候会获取失败。
另:默认是简易模式,定制模式下会多一些选项,大家按自己的需求来配置即可,一般不用动:
web服务
lucky的web服务支持多种功能:
进入web服务规则界面,这里是定义监听的协议和端口,此处我们直接勾选tcp6,端口填写你要监听的端口:
上面的服务规则只是用来定义监听协议和端口,具体的功能都由"添加web服务子规则"来实现。
反向代理
lucky的web服务支持反向代理功能:
注:前端域名/地址和后端地址,直接填写IP或者域名,lucky会自动添加http://,所以除非是https,否则http直接填写域名和ip:端口即可。
以上是简易模式下的配置项,不过一般人也够了。如果有其他更细致的要求,可以打开定制模式开关:
说实话,功能还是不错的。
所以如果没有部署nginx,又需要简单的使用反向代理功能,又恰巧部署了lucky,那么用lucky实现反向代理是个不错的选择。
另:web服务下的其他功能都可以用定制模式提供更多选项,我就不重复介绍了。
重定向或者URL跳转
以重定向为例:
文件服务
可以把lucky本地的目录以网页方式显示:
这个我没有详细研究,大家感兴趣可以自己试试。
文本输出
可以非常简单得发布一段文字,支持3个变量:
端口转发
这个才是我最关注的功能,也是我把lucky纳入家庭数据中心IPv6出口解决方案的核心点,lucky的操作非常简洁:
所以在lucky的帮助下,在IPv6公网IP的出口环境中仍旧可以像以前IPv4公网地址的时候一样,通过发布单一IPv6公网地址即可访问整个内网设备。
当然,内网每个支持的设备也可以都有IPv6公网地址,不过这和"通过发布单一IPv6公网地址即可访问整个内网设备"这句话并不冲突:前者针对的是从外到内的访问的便利性和安全性,而后者主要是内部对外的访问的便利性。
STUN内网穿透
这个主要是对没有公网地址,需要使用STUN进行内网穿透的朋友而设置的,具体的配置请参看我另一篇文章:docker系列 使用docker基于coturn搭建自己的stun/turn服务器。
不过还是那句话,试试tailscale,你才知道什么内网穿透都是浮云。
另:我觉得内网穿透(其实应该叫nat穿越,内网穿透这个叫法很有天朝特色,就像链路负载均衡、网页防篡改一样)这个概念本来就只是另外一个功能集:虚拟组网的一个效果体现,大家其实应该选择更好的虚拟组网方案,而不是专门针对内网穿透这个效果去选择实现的方式。
安全管理
如果要使用lucky来实现反向代理功能,那就需要考虑SSL证书的问题了。http虽然可用,但是一来不安全,二来运营商会把你的内容看得一清二楚,想搞你轻而易举(详细原因可以参看我另一篇文章:家庭数据中心系列 有公网IP的家庭宽带建站注意事项),所以就算你的域名真不想备案,也至少使用https来防一手。
lucky的SSL证书支持3种方式获取:
1、文件
如果有现成的证书,可以直接使用文件的方式上传到lucky。证书映射可以指定lucky本地的一个目录,上传的证书会以{备注名}.key {备注名}.pem 在该目录下保存。
2、路径
这种方式和文件其实是一样的,只不过不是通过上传,而是直接把证书上传到lucky本地的目录,然后直接指定路径。
3、ACME
如果会使用宝塔面板申请let’s Encrypt的证书,也肯定会用这个。
其他功能
lucky还有网络存储和网络唤醒功能:
有兴趣的朋友可以自行研究。
总结
其实对我而言,最重要的就是lucky的公网ipv6—>内网ipv4的端口转发功能,算是补上了我家庭数据中心IPv6出口解决方案的最后一块拼图(其实我还是更希望爱快开发这个功能~现在是没办法),而其他功能现在都有另外更强或者更便利的实现方式,比如反向代理使用nginx,动态域名用爱快,nat穿越使用tailscale(我可是ipv4和ipv6双栈公网环境,但是tailscale更方便和安全)。不过,对于一般的用户而言,如果你本身没有现成的反向代理,动态域名、nat穿越的解决方案,那么,只要部署一个lucky,就可以通通解决了(stun穿越需要有现成的stun服务器),所以我文章的题目才叫"简版公网IPv6访问入向网关",至于"豪华版"就是完整的解决方案了,这个我需要时间好好构思一下。。。
另外,再强调一下,轻量级使用可以用lucky的docker模式,而如果是重度使用,还是推荐使用非docker的方式来进行部署。