Max-Qiu / blog

麦克斯博客 https://maxqiu.com
Apache License 2.0
3 stars 0 forks source link

你好,博主请问你openvpn的那篇文章是删了吗?方便重新发布一次吗? #1

Closed mrzhu666 closed 1 year ago

mrzhu666 commented 1 year ago

CentOS - OpenVPN安装使用教程(Linux服务端+Windows客户端)

Max-Qiu commented 1 year ago

之前因为这篇文章被腾讯封了域名,然后屏蔽了文章,写了保证书才解开了,既然有人想看,那我就放在这里好了

Max-Qiu commented 1 year ago

友情提醒:按照本教程安装后 不能实现 访问外网(即科学上网、翻墙),仅用于多台电脑组局域网!

情景说明

  1. 有一台或多台云服务器,且均在同一局域网内
  2. 服务器内有多个服务需要访问,例如:
    1. MySQLRedis等服务,这些服务可以设置密码,然后开放端口
    2. NacosElasticsearchzipkin等服务,这些服务无法设置密码、或者不方便设置密码,但是又想正常访问
  3. 公司电脑想访问家里电脑,但是家里电脑又没有公网IP

此时可以搭建VPN通道,使本地机器和云服务器组成局域网,云服务器的控制面板上只需要开放一个VPN的端口即可。

服务端(CentOS7环境):

安装依赖

yum install -y gcc-c++ openssl openssl-devel net-tools lzo lzo-devel pam pam-devel

安装OpenVPN

下载

  1. 打开OpenVPN官网下载地址:https://openvpn.net/community-downloads/
  2. 下载openvpn-2.5.3.tar.gz
  3. 下载完成上传到服务器

或者

# 直接执行脚本下载到服务器
wget https://swupdate.openvpn.org/community/releases/openvpn-2.5.3.tar.gz

解压、编译、安装

# 解压
tar -zxf openvpn-2.5.3.tar.gz
# 进入该目录
cd openvpn-2.5.3/
# 配置
./configure --prefix=/usr/local/openvpn/
# 编译
make
# 安装
make install

添加环境变量

编辑环境变量文件

vim /etc/profile

PATH添加:/usr/local/openvpn/sbin,例如:

export PATH=$PATH:/usr/local/openvpn/sbin

立即生效

source /etc/profile

查看是否成功

openvpn --version

退出当前目录

cd ..

生成证书

下载easy-rsa工具

  1. 打开GitHub地址https://github.com/OpenVPN/easy-rsa/releases
  2. 下载最新版easy-rsa的tgz包
  3. 下载完成上传到服务器

或者

# 直接执行脚本下载到服务器
wget https://github.com/OpenVPN/easy-rsa/releases/download/v3.0.8/EasyRSA-3.0.8.tgz

解压

# 解压
tar -zxf EasyRSA-3.0.8.tgz
# 进入该目录
cd EasyRSA-3.0.8/

生成服务端与客户端证书

  1. 初始化
    ./easyrsa init-pki
  2. 生成根证书
    ./easyrsa build-ca nopass
    • nopass表示不加密
    • 提示输入通用名,可以输入服务器IP或者域名或者不输入,然后直接回车
    • 此时看到提示ca文件在/root/EasyRSA-3.0.8/pki/ca.crt
  3. 服务端:
    1. 创建服务端证书
      ./easyrsa gen-req server nopass
      • server即创建后的证书文件名,可自定义
      • nopass表示不加密
      • 提示输入通用名,直接回车
    2. 给服务端证书做签名
      ./easyrsa sign server server
      • 第一个server代表签为服务端
      • 第二个server服务端证书文件名
      • 提示一些确认信息,输入yes并回车
  4. 客户端:(如果需要多个客户端,每个客户端都需要一个唯一的证书。重复以下两步:client端文件名不相同即可,例如:client1 client2)
    1. 创建客户端证书
      ./easyrsa gen-req client nopass
      • nopass表示不加密
      • client即创建后的文件名,可自定义
      • 提示输入通用名,直接回车
    2. 给客户端证书做签名
      ./easyrsa sign client client
      • 第一个client代表签为客户端
      • 第二个client客户端证书文件名
      • 提示一些确认信息,输入yes并回车

配置服务端

拷贝证书

复制服务端秘钥至安装目录

# PS:当前命令还在上文的 /root/EasyRSA-3.0.8 目录下
cp -p pki/ca.crt pki/private/server.key pki/issued/server.crt /usr/local/openvpn/

复制服务端配置文件至安装目录

# 退出当前文件夹并进入openvpn源码文件夹
cd ../openvpn-2.5.3/
# 复制配置文件示例
cp ./sample/sample-config-files/server.conf /usr/local/openvpn/

生成其他文件

进入到安装目录

cd /usr/local/openvpn/

生成pem文件

openssl dhparam -out dh2048.pem 2048

生成key文件

openvpn --genkey tls-auth ta.key

修改配置文件

编辑配置文件

vim server.conf

修改如下配置

# 监听端口:默认1194,可自定义修改
port 1194
# 使用TCP协议
proto tcp
;proto udp
# 使用tap模式
dev tap
;dev tun
# 证书文件
ca /usr/local/openvpn/ca.crt
cert /usr/local/openvpn/server.crt
key /usr/local/openvpn/server.key
# pem文件
dh /usr/local/openvpn/dh2048.pem
# 给客服端分配的IP网段,根据自己喜好修改,不能和服务器内网IP一个网段
server 10.8.0.0 255.255.255.0
# IP记录文件
ifconfig-pool-persist /usr/local/openvpn/ipp.txt
# 允许客户端访问服务器上的其他网络,10.0.4.0是服务器的内网IP网段,根据实际情况修改
push "route 10.0.4.0 255.255.255.0"
# 允许客户端之间互相访问,例如公司电脑和家里电脑想互相访问,则需要开启
client-to-client
# key文件
tls-auth /usr/local/openvpn/ta.key 0  # This file is secret
# 加密方式
cipher AES-256-GCM
# 状态文件
status /usr/local/openvpn/openvpn-status.log
# 日志文件
log /usr/local/openvpn/openvpn.log
# 明确的退出通知,TCP模式需要设置为0
explicit-exit-notify 0

修改完成后保存退出

修改firewalld

必须启用firewalld,否则无法完成网络转发(当然,如果你会iptables就当我没说)

启用firewalld并设置开机自启

PS:如果服务器没有启用过firewalldssh端口不是默认的22,那么请使用云厂商的VNC网页模式登录服务器并开启防火墙,然后再添加自定义的ssh端口放行。XShell等远程连接会在打开firewalld之后被动断开,需要开放端口之后再重新连接

systemctl start firewalld.service
systemctl enable firewalld.service

开放openvpn的端口以及打开masquerade

firewall-cmd --zone=public --permanent --add-port=1194/tcp
firewall-cmd --zone=public --permanent --add-masquerade
firewall-cmd --reload

启动与开机自启

新建服务文件

vim /etc/systemd/system/openvpn.service

添加如下内容

[Unit]
Description=OpenVPN Server
After=network.target
After=syslog.target

[Install]
WantedBy=multi-user.target

[Service]
ExecStart=/usr/local/openvpn/sbin/openvpn --config /usr/local/openvpn/server.conf

刷新系统服务、设置开机自启、启动服务、查看服务状态

systemctl daemon-reload
systemctl enable openvpn.service
systemctl start openvpn.service
systemctl status openvpn.service

修改云服务器控制面板的防火墙

根据上文配置文件中的端口和协议,在云服务器的控制面板中打开对应的端口和协议即可

客户端(Windows)

下载

  1. 打开官网https://openvpn.net/community-downloads/
  2. 点击Windows 64-bit MSI installer后面的OpenVPN-2.5.3-I601-amd64.msi进行下载

或者

# 浏览器打开如下地址
https://swupdate.openvpn.org/community/releases/OpenVPN-2.5.3-I601-amd64.msi

安装

  1. 双击开始安装
  2. 选择Customize自定义安装
    1. Launch on User Logon:图形化界面的开机自启。根据自己需求进行选择
    2. OpenVPN Servcie:后台服务模式(如果要开机自动连接VPN,则启用)
    3. Wintuntun模式虚拟网卡。根据上文配置,关闭
  3. 自定义选项完成后,点击Install Now
  4. 安装完成后,选择Close完成安装

配置

证书文件

在服务器上导出客户端证书文件和ta.key文件,列表如下:

导出后放在C:\Program Files\OpenVPN\config目录下

客户端配置文件

复制一份C:\Program Files\OpenVPN\sample-config\client.ovpnC:\Program Files\OpenVPN\config路径下,使用记事本等文本编辑工具编辑client.ovpn文件。修改的内容如下

# 使用tap模式
dev tap
;dev tun
# 使用TCP
proto tcp
;proto udp
# 服务端地址与端口
remote x.x.x.x 1194
# 秘钥文件(默认即可)
ca ca.crt
cert client.crt
key client.key
# ta.key文件(默认即可)
tls-auth ta.key 1
# 加密方式
cipher AES-256-GCM
# 不缓存认证(添加在文件结尾)
auth-nocache

客户端配置

右击任务栏带锁的小电脑图标,选择选项菜单

  1. 常规:
    1. 启动:此处也可以设置图形界面是否开机自启
    2. 静默连接:连接时不弹出窗口
    3. 显示通知:根据需求选择
  2. 高级:
    1. 配置文件:C:\Program Files\OpenVPN\config
    2. 日志文件:C:\Program Files\OpenVPN\log

启动

图形界面连接

  1. 双击桌面OpenVPN GUI图标启动图形界面(已启动则忽略)
  2. 双击任务栏带锁的小电脑图标
  3. 看到图标变绿色代表连接成功
  4. (可选)打开cmd,测试ping 10.8.0.1

PS:GUI打开自动连接:快捷方式 → 右击 → 属性 → 目标后面添加--connect client.ovpn(注意--前面有个空格) → 确定

开机自启服务连接

安装时如果启用了OpenVPN Servcie,则安装目录下有一个config-auto文件夹

  1. 使用图形界面连接保证连接正常可用
  2. config目录下的配置文件都复制到config-auto目录下
  3. 重启电脑,然后打开cmd,测试ping 10.8.0.1

PS: 可能会出现开机之后ping不通的情况,等2分钟后又可以连上去。 从日志分享,第一次连接的时候连不上,2分钟之后会重试,重试的时候就连上去了 目前还不知道为啥第一次连不上去

使用

当服务端和客户端均正常启动后,就可以通过服务器的内网IP访问到上面的服务,多个客户端之间也可以互相访问

mrzhu666 commented 1 year ago

感谢,你这篇文章比较简洁、简单