目的:
在提供ipv4和ipv6双栈的网络,实现ipv4/ipv6均可以安卓gfwlist的方式科学上网。中国流量不走shadowsocks-libev.
- 首先VPS支持IPv6,如果不支持,到https://www.tunnelbroker.net/ 上申请一个ipv6地址就可以,详细方法,网上有。
- 在vps上安装shadowsocks-libev,这里不详细讲,网上有很详细教程。为了配置支持双栈,在“server”这个参数配置如下。我这里的插件是v2ray-plugin. 证书采用certbot的证书。修改VPS的/etc/shadowsocks-libev/config.json修改如下:
{
"server":["2001:xxx:xx:xxx::2","xx.xx.xx.xx"],
"local_address": "xx.xx.xx.xx",
"local_port":1081,
"server_port":443,
"password":"xxxxxxx",
"timeout":300,
"method":"rc4-md5",
"reuse":true,
"ipv6_first":true,
"nameserver":"8.8.8.8",
"mode":"tcp_and_udp",
"plugin":"v2ray-plugin",
"plugin_opts":"server;tls;host=xxxx.com;cert=/etc/letsencrypt/live/xxxx.com/fullchain.pem;key=/etc/letsencrypt/live/xxxx.com/privkey.pem;loglevel=none"
}
然后重启systemctl restart shadowsocks-libev,检查systemctl status shadowsocks-libev,看是否正常。
3. 家里openwrt路由器中,IPv6的设置。 在'网络'--'接口‘--'LAN'---'DHCP服务器“--”IPv6设置“中,路由通告服务 和 DHCPv6 服务 设置为”服务器模式“
,NDP 代理“禁用”。 在'网络'--'接口‘--'LAN'--’全局网络选项‘,将”IPv6 ULA 前缀“清空。 其他保持默认。这种情况下,Ipv6应该就是正常使用了。通过ipv6-test.com 进行测试是否正常。安装好ip6tables, kmod-ipt-nat6, kmod-ip6tables-extra.
4. 将openwrt路由器中,/etc/init.d/shadowsocks 文件增加一行"local_address":
"::", 详细如下:
gen_config_file() {
local config_file=/var/etc/$NAME.$1.json
cat <<-EOF >$config_file
{
"server": "$(uci_get_by_name $1 server)",
"server_port": $(uci_get_by_name $1 server_port),
$(get_crypto_config $1)
"method": "$(uci_get_by_name $1 encrypt_method)",
"local_address": "0.0.0.0",
"local_address": "::",$(get_plugin_config $1)
"timeout": $(uci_get_by_name $1 timeout 60),
"reuse_port": true
}
EOF
重启shadowsocks-libev。这一步是关键,让openwrt的shadowsocks-libev客户端可以监听ipv6端口。通过cat /var/etc/shadowsocks.cfg094a8f.json命令,检查确实将"local_address": "::",加到配置里面了。
5. 将/etc/rc.local设置属性可执行,这样openwrt路由器启动时才会执行里面的命令。增加一行 ipset create
gfwlist6 hash:net family inet6,这样每次重启,就会生成gfwlist6。然后在/etc/dnsmasq.d/ 目录下创建规格文件gfwlist.conf,这个网上有详细教程,规格如下:
server=/ipv6.google.com/127.0.0.1#5053
ipset=/ipv6.google.com/gfwlist,gfwlist6
端口5300,是根据你的openwrt的科学上网端口转发的端口号。我这里安装的是DoH来实现DNS防干扰. 一般luci-app-shadowsocks自带的端口转发是5300。然后修改/etc/dnsmasq.conf文件,如下:
no-resolv
no-poll
conf-dir=/etc/dnsmasq.d
cache-size=1000
server=114.114.114.114
经过这一步,需要翻墙的IP地址都存在gfwlist和gfwlist6中。当然你的dnamasq是dnamasq-full版本( openwrt原来自带的dnsmasq不支持)。
删除/etc/resolv.conf,(这个原始文件是一个链接文件,链接到/var/tmp/resolv.conf),重新建一个/etc/resolv.conf,
编辑为:
nameserver 127.0.0.1
因为/etc/resolv.conf重启会被覆盖。输入chattr
+i /etc/resolv.conf, 就禁止修改了。(命令chattr可能需要安装)
6. 设置firewall规则,在firewall的自定义规则中,加入下面内容:
7.
重启路由器,发现失效,重启DoH和防火墙,又好了。所以在/etc/rc.local中加入3行,如下
sleep 30
/etc/init.d/firewall restart
sleep 30
/etc/init.d/https-dns-proxy restart
再重启,一切正常,原因没有找到。不知是什么冲突造成的。