Winse Blog

走走停停都是风景, 熙熙攘攘都向最好, 忙忙碌碌都为明朝, 何畏之.

安装配置OpenVPN

由于测试环境搭建不在同一个网络,平时查看hadoop集群状态、提交任务都可以通过hadoop-master的外网来操作。但是要读写kafka,需要直接连通所有的节点,全部映射端口太麻烦。一开始想到了VLAN(虚拟局域网),远远超出能力范围。最后通过搭架VPN来实现与测试环境的透明访问。

使用集成版本

参考 https://linux.cn/article-4733-1.html

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# download https://openvpn.net/index.php/access-server/download-openvpn-as-sw.html

# 安装
[root@cu2 ~]# rpm -ivh openvpn-as-2.0.25-CentOS6.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:openvpn-as             ########################################### [100%]
The Access Server has been successfully installed in /usr/local/openvpn_as
Configuration log file has been written to /usr/local/openvpn_as/init.log
Please enter "passwd openvpn" to set the initial
administrative password, then login as "openvpn" to continue
configuration here: https://192.168.0.214:943/admin
To reconfigure manually, use the /usr/local/openvpn_as/bin/ovpn-init tool.

Access Server web UIs are available here:
Admin  UI: https://192.168.0.214:943/admin
Client UI: https://192.168.0.214:943/

[root@cu2 ~]# passwd openvpn

然后通过web admin进行配置。如主机的信息、hostname以及监听绑定的IP

配置好以后,本地通过网页下载client程序安装。连接配置后:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

C:\Users\winse>tracert  cu3

通过最多 30 个跃点跟踪
到 cu3 [192.168.0.148] 的路由:

  1     2 ms     2 ms     2 ms  172.27.232.1
  2     2 ms     2 ms     2 ms  cu3 [192.168.0.148]

跟踪完成。


C:\Users\winse>route print
===========================================================================
IPv4 路由表
===========================================================================
活动路由:
网络目标        网络掩码          网关       接口   跃点数
          0.0.0.0          0.0.0.0      192.168.1.1    192.168.1.102     20
          0.0.0.0        128.0.0.0     172.27.232.1     172.27.232.2     20
...

http://designmylife.blog.163.com/blog/static/2067142542013527101659960/

路由匹配按最大(最亲)方式匹配。上面路由会先匹配mask为 128.0.0.0 的路由。最终把所有的流量经由VPN出去。

通过 Access Server 安装简单,配置通过网页来弄,和网上资料的都匹配不上,还有用户数量的限制,囧。

编译源码安装方式

参考:
Installation Notes
Installing OpenVPN
如何在Centos 7安裝openVPN

下载 tar.gz 后,查看里面的 INSTALL 文件内容,确认选择依赖软件的版本。

  • 服务端安装配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
[root@cu2 openvpn-2.3.10]# yum install libpam* (centos7是pam*)
[root@cu2 openvpn-2.3.10]# yum install pam-devel.x86_64

[root@cu2 ~]# rz
rz waiting to receive.
Starting zmodem transfer.  Press Ctrl+C to cancel.
Transferring lzo-2.06.tar.gz...
  100%     569 KB     569 KB/sec    00:00:01       0 Errors  

[root@cu2 ~]# tar zxvf lzo-2.06.tar.gz 
[root@cu2 ~]# cd lzo-2.06
[root@cu2 lzo-2.06]# ./configure 
[root@cu2 lzo-2.06]# make &&  make install

[root@cu2 openvpn-2.3.10]# ./configure --prefix=/usr/local/openvpn 
[root@cu2 openvpn-2.3.10]# make && make install

[root@cu2 openvpn-2.3.10]# /usr/local/openvpn/sbin/openvpn --version
OpenVPN 2.3.10 x86_64-unknown-linux-gnu [SSL (OpenSSL)] [EPOLL] [MH] [IPv6] built on Mar  9 2016

https://github.com/OpenVPN/easy-rsa/releases

[root@cu2 EasyRSA-3.0.1]# ./easyrsa  help

[root@cu2 EasyRSA-3.0.1]# ./easyrsa init-pki
[root@cu2 EasyRSA-3.0.1]#  ./easyrsa build-ca

[root@cu2 EasyRSA-3.0.1]# ./easyrsa gen-req openvpn nopass
client
[root@cu2 EasyRSA-3.0.1]# ./easyrsa sign client openvpn

[root@cu2 EasyRSA-3.0.1]# ./easyrsa gen-req esw-cu nopass
server
[root@cu2 EasyRSA-3.0.1]# ./easyrsa sign server esw-cu

commonName随便取,但是不能重!

[root@cu2 EasyRSA-3.0.1]# tree pki/
pki/
├── ca.crt
├── certs_by_serial
│   ├── 01.pem
│   └── 02.pem
├── index.txt
├── index.txt.attr
├── index.txt.attr.old
├── index.txt.old
├── issued
│   ├── esw-cu.crt
│   └── openvpn.crt
├── private
│   ├── ca.key
│   ├── esw-cu.key
│   └── openvpn.key
├── reqs
│   ├── esw-cu.req
│   └── openvpn.req
├── serial
└── serial.old

[root@cu2 EasyRSA-3.0.1]#  ./easyrsa gen-dh
[root@cu2 EasyRSA-3.0.1]# cd pki
[root@cu2 pki]# cp ca.crt dh.pem issued/esw-cu.crt private/esw-cu.key /etc/openvpn/ 

[root@cu2 openvpn-2.3.10]# cp sample/sample-config-files/server.conf /etc/openvpn/

  proto tcp
  cert esw-cu.crt
  key esw-cu.key 
  dh dh.pem
  # 在客户端额外添加这条路由到VPN
  push "route 192.168.0.0 255.255.255.0"
  # 和AS一样,会添加0.0.0.0到VPN的路由。所有请求默认走VPN https://www.digitalocean.com/community/tutorials/how-to-setup-and-configure-an-openvpn-server-on-centos-7
  ;push "redirect-gateway def1 bypass-dhcp"
  # 内网特定的域名解析地址
  ;push "dhcp-option DNS 10.16.6.88"
  #Enable multiple client to connect with same key
  duplicate-cn
  user nobody
  group nobody

[root@cu2 pki]# cd /etc/openvpn/
[root@cu2 openvpn]# /usr/local/openvpn/sbin/openvpn --config /etc/openvpn/server.conf --启动完后Ctrl+C
[root@cu2 openvpn]# /usr/local/openvpn/sbin/openvpn --daemon --config server.conf 
  • 安装客户端:

https://openvpn.net/index.php/open-source/downloads.html 下载安装 对应 的版本, 客户端的版本最好最好与服务端一致!! 不同版本默认配置不同。

拷贝sample-config/client.ovpn和服务端的ca.crt、openvpn.crt、openvpn.key到config目录下面。

修改client.ovpn:

1
2
3
4
proto tcp
remote webcu2 1194
cert openvpn.crt
key openvpn.key

然后启动 OpenVPN GUI ,右键connect就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
$ route print
...
IPv4 路由表
===========================================================================
活动路由:
网络目标        网络掩码          网关       接口   跃点数
          0.0.0.0          0.0.0.0      192.168.1.1    192.168.1.102     20
         10.8.0.1  255.255.255.255         10.8.0.5         10.8.0.6     20
         10.8.0.4  255.255.255.252            在链路上          10.8.0.6    276
         10.8.0.6  255.255.255.255            在链路上          10.8.0.6    276
         10.8.0.7  255.255.255.255            在链路上          10.8.0.6    276
      192.168.0.0    255.255.255.0         10.8.0.5         10.8.0.6     20
...

问题

  • 连接到VPN服务端的机器是没有问题,但是不能访问该机器的应用(端口不同)

被防火墙限制了,在服务端把10.8.0.0/24加入到防火墙允许。

1
iptables -A INPUT -s 10.8.0.0/24 -j ACCEPT  # 反正能访问OpenVPN的端口即可
  • 不能访问服务端其他机器

在iptables上增加转发

1
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

centos7 firewall:(注:在centos7上面一样可以用上面的iptables命令!! https://www.centos.org/forums/viewtopic.php?t=53819)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ firewall-cmd --permanent --add-masquerade 
查看写入的内容: cat zones/public.xml

$ firewall-cmd --permanent --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE 
查看写入的内容: cat /etc/firewalld/direct.xml

$ firewall-cmd --reload


https://www.server-world.info/en/note?os=CentOS_7&p=firewalld&f=2
http://www.mjhall.org/centos7-firewalld-nat-router/
https://www.centos.org/forums/viewtopic.php?t=53819

#如果防火墙默认是reject,需要增加
# #开放主机IP firewall-cmd --permanent --zone=trusted --add-source=192.168.2.0/24
[root@bigdata-dev ~]# firewall-cmd --zone=public --add-port=1194/tcp --permanent
success
[root@bigdata-dev ~]# firewall-cmd --reload
success

查看iptables规则:

1
iptables -nL -t nat

测试下:

1
2
3
4
5
$ ping cu3

正在 Ping cu3 [192.168.0.148] 具有 32 字节的数据:
来自 192.168.0.148 的回复: 字节=32 时间=5ms TTL=63
来自 192.168.0.148 的回复: 字节=32 时间=5ms TTL=63

其他(未实践,记录下来)

必须在服务器端的内网网关上将到10.8.0.0/24网段的路由指向到openvpn服务器,不然从服务器端内网其他机器根本找不到去往10.8.0.0/24网段的路由。这里又分两种情况,一种是服务端有内网网关设备的(按如上说法即可);一种是服务端内网没有网关设备,即服务器通过交换机相连,相互通讯靠广播的情况。我的就是这种情况。需要在想访问的server上增加到10.8.0.0/24的路由,如下

route add -net 10.8.0.0/24 gw 192.168.1.211 #1.211为openvpn服务器的内网IP

Make sure that you’ve enabled IP and TUN/TAP forwarding on the OpenVPN server machine. 确定开启了转发功能,然后在openvpn服务器Iptables添加如下两条规则

iptables -A FORWARD -i tun0 -s 10.8.0.0/24 -j ACCEPT #简单说,允许数据从客户端到后端server iptables -A FORWARD -i em2 -d 10.8.0.0/24 -j ACCEPT #允许数据从后端server到客户端

参考

–END

Comments