前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >本机与云服务器内网互联?

本机与云服务器内网互联?

作者头像
花花522
发布2023-03-07 16:09:44
7.2K0
发布2023-03-07 16:09:44
举报
文章被收录于专栏:花花爱咖啡

OpenVpn

场景如下

  • 线上部署了很多微服务,但是如果本地也启动了微服务,注册到nacos上,就会造成一会能访问一会不能访问的情况
  • 使用线上gateway直通本地 也就是将自己电脑与服务器内网互联

image-20220918211527746

  • 可以看到我们本机的ip已经上去了,同时我们是可以全部ping通的

image-20220918211508833

使用docker

使用docker就是一切皆为容器

  • 拉取镜像
代码语言:javascript
复制
docker pull kylemanna/openvpn
  • 创建需要挂载的目录
代码语言:javascript
复制
mkdir -p /home/dockerfolder/openvpn
  • 启动 生成配置文件
代码语言:javascript
复制
docker run -v /home/dockerfolder/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u tcp://101.34.243.14 
#外网ip或域名 我这里是101.34.243.14

[root@k8s-node1 smart-extension-activity-module]# docker run -v /home/dockerfolder/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_genconfig -u tcp://101.34.243.14
Processing PUSH Config: 'block-outside-dns'
Processing Route Config: '192.168.254.0/24'
Processing PUSH Config: 'dhcp-option DNS 8.8.8.8'
Processing PUSH Config: 'dhcp-option DNS 8.8.4.4'
Processing PUSH Config: 'comp-lzo no'
Successfully generated config
  • 生成密钥文件
    • 输入密码是看不见的
    • ca名称默认就行
    • 再次输入密码
代码语言:javascript
复制
docker run -v /home/dockerfolder/openvpn:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki


[root@k8s-node1 smart-extension-activity-module]# docker run -v /home/dockerfolder/openvpn:/etc/openvpn --rm -it kylemanna/openvpn ovpn_initpki

init-pki complete; you may now create a CA or requests.
Your newly created PKI dir is: /etc/openvpn/pki


Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020

Enter New CA Key Passphrase: 
Re-Enter New CA Key Passphrase: 
Generating RSA private key, 2048 bit long modulus (2 primes)
............+++++
...................................................................................................................................................................................+++++
e is 65537 (0x010001)
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Common Name (eg: your user, host, or server name) [Easy-RSA CA]:

CA creation complete and you may now import and sign cert requests.
Your new CA certificate file for publishing is at:
/etc/openvpn/pki/ca.crt


Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Generating DH parameters, 2048 bit long safe prime, generator 2
This is going to take a long time
.....................+...................................................................................................................................................................................................................................................................+............++*++*++*++*

DH parameters of size 2048 created at /etc/openvpn/pki/dh.pem


Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Generating a RSA private key
..........................+++++
.....................+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-73.hMNoFJ/tmp.kDCbkp'
-----
Using configuration from /etc/openvpn/pki/easy-rsa-73.hMNoFJ/tmp.NbaHFC
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'101.34.243.14'
Certificate is to be certified until Dec 19 16:17:07 2024 GMT (825 days)

Write out database with 1 new entries
Data Base Updated

Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Using configuration from /etc/openvpn/pki/easy-rsa-148.Jbkbcc/tmp.ehLdMP
Enter pass phrase for /etc/openvpn/pki/private/ca.key:

An updated CRL has been created.
CRL file: /etc/openvpn/pki/crl.pem
  • 生成客户端证书
    • 输入刚才的密码 我是123456
代码语言:javascript
复制
docker run -v /home/dockerfolder/openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full huahua nopass




[root@k8s-node1 smart-extension-activity-module]# docker run -v /home/dockerfolder/openvpn:/etc/openvpn --rm -it kylemanna/openvpn easyrsa build-client-full huahua nopass
Using SSL: openssl OpenSSL 1.1.1g  21 Apr 2020
Generating a RSA private key
.........................+++++
..................................................................................................................................................................+++++
writing new private key to '/etc/openvpn/pki/easy-rsa-1.MIpgpi/tmp.AlbjnJ'
-----
Using configuration from /etc/openvpn/pki/easy-rsa-1.MIpgpi/tmp.oAeKfC
Enter pass phrase for /etc/openvpn/pki/private/ca.key:
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
commonName            :ASN.1 12:'whsir'
Certificate is to be certified until Dec 19 16:19:35 2024 GMT (825 days)

Write out database with 1 new entries
Data Base Updated


  • 导出客户端配置
代码语言:javascript
复制
# 创建文件夹 -p可以创建多级文件夹
mkdir -p /data/openvpn/conf


docker run -v /home/dockerfolder/openvpn:/etc/openvpn --rm kylemanna/openvpn ovpn_getclient huahua > /home/dockerfolder/openvpn/conf/huahua.ovpn


  • 启动客户端
代码语言:javascript
复制
docker run --restart=always --name openvpn -v /home/dockerfolder/openvpn:/etc/openvpn -d -p 21194:1194  --cap-add=NET_ADMIN kylemanna/openvpn
  • 把配置文件从/home/dockerfolder/openvpn/conf/huahua.ovpn下载到本地
  • 注意打开看看端口是不是21194,不是的话自己修改一下

image-20220917005440549

  • openvpn直接导入配置 连接
  • 关闭win11公网防火墙
  • 到这里只实现了openvpn基础的ping容器 和容器ping本机 ,但是宿主机是不通的,感觉可以使用route功能来实现,但是目前没测试成功过,于是把目标转向了把openvpn安装到宿主机本身

安装到宿主机

主机名 外网ip 内网ip openvpn 43.142.192.164 10.0.4.15

安装

建议安装启用epel源,采用yum的方式安装openvpn

代码语言:javascript
复制
yum -y install openssl openssl-devel lzo openvpn easy-rsa

使用路由还是桥接?

建议使用路由,除非你有一些需要桥接的特定场景,例如:

  • VPN需要能够处理非ip协议,如IPX
  • 通过VPN运行应用程序,该VPN依赖于网络广播(如局域网游戏)
  • 希望允许跨VPN浏览Windows文件共享,而无需设置Samba或WINS服务器

确定私有子网

Server 与 Client 的VPN通道子网,不要与已有环境的网络冲突即可。

默认:10.8.0.0/16

配置证书密钥

Esay-RSA默认安装目录在/usr/share/easy-rsa/3.0.8,文档配置文件模板在/usr/share/doc/easy-rsa-3.0.8

文档建议我们拷贝一份到别的目录使用,以免将来升级的时候被覆盖掉。我们照做就好,目录就选择我们的OpenVPN配置目录,毕竟就是给它用的嘛。

代码语言:javascript
复制
cp -a /usr/share/easy-rsa/3.0.8 /etc/openvpn/easy-rsa

拷贝配置文件模板,安装文档要求,必须重命名为vars才可以被自动加载。

代码语言:javascript
复制
cp -a /usr/share/doc/easy-rsa-3.0.8/vars.example /etc/openvpn/easy-rsa/vars

编辑配置文件vars,主要修改证书相关的参数。文档里也说了,其实啥也不改,用默认的就完事了。甚至连这个配置文件都可以不用。咱就稍微费点事,改一下吧。随便怎么定义都行,不会对证书有什么影响。

代码语言:javascript
复制
set_var EASYRSA_REQ_COUNTRY    "CN"
set_var EASYRSA_REQ_PROVINCE   "JiangSu"
set_var EASYRSA_REQ_CITY       "Nanjing"
set_var EASYRSA_REQ_ORG        "SIMAEK"
set_var EASYRSA_REQ_EMAIL      "master@simaek.com"
set_var EASYRSA_REQ_OU         "Development Dept."

说明: EASYRSA_REQ_COUNTRY "所在的国家" EASYRSA_REQ_PROVINCE "所在的省份" EASYRSA_REQ_CITY "所在的城市" EASYRSA_REQ_ORG "所属的组织" EASYRSA_REQ_EMAIL "邮件地址" EASYRSA_REQ_OU "组织单位,部门"

说明一下我们需要创建的证书:

  • CA根证书,用于给服务器和客户端证书签名使用。
  • OpenVPN服务器证书
  • Diffie-Hellman算法用到的key

进入我们easy-rsa脚本所在目录,初始pki目录,我们创建的证书和生成的中间文件都会存放在这个目录里,默认位置为脚本执行的路径。其实可以配置,但相信大家和我一样,懒得改配置文件了。

  • 初始化
代码语言:javascript
复制
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
  • 创建根证书
代码语言:javascript
复制
 ./easyrsa build-ca
  • 创建server端证书和私钥文件
代码语言:javascript
复制
./easyrsa gen-req server nopass
  • 给server证书签名
代码语言:javascript
复制
./easyrsa sign server server
  • 创建DH文件
代码语言:javascript
复制
./easyrsa gen-dh
  • 创建client端证书和私钥文件
代码语言:javascript
复制
./easyrsa gen-req client nopass
  • 给client端证书签名
代码语言:javascript
复制
./easyrsa sign client client

配置openvpn

  • 自行创建配置文件/etc/openvpn/server.conf,并加入如下配置
代码语言:javascript
复制
port 1194 #端口
proto udp #协议
dev tun #采用路由隧道模式tun
ca ca.crt #ca证书文件位置
cert server.crt #服务端公钥名称
key server.key #服务端私钥名称
dh dh.pem #交换证书
server 10.8.0.0 255.255.255.0 #给客户端分配地址池,注意:不能和VPN服务器内网网段有相同
push "route 10.0.4.0 255.255.255.0" #允许客户端访问内网10.0.4.0网段 这里是服务器自己的网段 这样才能在客户端访问到10.0.4.x网段的时候走到我们服务器上
ifconfig-pool-persist ipp.txt #地址池记录文件位置
keepalive 10 120 #存活时间,10秒ping一次,120 如未收到响应则视为断线
max-clients 100 #最多允许100个客户端连接
status openvpn-status.log #日志记录位置
verb 3 #openvpn版本
client-to-client #客户端与客户端之间支持通信
log /var/log/openvpn.log #openvpn日志记录位置
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys。
persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
duplicate-cn
  • 拷贝证书到openvpn主配置文件目录下
代码语言:javascript
复制
cp /etc/openvpn/pki/ca.crt /etc/openvpn/
cp /etc/openvpn/pki/issued/server.crt  /etc/openvpn/
cp /etc/openvpn/pki/private/server.key /etc/openvpn/
cp /etc/openvpn/pki/dh.pem  /etc/openvpn/
  • 添加check文件
代码语言:javascript
复制
[root@openvpn openvpn]# cat /etc/openvpn/check.sh
#!/bin/sh
###########################################################
PASSFILE="/etc/openvpn/openvpnfile"
LOG_FILE="/var/log/openvpn-password.log"
TIME_STAMP=`date "+%Y-%m-%d %T"`

if [ ! -r "${PASSFILE}" ]; then
    echo "${TIME_STAMP}: Could not open password file \"${PASSFILE}\" for reading." >> ${LOG_FILE}
    exit 1
fi

CORRECT_PASSWORD=`awk '!/^;/&&!/^#/&&$1=="'${username}'"{print $2;exit}' ${PASSFILE}`

if [ "${CORRECT_PASSWORD}" = "" ]; then
    echo "${TIME_STAMP}: User does not exist: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
    exit 1
fi
if [ "${password}" = "${CORRECT_PASSWORD}" ]; then
    echo "${TIME_STAMP}: Successful authentication: username=\"${username}\"." >> ${LOG_FILE}
    exit 0
fi

echo "${TIME_STAMP}: Incorrect password: username=\"${username}\", password=\"${password}\"." >> ${LOG_FILE}
exit 1
  • 启动openvpn
代码语言:javascript
复制
systemctl start openvpn@server.service
systemctl enable openvpn@server.service

客户端配置

  • 拷贝服务端生成的证书到OpenVPN安装目录的config目录下
代码语言:javascript
复制
/etc/openvpn/pki/ca.crt
/etc/openvpn/pki/issued/client.crt
/etc/openvpn/pki/private/client.key
  • 在OpenVPN安装目录的config目录下,新建一个client.ovpn文件,在文件中添加如下配置
代码语言:javascript
复制
client #指定当前VPN是客户端
dev tun #使用tun隧道传输协议
proto udp #使用udp协议传输数据
remote 这里是公网ip 1194 #openvpn服务器IP地址端口号
resolv-retry infinite #断线自动重新连接,在网络不稳定的情况下非常有用
nobind #不绑定本地特定的端口号
ca ca.crt #指定CA证书的文件路径
cert client.crt #指定当前客户端的证书文件路径
key client.key #指定当前客户端的私钥文件路径
verb 3 #指定日志文件的记录详细级别,可选0-9,等级越高日志内容越详细
persist-key #通过keepalive检测超时后,重新启动VPN,不重新读取keys,保留第一次使用的keys
persist-tun #检测超时后,重新启动VPN,一直保持tun是linkup的。否则网络会先linkdown然后再linkup
  • 启动openVpn
  • 导入配置文件
  • 导入的时候要注意,将ca.crt,client.crt,client.key手动移动到我们导入的配置里面,最终是这样的

image-20220918212128666

image-20220918212110768

双击安装好的OpenVPN软件,然后右键点击连接。

存在问题

  • 注意本机的防火墙,我就被这个坑了两天(这里感谢铁军哥,一语道破)

image-20220918212233799

参考文章:访问公司内网

openvpn.exe可以从「openvpn-install-2.4.6-I602.exe」https://www.aliyundrive.com/s/rAvbGxEavkG下载

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-09-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 花花爱咖啡 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • OpenVpn
    • 使用docker
      • 安装到宿主机
        • 安装
        • 使用路由还是桥接?
        • 确定私有子网
        • 配置证书密钥
        • 配置openvpn
        • 客户端配置
    相关产品与服务
    VPN 连接
    VPN 连接(VPN Connections)是一种基于网络隧道技术,实现本地数据中心与腾讯云上资源连通的传输服务,它能帮您在 Internet 上快速构建一条安全、可靠的加密通道。VPN 连接具有配置简单,云端配置实时生效、可靠性高等特点,其网关可用性达到 99.95%,保证稳定、持续的业务连接,帮您轻松实现异地容灾、混合云部署等复杂业务场景。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档