2015年11月6日星期五

通过openvpn使用搬瓦工ipv6

买了个搬瓦工的便宜vps,发现可以分配3个ipv6地址,于是折腾ipv6 in ipv4 tunnel,终于折腾成功了。记录下过程。

搬瓦工的ipv6是/64的地址段,但是只让你用3个地址,这3个地址我们可以自定义。
假如分配到的ipv6前缀是 2001:db8:1:123, 我们自定义成如下地址
2001:db8:1:123::1
2001:db8:1:123::a0:1
2001:db8:1:123::a0:1000
第一个地址用在venet0上,第二个用在tun0上,第三个给客户端用。 之所用a0:1,a0:1000 是因为给openvpn 一个 /64 的地址,openvpn自动给自己用:1,给第一个客户端用:1000,这样就不用手动配ip地址了。
分配完成后重户vps,进入系统会发现三个ipv6地址全在venet0,我们删除两个, 用以下命令
ip addr del 2001:db8:1:123::a0:1 dev venet0
ip addr del 2001:db8:1:123::a0:1000 dev venet0
最好是把以上命令放入/etc/rc.local中,系统启动时自动执行。
修改openvpn配置文件,增加ipv6配置
server-ipv6 2001:db8:1:123::a0:0/64
push "route-ipv6 ::/0"
打开ipv6转发设置
net.ipv6.conf.all.forwarding=1
net.ipv6.conf.default.forwarding=1
把以上写入/etc/sysctl.conf,用sysctl -p生效,或者用如下命令临时生效,重启后失效
sysctl -w net.ipv6.conf.all.forwarding=1
sysctl -w net.ipv6.conf.default.forwarding=1
防火墙允许转发
ip6tables -P FORWARD ACCEPT
或者根据条件允许转发
ip6tables -P FORWARD DROP
ip6tables -A FORWARD -p tcp --dport 80 -j ACCEPT
ip6tabels -A FORWARD -p tcp --dport 443 -j ACCEPT
重启openvpn服务端,客户端重新连接, 在客户端机器上ping 地址2001:db8:1:123::1,2001:db8:1:123::a0:1, ipv6.google.com
如果都能通,配置就完成了。

配置文件

以下是我的server端配置文件
server 10.0.8.0 255.255.255.0
topology subnet
server-ipv6 2001:db8:1:123::a0:0/64
port 11948
proto tcp
dev tun
push "redirect-gateway def1 local"
push "topology subnet"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 4.2.2.2"
push "ping 5"
push "ping-restart 30"
push "route-ipv6 ::/0"
push "route 23.xxx.xxx.xxx 255.255.255.255 net_gateway"
keepalive  5 30
duplicate-cn
persist-key
persist-tun
group nogroup
user nobody
tls-auth ta.key
ca ca.crt
cert server.crt
key server.key
dh dh.key
以下是客户端配置文件
client 
proto tcp
dev tun
verb 3
remote 127.0.0.1 11948 tcp
http-proxy 127.0.0.1 8080
http-proxy-retry 10
http-proxy-timeout 10   
keepalive 10 60
route 192.168.1.0 255.255.255.0 net_gateway
script-security 2
#route-up d:/add_route.bat
#route-pre-down d:/del_route.bat
ca ca.crt
cert client.crt
key client.key
tls-auth ta.key

参考链接

2015年3月28日星期六

让你的web server支持http/2.0

http/2.0 是下一代的http协议(查看wikipedia),它 比http/1.1具有更高的效率,目前还没有正式发布,还处在修改阶段,新最的标准是draft-17h2-17.
目前chromefirefox都已支持http/2.0了,我们可以在自己的网站上部署http/2.0来尝新。
我们可以使用这个C语言的http/2.0的库nghttp2, 安装方法:
git clone https://github.com/tatsuhiro-t/nghttp2
cd nghttp2
autoreconf -ivf
./configure
make
sudo make install
安装成功后,有如下组件:
libnghttp2-xx.so 解析http/2.0的协议的库文件
nghttp 一个http/2.0的客户端程序,类似于wget
nghttpx 一个http/2.0的代理程序, 类似于squid
nghttpd 一个http/2.0的web server程序, 类似于nginx
如果你的web server只有静态文件, 使用nghttpd就够了
nghttpd -d /path/to/docroot 443 server.key server.crt
如果不用ssl
nghttpd -d /path/to/docroot 80 --no-tls
如果要支持php等动态内容,你可以使用nghttpx作为前端,后端使用nginx或者apache, 像这样
nghttpx -f '0.0.0.0,443' -b 127.0.0.1,81 --cert server.crt --key server.key
nghttpx监听443端口,接收http/2.0请求,然后转发到127.0.0.1:81端口,让apache运行在此81端口处理实际的请求。
nghttpx黙认是启用ssl的,如果你的网站没有部署ssl,也可以使用不带sslhttp/2.0,命令如下
nghttpx -f '0.0.0.0,80' -b 127.0.0.1,81 --frontend-notls
当然了,nghttpx/nghttpd也支持http/1.1http/1.0协议,完全不用担心不支持http/2.0的浏览器。
如果你安装了spdylay库, 在启用ssl时,nghttpd/nghttpx也支持spdy/3.1协议。
更多关于nghttp2的信息点击这里.