2018-10-21

为我的博客增加ipv6

作为一个什么都要支持 IPv6 访问的人, 但是国内的云厂商几乎都不支持IPv6, 就算支持也只是用个虚拟网关把 IPv6的流量转换成IPv4, 再交给服务器, 十分诡异; 腾讯云据说也是这种解决方案, 其他的云厂商则没有去了解.好像国内没有云厂商提供服务器直接支持IPv6的

最先开始的想法是想使用 he.net 的 IPv6 in IPv4 (6in4) 隧道, 这个隧道是基于 GRE 隧道, 但是云厂商们也不支持. 这里也要稍稍吐槽一下 广东电信, 广东电信什么都好, 就是 给公网IPv4, 不给公网IPv6了; 给公网IPv6 不给 公网IPv4, 所以用了he.net的隧道.

我的想法是 使用 nginx 做为代理, 将ipv6流量反向代理到国内的服务器上. 所有的IPv4流量都只流向国内的服务器

环境

vultr 洛杉矶
Ubuntu 18.04
nginx 1.14.0

部署

nginx - Los Angeles

跟普通的反代没有太大区别, 只贴一部分代码

proxy_http_version  1.1;
proxy_set_header    Connetion        "";
proxy_set_header    Host             $host;
proxy_set_header    X-Real-IP        $remote_addr;
proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for;

location / {
    proxy_pass https://boxjan.com;
}

proxy_set_header X-Real-IP $remote_addr; 获取真实IP并包含在头中, 以方便原站获取用户真实的IPv6,

nginx - Shanghai

跟普通的站点没什么区别, 由于我的博客是放在docker中运行, nginx 可以看成是又一个反代. 但是为了博客能获取正确的IP, 我做了一点改动

set $real_ip "[::]";
if ($remote_addr = "x.x.x.x") {
    set $real_ip $http_x_real_ip;
}
if ($remote_addr != "x.x.x.x") {
    set $real_ip $remote_addr;
}
proxy_set_header    X-Real-IP        $real_ip;

由于nginx 不允许在if语句中使用 proxy_set_header 所以只能先设置一个变量, 接下来判断来源是不是我的IPv6反代服务器; 如果是则获取header中的realip作为真正的ip,若不是则使用访问来源; 再用 proxy_set_header X-Real-IP $real_ip; 设置IP

最后两边的nginx重启即可,记得做好DNS解析

测试

我选择在另一台具有IPv6网络上的主机 使用curl -I -4curl -I -6 测试, 结果如图

-- EOF --

comments

如果无法加载 请将 disqus.com | disquscdn.com 加入代理