隔了几天我想到虽然ipv4封了端口,那IPv6怎么样?用Vmware装了个Centos搭了环境。然后用IPv6去访问结果打不开,研究了一番找到两个原因,一是IPv6好像必须绑定域名,二是路由器默认开启了IPv6防火墙。关闭防火墙然后绑定域名,用手机4G打开了速度还很快,装了Speedtest测试能跑满带宽。
在同时拥有V6和V4的设备上V6是优先使用的而且现在手机4G网络都提供了IPv6,于是我想到了可以给现有的网站增加一个AAAA记录,让网站能支持IPv6还能加速国内用户(几乎所有手机用户和部分宽带用户)访问(水管还粗),一举两得。最重要的是无需北岸。当然你也可以直接搭建IPv6的网站,不过并不推荐。并且如果IPv6不能访问会自动切换使用IPv4进行访问,所以配置后无任何副作用。
1.选择方案
我能想到的方案有两种:
1.源站在放在自己机器,IPv4使用其他端口IPv6使用默认端口。使用国外机器通过IPv4反代提供IPv4访问。
2.源站放国外,自己机器通过IPv4反代国外机器,开启IPv6。
首先两种方案都能提供IPv4访问和IPv6访问加速,并且即使IPv6炸了也不影响网站的正常访问。(这点很重要)
如果你用的机器性能比较强的话可以考虑放在自己机器上,如果你的机器比较弱比如某些NAS还是推荐方案2。对已有的站点加速就直接方案2吧。
2.开启IPv6
确认自己运营商已经开通IPv6并且有DHCP-PD,路由器支持DHCP-PD。(如果路由不支持,那就只有用光猫开启DHCP-PD缺点是必须光猫拨号)
华硕、网件和OpenWrt都是支持的。这里我用的是梅林固件
首先进入自己的光猫后台,把网络连接里的IPv4改为IPv4&IPv6。
然后进入路由器打开IPv6,设置如图(保存后能看到IPv6ip就成功了)
再到防火墙中关闭IPv6防火墙或者自己配置规则。
3.给网站配置加速
选择一个支持解析AAAA记录的DNS,增加一个AAAA记录指向你的IPv6。
之后需要配合IPv6 DDNS来更新域名的AAAA记录。
我这边使用的是CloudFlare,建议开启V6后搭建环境自己检测一下80&443端口能不能用。
编译Nginx的时候增加IPv6模块--with-ipv6
方案2
Nginx配置
server { listen 80; #开启80端口IPv6监听 listen [::]:80; server_name yourdomain.com www.yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; #开启443端口IPv6监听 listen [::]:443 ssl http2; server_name yourdomain.com www.yourdomain.com; ssl_certificate /usr/local/ecc/0001_chain.pem; ssl_certificate_key /usr/local/ecc/yourdomain.com.key; ssl_trusted_certificate /usr/local/ecc/0001_chain.pem; server_tokens off; ssl on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_dhparam /usr/local/nginx/conf/dhparams.pem; ssl_ciphers "EECDH+AES128:RSA+AES128:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_ecdh_curve prime256v1:secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_stapling on; ssl_stapling_verify on; #反代缓存需要自行配置 location / { proxy_set_header Accept-Encoding ""; proxy_cache web_cache; proxy_ignore_headers Expires Set-Cookie; proxy_cache_valid 200 304 2m; proxy_cache_key $scheme$proxy_host$request_uri; add_header X-Proxy-Cache $upstream_cache_status; expires 10m; proxy_pass https://yourdomain.com/; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host "yourdomain.com"; } access_log /usr/local/nginx/log/yourdomain.com.log; }
重启Nginx。就可以用IPv6打开你的网站了。
然后在机器本机上定时跑一个DDNS脚本就可以在ip变动时更新,dns更新过程中IPv6会无法访问,但是会自动切到IPv4,并不影响访问。
CloudFlare DDNS: https://github.com/robertsky/Cloudflare-IPv6-DDNS
可能需要自行修改一下。
方案1
源站
server { listen 80; listen [::]:80; server_name yourdomain.com www.yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; listen 8888 ssl http2; listen [::]:443 ssl http2; #listen [::]:80; server_name yourdomain.com www.yourdomain.com; index index.html index.htm index.php default.html default.htm default.php; root /home/wwwroot/yourdomain.com; ssl_certificate /usr/local/ecc/0001_chain.pem; ssl_certificate_key /usr/local/ecc/yourdomain-ecc256.key; ssl_trusted_certificate /usr/local/ecc/0001_chain.pem; server_tokens off; ssl on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_dhparam /usr/local/nginx/conf/dhparams.pem; ssl_ciphers "EECDH+AES128:RSA+AES128:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_ecdh_curve prime256v1:secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_stapling on; ssl_stapling_verify on; include rewrite/wordpress.conf; #error_page 404 /404.html; # Deny access to PHP files in specific directory #location ~ /(wp-content|uploads|wp-includes|images)/.*\.php$ { deny all; } include enable-php-pathinfo.conf; location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$ { expires 30d; } location ~ .*\.(js|css)?$ { expires 12h; } location ~ /.well-known { allow all; } location ~ /\. { deny all; } access_log /usr/local/nginx/log/yourdomain.com.log; }
国外机器
server { listen 80; server_name www.yourdomain.com yourdomain.com; return 301 https://$server_name$request_uri; } server { listen 443 ssl http2; server_name www.yourdomain.com yourdomain.com; ssl_certificate /usr/local/ecc/0001_chain.pem; ssl_certificate_key /usr/local/ecc/yourdomain-ecc256.key; ssl_trusted_certificate /usr/local/ecc/0001_chain.pem; server_tokens off; ssl on; ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_dhparam /usr/local/nginx/conf/dhparams.pem; ssl_ciphers "EECDH+AES128:RSA+AES128:EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5"; ssl_ecdh_curve prime256v1:secp384r1; ssl_session_cache shared:SSL:10m; ssl_session_timeout 1d; ssl_stapling on; ssl_stapling_verify on; location / { proxy_set_header Accept-Encoding ""; proxy_cache web_cache; proxy_ignore_headers Expires Set-Cookie; proxy_cache_valid 200 304 2m; proxy_cache_key $scheme$proxy_host$request_uri; add_header X-Proxy-Cache $upstream_cache_status; expires 10m; proxy_pass https://www.yourdomain.com:8888/; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host "www.yourdomain.com"; } access_log /usr/local/nginx/log/yourdomain.com.log; }
反代机配置一下hosts。
方案1除了DDNS还需要一个同步IPv4到反代机hosts的脚本。
这样就相当于给自己搭了一个电信牌无限流量CDN。