作为一个什么都要支持 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 -4
和 curl -I -6
测试, 结果如图
-- EOF --
comments