场景介绍:

机器介绍

  • 本地一台Ubuntu服务器A , 处于内网中 , 无外网IP
  • 外网一台Ubuntu服务器B , 外网地址139.199.4.205
  • 目标 : 外网能够访问部署在A上的web项目

    原理简述

    分2步

    1. 将A与B组建成一个局域网
    2. 将B的80端口 转发到 A的80端口 即可大公告成

实现步骤

一 . 安装软件

登录A 和 B 服务器 分别输入如下命令

sudo apt-get -y install openvpn libssl-dev openssl

安装好后输入openvpn --version 如下所示表示安装成功step1

接着安装easy-rsa , easy-rsa用来制作openvpn相关证书

sudo apt-get -y install easy-rsa

二 . 制作CA证书

(以下操作 直到第七步 都是在B机器上操作)

/etc/openvpn目录下创建目录easy-rsa目录

sudo mkdir /etc/openvpn/easy-rsa/

/usr/share/easy-rsa/目录下的所有文件复制到/etc/openvpn/easy-rsa/

sudo cp -r /usr/share/easy-rsa/* /etc/openvpn/easy-rsa/

制作证书前需要切换到root用户下 sudo su 输入如下命令

source vars
./clean-all
./build-ca

这是在/etc/openvpn/easy-rsa/keys/ 里有生成的证书文件 把ca.crt 复制到/etc/openvpn/

cp keys/ca.crt /etc/openvpn/

三 . 制作Server端证书

./build-key-server ShawnJi

我这里写的是ShawnJi , 大家可以随意填写 , 只是一个名字的作用 一路 回车键 和 y键 就可以了 这时/etc/openvpn/easy-rsa/keys/

目录下又生成了一些文件 , 其中ShawnJi.crt和ShawnJi.key两个文件是我们要用的 把他们复制到/etc/openvpn/ 目录下

cp keys/ShawnJi.crt keys/ShawnJi.key /etc/openvpn/

四 . 生成Diffie-Hellman文件

./build-dh

稍等一会儿 , 运行结束后keys目录下新增的dh2048.pem就是我们要用的 , 复制到/etc/openvpn/

目录下cp keys/dh2048.pem /etc/openvpn/

五 . 制作Client端证书

输入

./build-key ShawnJiClient

同样一路 回车 keys目录下的ShawnJiClient.key 和 ShawnJiClient.crt 就是我们要的 , 后面放到A机器上去

六 . 配置Server端(B机器)

首先复制一套模板到目录下

cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/
cd /etc/openvpn/

解压server.conf.gz

gzip -d server.conf.gz

修改解压出的server.conf文件

  1. 修改协议 proto udp -> proto tcp
  2. 修改证书 server.crt -> ShawnJi.crt server.key -> ShawnJi.key
  3. 修改Diffie-Hellman文件 dh1024.pem -> dh2048.pem

    以上有可能会默认就是 如果这样不做更改便是

注意:上述server.conf文件中ShawnJi.crt、ShawnJi.key、dh2048.pem要与/etc/openvpn/目录下的相关文件一一对应。

同时,如果上述文件如果没有存放在/etc/openvpn/目录下,在server.conf文件中,我们要填写该文件的绝对路径 .

七 . 启动Server端openvpn

/etc/init.d/openvpn start
netstat -tunlp |grep 1194

如图便是成功

step2

八 . 配置Client端(在A机器中操作 , 以上都是在B机器操作)

将第五步生成的ShawnJiClient.key ShawnJiClient.crt 和 第二部的 ca.key 转移到A机器中 复制 配置文件模板client.conf

cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /home/ubuntu/

step3

修改client.conf内容

  • 修改proto udp -> proto tcp
  • remote remote-server 1194 -> remote 139.199.4.205 1194
  • cert client.crt -> cert ShawnJiClient.crt
  • key client.key -> ShawnJiClient.key
  • 文件重命名为client.ovpn

运行命令openvpn –config client.ovpn 如下图所示

这里写图片描述

九 . 配置端口转发(B机器上操作)

  1. 编辑/etc/sysctl.conf 取消注释net.ipv4.ip_forward=1
  2. 输入以下命令
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 10.8.0.6:80
iptables -t nat -A POSTROUTING -d 10.8.0.6 -p tcp --dport 80 -j SNAT --to 10.8.0.1
这里是将B机器(10.8.0.1)的80端口映射到A机器(10.8.0.6)的80端口上 实现 访问B机器80端口等于访问A机器80端口

可选操作

至此全部完成 还剩下一些可选操作 , 如: 开机自启动 、 端口转发规则保存

开机自启动

在A机器上如下操作 这里我用的是修改/etc/rc.local文件的方法 在/etc/rc.local 里添加如下命令

/usr/sbin/openvpn --config /home/shawnji/client.ovpn >/var/log/openvpn.log &

此外 , 需要将client.ovpn里的证书改写成绝对路径

step5

端口转发规则保存并自动载入

规则保存和载入的命令: iptables-save > /etc/iptables-config `

iptables-restore < /etc/iptables-config

  1. 保存当前规则
     iptables-save > /etc/iptables-config
    
  2. /etc/rc.local 中加入命令
     iptables-restore < /etc/iptables-config &