Linux搭建OpenVPN+SSH免检通道

  很久之前发过,使用SSH通道加密隐藏流量的,这期直接来一个全面详细的版本,附带使用路由器自带openvpn客户端实现全局VPN的设置。

1.服务器搭建 (CentOS7)

yum -y install openvpn

下载easy-rsa来生成证书

wget -P ~/ https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz
tar xzf EasyRSA-3.0.8.tgz
cd EasyRSA-3.0.8
cp vars.example vars

修改vars,记得把证书时间改长点,十年二十年的样子吧。
依次生成ca/dh/服务器证书/客户端证书

 ./easyrsa init-pki
 ./easyrsa build-ca nopass
 ./easyrsa gen-dh
 ./easyrsa build-server-full server nopass
 ./easyrsa build-client-full client nopass

需要多个客户端证书的,可以使用不同的名字生成多个证书,例如client1 client2
把整个pki目录拷贝到/etc/openvpn里面

cp -rp pki /etc/openvpn/

修改openvpn服务器端配置文件

vi /etc/openvpn/server.conf
comp-lzo
port 33899  ###端口
proto tcp   ###协议,必须tcp,后面用到
dev tun
ca /etc/openvpn/pki/ca.crt
cert /etc/openvpn/pki/issued/server.crt
key /etc/openvpn/pki/private/server.key 
dh /etc/openvpn/pki/dh.pem
server 10.8.0.0 255.255.0.0
ifconfig-pool-persist ipp.txt
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 223.5.5.5"
push "redirect-gateway def1 bypass-dhcp"
client-to-client
keepalive 10 120
cipher AES-256-CBC
log         /var/log/openvpn.log
verb 3

保存退出

修改一下系统文件,启用nat转发

vi /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p

使用iptables来进行转发。
iptables -t nat -A POSTROUTING -s 10.8.0.0/16 -o eth0 -j MASQUERADE

eth0是你的服务器网卡名称,按实际填写.

添加systemctl脚本

vi /usr/lib/systemd/system/openvpn.service
[Unit]
Description=OpenVPN Robust And Highly Flexible Tunneling Application On %I
After=network.target

[Service]
Type=notify
PrivateTmp=true
ExecStart=/usr/sbin/openvpn --cd /etc/openvpn/ --config /etc/openvpn/server.conf

[Install]
WantedBy=multi-user.target

保存退出

systemctl enable openvpn

启动VPN服务器看看

systemctl start openvpn

服务器搭建完毕。

2.客户端搭建过程就省略了,这里架设你已经安装好客户端,WIN下客户端配置文件client.ovpn

client
dev tun
proto tcp
remote 127.0.0.1 33899
remote-cert-tls server
auth-nocache
resolv-retry infinite
nobind
verb 3
persist-key
persist-tun 
cipher AES-256-CBC
comp-lzo


<cert>
</cert>

<key>
</key>

<ca>
</ca>

记得把ca和证书这些粘贴进去

3.使用SSH通道加密转发。

目前所有VPN流量一旦检测到都会经常被干扰甚至直接屏蔽,所以客户端直接连接服务器端是肯定不行的。测试过很多混肴参数也没什么用,来来去去还是SSH加密通道端口转发最好用。

WIN上可以用PuTTY,先填好你的服务器信息

左边栏 Connection — SSH — Tunnels

Source port:33899

Destination:1.1.1.1:33899 (这里的1.1.1.1改成你的服务器公网IP)

add之后点open连接,连接上服务器后通道就打开了。这时可以打开openvpn-gui连接试试了。

移动客户端可以用Termius,里面的Port Forwarding就是Tunnels一样的功能,过程跟putty类似。

Linux客户端下,可以直接用SSH命令来建立连接

/usr/bin/ssh -Nf -L 127.0.0.1:33899:1.1.1.1:33899 1.1.1.1

127.0.0.1改成客户端实际IP地址,那么其他客户端都可以通过这个通道进行连接。1.1.1.1是你的openvpn服务器公网IP地址,按照实际修改。

到这里,基本上你已经可以畅通无阻了。但是你可能会发现,所有流量流经vpn之后,网速会慢了很多,有些网络不需要走vpn。而且使用SSH通道需要通道一直开着,WIN上要开着PuTTY,手机上要开着Termius,感觉很不爽,下面就来进阶版

目前我用的路由是斐讯K2P,自带openvpn,很多路由器都可以刷固件带openvpn的。

登录路由器后台,找到VPN客户端,启用VPN客户端

VPN 协议:   openvpn
远程 VPN 服务器 (IP 或者 DNS 主机): 127.0.0.1
通信端口: 33899
通信协议:	TCP
封装层:	L3 - TUN (IP)
认证类型:	TLS: client.crt/client.key
加密算法:	[AES-256-CBC] AES, 256 bit

OpenVPN 证书和密钥

ca.crt (Root CA Certificate):
client.crt (Client Certificate):
client.key (Client Private Key) - secret:

分别把ca证书和客户端证书密钥粘贴进去,保存。

启用路由器的SSH服务,ssh登录到路由器,通过刚才的命令建立通道连接

/usr/bin/ssh -Nf -L 127.0.0.1:33899:1.1.1.1:33899 1.1.1.1

等通道连接正常,VPN客户端也就正常连接了。

回到OpenVPN服务器,修改server.conf,删掉

push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 8.8.8.8"
push "dhcp-option DNS 223.5.5.5"

把需要走vpn的网段,添加到路由表,格式如下:

push "route 1.1.0.0 255.255.0.0"
push "route 8.0.0.0 255.0.0.0"

再回到斐讯路由管理页面,内部网络 (LAN) —-DHCP 服务器 —自定义配置文件 “dnsmasq.servers”

定义一下哪些域名使用国内DNS,哪些使用国外DNS,避免DNS污染,也避免统一使用国外DNS太慢,格式如下


server=/taobao.org/223.5.5.5
server=/cn/223.5.5.5
server=/google.com/8.8.8.8
server=/reddit.com/8.8.8.8
server=/gov/eu/ca/tw/8.8.8.8
server=/wikipedia.org/wikimedia.org/8.8.8.8
server=/bytedance.com/8.8.8.8
server=/akamai.net/8.8.8.8
server=/edgesuite.net/8.8.8.8

保存,现在是不是感觉快多了。

高阶阶段,路由器上,你可以用dropbear生成验证文件,通过文件验证的方式不用每次建立通道都要输入密码。然后再创建一个cron,定时检查系统的tunnel是否正常,不正常就重连。在vpn断开的脚本里,也加入重连tunnel的脚本,这样每次vpn因为故障断掉,系统都会第一时间重新连接tunnel,vpn也就马上能自动重连了。在OpenVPN服务器上,你还可以禁止除了服务器公网IP到33899的连接,这样你的33899就不对外公开了,加大了vpn服务的安全。


发表回复