领导发话,公司内部资料不能出外网,端口映射都不行,OpenVPN+代理可以接受,于是我就开始折腾了

服务器:CentOS 8 不带桌面

网上教程多如牛毛,以下简单记录下思路和常用到的命令。

安装

整体思路是连进OpenVPN的网段,再用squid弄一个http代理跳到其他服务器。
需要注意的是firewalld防火墙和squid的代理规则。

  • 把内网vpn服务器的一个端口映射到外网

  • 安装OpenVPN和squid

sudo yum update -y
sudo yum install epel-release -y
sudo yum update -y
sudo yum install -y openvpn wget
sudo yum -y install squid
  • 安装easyrsa

这里我用的这个 https://github.com/OpenVPN/easy-rsa,有的教程是老版本的

怎么安装easyrsa就没有命令了,我直接sftp拷进去了…

总之,连带着openvpn的文件夹,最后的目录结构是这样的:

 - etc
    - openvpn
        - client
        - server
        - easyrsa
  • 客户端

Windows的客户端推荐社区版,简单易用 https://openvpn.net/community-downloads/

配置

  • 生成证书和其他文件

参考easyrsa的教程,先生成ca,再签一个server证书和一个client证书。

./easyrsa init-pki
./easyrsa build-ca                              # 得到ca.crt和ca.key

SERVER=server
echo | ./easyrsa gen-req $SERVER nopass
echo yes | ./easyrsa sign-req server $SERVER    # 得到server.crt和server.key

CLIENT=client
echo | ./easyrsa gen-req $CLIENT nopass
echo yes | ./easyrsa sign-req client $CLIENT    # 得到client.crt和client.key

另外,你还得生成dh文件和ta.key文件。

./easyrsa gen-dh                    # 得到dh.pem
openvpn --genkey --secret ta.key    # 得到ta.key

ca.key是要保管好的,这个丢了整个vpn就毫无安全可言了。

服务端和客户端都要有的文件:ca.crt, ta.key
服务端还需要的:server.crt, server.key, dh.pem, server.conf
客户端还需要的:client.crt, client.key, client.ovpn

把服务端需要的文件拷到/etc/openvpn/server文件夹中即可。

  • 编辑配置文件

配置文件的样板可以从/usr/share/doc/packages/openvpn里拷,具体的配置就不说了,没几行也挺简单。

启动OpenVPN

systemctl enable openvpn-server@server.service
systemctl start openvpn-server@server.service
systemctl status openvpn-server@server.service

最后一行命令来查看openvpn服务是否启动成功

遗憾的是,启动以后九成还是连不上,你得继续往后看。

防火墙

保存以下这个脚本,比如名字是 firewalledit.sh

假设你openvpn用的端口是9527,协议是udp,那么执行

./firewalledit.sh add 9527/udp

将对应端口放行。

#!/bin/bash

if [ $1 = "add" ]; then
    firewall-cmd --add-port=$2
fi

if [ $1 = "rm" ]; then
    firewall-cmd --remove-port=$2
fi

echo Restarting...

firewall-cmd --runtime-to-permanent
firewall-cmd --reload

systemctl restart firewalld
systemctl status firewalld

firewall-cmd --list-all

如果你网关的端口映射和防火墙也都配置正确,那么客户端应该就能连上服务器了。

不过这个时候你没法访问内网的其他服务器,因为vpn给你分配的网段和内网网段不同,而且也是为了安全起见,这时候还需要http代理。

Http代理

编辑squid配置vi /etc/squid/squid.conf

squid配置文件就不说了,把你需要的规则添加进去就行。

然后启动squid代理程序。

systemctl enable squid
systemctl start squid
systemctl status squid

还要记得设置防火墙把squid的监听端口放行(假设监听12345端口)

./firewalledit.sh add 12345/tcp

然后,在你的电脑上设置http代理,地址是vpn的内网地址,默认为10.8.0.1,端口是squid的端口(12345)。

利用这个http代理,就可以访问内网其他机器的服务了。

Socks5代理

http代理能力还是弱了些,于是我又弄了个ssserver,本地起一个ss(主要是为了他的socks5代理),然后又用proxifier实现了全局无缝切换。

这里就不多说了,为了这一点体验的提升请自行折腾。

吊销证书

吊销证书需要生成一个crl.pem吊销列表,然后配置openvpn客户端读取这个文件。

#!/bin/bash

if [ -z "$1" ]
then
    echo "ERROR: input revoke NAME."
    exit 1
fi

cd /etc/openvpn/easyrsa

echo yes | ./easyrsa revoke $1
./easyrsa gen-crl

cp ./pki/crl.pem ../server/crl.pem

systemctl restart openvpn-server@server.service

将这个脚本保存为revoke.sh,假设你要吊销xujinkai的证书,那么执行以下命令:

./revoke.sh xujinkai

crl.pem会拷入/etc/openvpn/server文件夹,记得编辑server.conf添加一行crl-verify crl.pem,最后重启openvpn即可。