huanglei

long long ago

Openvpn 内网互通

先说一个具体的场景:
上海内网网段: 192.168.10.0/24
北京内网网段: 192.168.1.0/24
现在要求上海和北京能够互联互通。
常规方法就是整个 vpn(vpn 的安装和基本配置可以看我的另外一篇文章),那具体这么弄?
我们一步步来看

第一种方式

我们把 vpn 服务安装在上海或北京的服务器上,我们这里拿上海做例子

  • 前提条件

上海必须有一个公网固定 IP,比如 123.123.123.123

  • vpn 安装及配置

我们先把 vpn 服务安装到上海的某台服务器上(安装过程可以查找我的另外一篇文章)

然后修改配置文件,注释删掉后大概是这个样子

;local a.b.c.d # 如果有多网卡可以指定一个

port 1194 # 端口号
proto tcp # 协议
dev tun # 路由模式

# 证书位置
ca /etc/openvpn/server/certs/ca.crt
cert /etc/openvpn/server/certs/server.crt
key /etc/openvpn/server/certs/server.key
dh /etc/openvpn/server/certs/dh.pem

# 客户端地址池
server 10.8.0.0 255.255.255.0
ifconfig-pool-persist /etc/openvpn/ipp.txt

# 客户端添加一个路由
push "route 192.168.10.0 255.255.255.0"

client-config-dir /etc/openvpn/ccd
client-to-client
keepalive 10 120
cipher AES-256-CBC
comp-lzo
user openvpn
group openvpn
persist-key
persist-tun
status openvpn-status.log
log-append openvpn.log
verb 3
mute 20

这里要解释一下

# 客户端添加一个路由
push "route 192.168.10.0 255.255.255.0"

意思就是:vpn客户端只要访问 192.168.10.0/24 的 IP,从我们 vpn 拨号的这个网口发出去

试想一下北京某台电脑 IP 为 192.168.1.6 的电脑,访问 192.168.10.6 的时候,是不是就能够通过 vpn 的网口发出去了?

vpn 的配置暂时说到这,后面还要修改。

  • 防火墙(iptables)

vpn配置的地址池是10.8.0.0/24,客户端的IP地址必然为10.8.0.x,那接收到的请求源IP地址必然也是10.8.0.x,那在北京我们要访问的IP是192.168.10.6,这个IP和我们的vpn不在同一个网段,如何通呢?

我们先说说这个访问的流程,北京访问192.168.10.6,因为加了路由,则请求会从vpn客户端的网口发送到默认网关,vpn服务器会接受这个请求,然后查找192.168.10.6这个IP地址,在vpn的网段中因为没有这个IP,所以访问不了?

那如果我们把这个请求转发出去是不是就可以通了呢?

我们先看看vpn服务器的网卡信息

ip a

我们可以发现会有一个物理网卡(可能是ethX或ensX)的信息和一个tun的虚拟网卡信息,物理网卡正好是我们192.168.10.0/24的某一个IP,我们只要把从tun来的请求转到物理网卡,那就可以通啦。

我们用iptables在SNAT(源地址目标转换)做一个规则,应该就可以,命令如下

sudo iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o [ethX|ensX] -j MASQUERADE

# 查看
sudo iptables -nL -t nat

解释:在防火墙的nat表当中的POSTROUTING链上添加(-A)一条规则,规则是从(-s)10.8.0.0网段过来的请求,出去(-o OPUTPUT)的时候都走ethX|ensX

另外服务器要支持IP路由转发,系统配置要修改一下

vi /etc/sysctl.conf

net.ipv4.ip_forward = 1 # 没有则添加,有修改为1(0禁止,1开启)

sysctl -p

OK! 这回再从北京的那台电脑上

ping 192.168.10.6

是不是通了?

Openvpn 配置

注意:本教程在 centos7 下操作

依赖软件

  • 软件版本
openvpn 2.4.9
easy-rsa 3.0.7

如果版本不一致,后面的路径会有所差别
  • 安装扩展源
yum install epel-release -y
  • 安装 openvpn easy-rsa3
yum install openvpn easy-rsa -y

服务器配置

  • 拷贝配置文件
cp /usr/share/doc/openvpn-2.4.9/sample/sample-config-files/server.conf  /etc/openvpn/server/

这里的openvpn版本如果不一致,请注意路径
cp -r /usr/share/easy-rsa /etc/openvpn/
cp /usr/share/doc/easy-rsa-3.0.7/vars.example /etc/openvpn/easy-rsa/3/vars

这里的easy-rsa版本如果不一致,请注意路径
  • 进入 easy-rsa 目录
cd /etc/openvpn/easy-rsa/3
  • 创建空 PKI
./easyrsa init-pki
  • 创建 CA 证书(不使用密码)
./easyrsa build-ca nopass
(一路回车就可以)
  • 创建服务端证书(不使用密码)
./easyrsa gen-req server nopass
(一路回车就可以)
  • 签约服务端证书
./easyrsa sign server server
  • 创建 Diffie-Hellman
./easyrsa gen-dh
  • 整理服务器证书
mkdir /etc/openvpn/server/certs
cp /etc/openvpn/easy-rsa/3/pki/dh.pem /etc/openvpn/server/certs
cp /etc/openvpn/easy-rsa/3/pki/ca.crt /etc/openvpn/server/certs
cp /etc/openvpn/easy-rsa/3/pki/issued/server.crt /etc/openvpn/server/certs
cp /etc/openvpn/easy-rsa/3/pki/private/server.key /etc/openvpn/server/certs
  • 服务器配置文件
vim /etc/openvpn/server/server.conf

需修改项如下:

local 192.168.10.155 # 当前服务器ip地址,请修改

proto tcp # 去掉前面的;
;proto udp # 前面加上;

ca /etc/openvpn/server/certs/ca.crt # 修改路径
cert /etc/openvpn/server/certs/server.crt #
key /etc/openvpn/server/certs/server.key #

dh /etc/openvpn/server/certs/dh.pem #

ifconfig-pool-persist /etc/openvpn/ipp.txt #

client-to-client # 去掉前面的;

comp-lzo # 去掉前面的;

mute 20 # 去掉前面的;

log-append openvpn.log # 去掉前面的;

user openvpn # 去掉前面的;修改运行用户
group openvpn # 去掉前面的;修改运行用户组

;explicit-exit-notify 1 # 前面加上;

;tls-auth ta.key 0 # 前面加上;
  • 启动 openvpn 服务
systemctl start openvpn-server@server.service
查看启动状态
systemctl status openvpn-server@server.service
添加到自启动
systemctl enable openvpn-server@server.service

客户端配置

  • 客户端配置文件
cp /usr/share/doc/openvpn-2.4.9/sample/sample-config-files/client.conf /etc/openvpn/client/
  • 修改配置文件
# 没有用的都可以删除了,留以下内容

client

dev tun

proto tcp
remote 192.168.10.155 1194 # 服务器ip地址和端口号,和服务端配置一致
resolv-retry infinite
nobind
persist-key
persist-tun

ca ca.crt # 修改配置文件路径
cert client.crt #
key client.key #

remote-cert-tls server
cipher AES-256-CBC
verb 3
mute 20
  • 创建客户证书(不使用密码)
创建test用户

./easyrsa gen-req test nopass
(一路回车就可以)
  • 签约客户证书
./easyrsa import-req /etc/openvpn/easy-rsa/3/pki/reqs/test.req test
./easyrsa sign client test
  • 安装 openvpn client

下载地址

安装好后导入配置文件

Centos配置

Centos 安装好后初始化

  • 安装第三方源
yum install epel-release -y
  • 安装时间同步工具
yum install ntpdate -y
ntpdate cn.ntp.org.cn

Golang配置

首先下载编译器,因为要翻墙,所以找个国内的地址。 根据你的操作系统,选择最新的一个版本,直接下载一个免安装的包 下载,下载完后解压到某个目录

  • mac系统:gox.x.x.darwin-amd64.tar.gz
  • linux系统:gox.x.x.linux-arm64.tar.gz
  • window系统:gox.x.x.windows-amd64.zip

Mac && Linux

配置环境变量
vim ~/.bash_profile

# 设置GOROOT 
export GOROOT=/当前go解压的目录
# 设置GOPATH (新版本已不用设置,由于博主是从老版本过来的所以保留之前的)
export GOPATH=/当前go工作的目录
# 因为google被禁了所以要设置代理
export GOPROXY=https://goproxy.io
# 使用go mod
export GO111MODULE=on
export PATH=$PATH:$GOROOT/bin:$GOPATH/bin

Window

配置环境变量

我的电脑->属性->环境变量->添加

GOROOT: /当前go解压的目录

GOPATH: /当前go工作的目录

GOPROXY: https://goproxy.io

GO111MODULE: on

PATH: 最后添加;%GOROOT%/bin:%GOPATH%/bin
go env