Tue 26 May 2015 05:35:13 PM CST
Shadowsocks不能全局代理,不如OpenVPN方便。今天试了下安装OpenVPN服务器。
OpenVPN最大的不同是会生成一块虚拟网卡,这样就把不在同一个局域网里的主机放到了一个虚拟主机中。支持两种类型的网卡,TUN和TAP,TAP更接近真实的物理网卡,会有广播之类的流量出现,而TUN只是点对点之间传递数据。所以一般可以选择TUN。
目前VPS是通过https://tunnelbroker.net/[HE IPv6 tunel]来访问IPv6,我宿舍的笔记本可以IPv6+IPv4,但实验室的IPv6有问题,据师兄说从来都不能上。而且实验室只有一个网口,是通过路由器把所有主机连起来,只要一个人登录校园网账户,则所有人都是用这个人的流量,如果挂上一天,最少四五个G就没了。
而通过VPN可以通过宿舍的电脑访问互联网,这样别人是用不了我的流量的。之前用Shadowsocks这样干过,但是不能访问IPv6。
我最初的目标是:
1. VPS与宿舍的笔记本A通过IPv6连接,不走校园网流量。
2. 笔记本A与实验室主机B通过IPv4连接,走的是校内的流量。
3. 如果B也能够访问到VPS,那么也能够上Google。我看了配置文件里的选项,只有一个 'client-to-client' 貌似是有关的。
OpenVPN的配置比Shadowsocks复杂多了,首先要通过 'easy-rsa' 生成各种证书和密钥,然后配置文件也比较复杂,跟 'mutt' 有一拼。搞了好久,最后是卡在防火墙上, 'iptables' 规则设置不对。网上查了好多也没找到解决方法。
首先,需要确定内核中开启了IP转发功能: ./etc/sysctl.d/30-ipforward.conf
net.ipv4.ip_forward=1 net.ipv6.conf.default.forwarding=1 net.ipv6.conf.all.forwarding=1
然后开启 'iptables.service' 服务:
systemctl start iptables.service systemctl enable iptables.service # 开机启动
我先在笔记本A上开启了 'openvpn server' 会多出一块网卡 'tun0' ,IP是 10.9.0.1 。 然后在主机B上开启 'openvpn client' ,同样会多出 'tun0' ,IP是 10.9.0.8。 这两个地址之间可以互相ping通,但是目前B是不能通过A访问互联网的。还需要在服务器A上配置防火墙规则:
iptables -t nat -A POSTROUTING -s 10.9.0.0/24 -o eth0 -j MASQUERADE iptables -A FORWARD -i eth0 -o tun0 -j ACCEPT iptables -A FORWARD -i tun0 -o eth0 -j ACCEPT
然后通过 'iptables-save > /etc/iptables/iptables.rules' 永久写入,以后再次启动 'iptables.service' 后就会自动加载这些规则。 上面的三条命令中,第一条是设置网络地址转换(NAT)规则,如果IP包的源地址是在该虚拟局域网中,那么就通过服务器的真实网卡eth0发送。它是在POSTROUTING规则上添加的,代表这个包已经经过路由抵达了 'tun0' ,等待被处理。 MASQUERADE是善变、伪装的意思,就是说如果 eth0 的外部IP地址可以不断变化,但不影响正常的转发。 后两条是允许在 'eth0' 和 'tun0' 之间转发IP包。没有这条规则,客户端从 'tun0' 路由过来的请求就不能传到 'eth0' ,也就不能访问互联网了。
但是这几条规则在VPS当作服务器的情况下是不行的,因为我的VPS是通过 OpenVZ 搭建的,没有真实的物理网卡,只有 'venet0' ,它是不支持 MASQUERADE的。[此处的教程]提到了可以通过 SNAT,即静态NAT来实现类似的功能。 但该方法在 'OpenVZ + CentOS 7' 上并不管用。
iptables -t nat -A POSTROUTING -s 10.9.0.0/24 ! -d 10.9.0.0/24 -j SNAT --to-source 138.128.221.113
意思从该虚拟局域网路由过来的包,如果目的地址是在局域网之外,那么就根据 SNAT 由服务器转发出去。
目前为止,都是IPv4环境下。OpenVPN 2.3.X之后,也有了IPv6支持,需要在配置文件中加上 'proto udp6' ,然后设置 'server-ipv6' 选项。 ipv6_tunnel_broker_openvpn_openvz 是我找到的唯一的一篇介绍用非原生IPv6的VPS作为 IPv6 OpenVPN 服务器的文章。不过目前还没有成功,以后可以继续搞。但是主要收获是在该博主的 Github 页面上找到了https://github.com/Nyr/openvpn-install [openvpn-install],是一个自动生成OpenVPN密钥和配置文件的脚本。生成的配置文件是一个文件,所有的key都通过inline的方式写在里面。但是我运行的时候出现了解析错误,有人说是文件编码问题,不能用UTF-8来编,但我用 'file(1)' 看了一下本来就是ASCII文本文件。所以问题暂时解决不了了。
不过在执行这个自动化安装脚本的时候,有一个选项是说,要不要通过53端口来访问OpenVPN。当然要。之后可以看到它给 iptables 加上了这么一条规则:
iptables -t nat -A PREROUTING -d 138.128.221.113/32 -p udp -m udp --dport 53 -j REDIRECT --to-ports 1194
就是服务器的配置文件不用做任何修改,如果客户端是访问服务器的53端口,那么就先重定向到1194端口!