百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术教程 > 正文

使用OpenVPN搭建Linux下的VPN服务

csdh11 2024-12-16 11:48 4 浏览

一、原理

OpenVPN是基于SSL的VPN,其使用工业标准的SSL/TLS协议实现第2层和第3层的安全数据链路VPN。最新版本是2.0.7,其优点包括:

1、基于SSL协议,安全,并使用单一TCP或UDP端口即可实现;

2、使用双向验证,服务器只需保存自己的证书和密钥;

3、服务器只接受那些由主CA证书签名的客户端,并有撤回机制,而不需要重建整个PKI;

4、可以实现基于Common Name的权限控制。

※注意,OpenVPN是基于SSL/TLS协议的,所以是不兼容IPSec和PPTP,在Windows也需要安装客户端

二、网络架构

OpenVPN可以实现多点对单点,以及点对点的VPN功能。今天我们先以一个简单的案例来说明,后续再详细描述更深入的配置。

架构如下

说明:

1、远程客户端通过Internet网络连接到公司网络(模拟成192.168.228.0网段),并建立10.8.0.0的VPN通道;

2、公司内部网络为192.168.56.0网段,假设只有一台主机;

3、目标是客户端和后台主机可以双向互通。

三、安装和配置

假设客户端和服务端都是Linux系统,如下:

服务器平台: 红旗 DC Server 5.0 for x86

客户端平台: 红旗 Desktop 5.0 for x86

1、服务端安装

rpm -ivh lzo-1.08-4.redflag.i386.rpm

rpm -ivh openvpn-2.0.7-2.redflag.i386.rpm

1)示例配置文件在:

引用

/usr/share/doc/openvpn-2.0.7/

2)拷贝创建CA证书的easy-rsa:

cp -ra /usr/share/doc/openvpn-2.0.7/easy-rsa /etc/openvpn/

3)拷贝示例配置文件

cd /etc/openvpn/

mkdir config

cp -ra /usr/share/doc/openvpn-2.0.7/sample-config-files/server.conf config/

ln -s config/server.conf ./

※如果您今后希望Openvpn随系统自动启动,则它会自动寻找/etc/openvpn下的所有.conf配置文件,并运行。所以,我这里先建立对应的链接了。

4)修改证书变量

cd easy-rsa

vi vars

根据您的实际情况,修改下面的变量:

引用

export KEY_COUNTRY=GZ

export KEY_PROVINCE=GuangDong

export KEY_CITY=GuangZhou

export KEY_ORG="RFGZ"

export KEY_EMAIL="linuxing@linuxfly.org"

※这些变量在今后会用到,若修改,则必须重建所有的PKI。

5)初始化PKI

source vars

chmod +x clean-all

./clean-all

※小心,一旦运行clean-all,它会删除keys下的所有证书。

chmod +x build-ca

./build-ca

(Common Name可以自己定义,我这里用OpenVPN-CA)

6)创建服务器的证书和密钥

chmod +x build-key-server

./build-key-server server

(Common Name必须填写server,其余默认即可)

7)创建客户端的证书和密钥

chmod +x build-key

./build-key client1

./build-key client2

(假设创建两个客户端,Common Name对应填写client1和client2,其作为今后识别客户端的标识)


8)创建Diffie Hellman 参数

Diffie Hellman 用于增强安全性,在OpenVPN是必须的:

chmod +x build-dh

./build-dh

(时间比较常,若你修改了vars文件中的KEY_SIZE=1024,则时间会更长些)

9)修改配置文件

cd /etc/openvpn

vi server.conf

引用

# 2006-08-11 由linuxing编写

# #号和;号开头的都是注释

# 设置监听IP,默认是监听所有IP

;local a.b.c.d

local 192.168.228.155

# 设置监听端口,必须要对应的在防火墙里面打开

port 1194

# 设置用TCP还是UDP协议?

;proto tcp

proto udp

# 设置创建tun的路由IP通道,还是创建tap的以太网通道

# 路由IP容易控制,所以推荐使用它;但如果如IPX等必须

# 使用第二层才能通过的通讯,则可以用tap方式,tap也

# 就是以太网桥接

;dev tap

dev tun

# Windows需要给网卡一个名称,这里设置,linux不需要

;dev-node MyTap

# 这里是重点,必须指定SSL/TLS root certificate (ca),

# certificate(cert), and private key (key)

# ca文件是服务端和客户端都必须使用的,但不需要ca.key

# 服务端和客户端指定各自的.crt和.key

# 请注意路径,可以使用以配置文件开始为根的相对路径,

# 也可以使用绝对路径

# 请小心存放.key密钥文件

ca ./easy-rsa/keys/ca.crt

cert ./easy-rsa/keys/server.crt

key ./easy-rsa/keys/server.key # This file should be kept secret

# 指定Diffie hellman parameters.

dh ./easy-rsa/keys/dh1024.pem

# 配置VPN使用的网段,OpenVPN会自动提供基于该网段的DHCP

# 服务,但不能和任何一方的局域网段重复,保证唯一

server 10.8.0.0 255.255.255.0

# 维持一个客户端和virtual IP的对应表,以方便客户端重新

# 连接可以获得同样的IP

ifconfig-pool-persist ipp.txt

# 配置为以太网桥模式,但需要使用系统的桥接功能

# 这里不需要使用

;server-bridge 10.8.0.4 255.255.255.0 10.8.0.50 10.8.0.100

# 为客户端创建对应的路由,以另其通达公司网内部服务器

# 但记住,公司网内部服务器也需要有可用路由返回到客户端

;push "route 192.168.20.0 255.255.255.0"

push "route 192.168.56.0 255.255.255.0"

# 为特定的客户端指定IP或指定路由,该路由通常是客户端后面的

# 内网网段,而不是服务端连接的网段

# ccd是/etc/openvpn下的目录,其中建有希望限制的客户端Common

# Name为文件名的文件,并通过下面的命令写入固定IP地址

# 例如Common Name为client1,则在/etc/openvpn/ccd/client1写有:

# ifconfig-push 10.9.0.1 10.9.0.2

;client-config-dir ccd

;route 192.168.40.128 255.255.255.248

# 为可以对不同的客户端设置防火墙等权限

# 可以让其自动运行对应脚本,可参考man

;learn-address ./script

# 若客户端希望所有的流量都通过VPN传输,则可以使用该语句

# 其会自动改变客户端的网关为VPN服务器,推荐关闭

# 一旦设置,请小心服务端的DHCP设置问题

;push "redirect-gateway"

# 用OpenVPN的DHCP功能为客户端提供指定的DNS、WINS等

;push "dhcp-option DNS 10.8.0.1"

;push "dhcp-option WINS 10.8.0.1"

# 默认客户端之间是不能直接通讯的,除非把下面的语句注释掉

client-to-client

# 如果您希望有相同Common Name的客户端都可以登陆

# 也可以注释下面的语句,推荐每个客户端都使用不用的Common Name

# 常用于测试

;duplicate-cn

# 设置服务端检测的间隔和超时时间

keepalive 10 120

# 下面是一些对安全性增强的措施,后续说明吧

# For extra security beyond that provided

# by SSL/TLS, create an "HMAC firewall"

# to help block DoS attacks and UDP port flooding.

#

# Generate with:

# openvpn --genkey --secret ta.key

#

# The server and each client must have

# a copy of this key.

# The second parameter should be 0

# on the server and 1 on the clients.

;tls-auth ta.key 0 # This file is secret

# Select a cryptographic cipher.

# This config item must be copied to

# the client config file as well.

;cipher BF-CBC # Blowfish (default)

;cipher AES-128-CBC # AES

;cipher DES-EDE3-CBC # Triple-DES

# 使用lzo压缩的通讯,服务端和客户端都必须配置

comp-lzo

# 设置最大用户数

;max-clients 100

# 让OpenVPN以nobody用户和组来运行(安全)

;user nobody

;group nobody

# The persist options will try to avoid

# accessing certain resources on restart

# that may no longer be accessible because

# of the privilege downgrade.

persist-key

persist-tun

# 输出短日志,每分钟刷新一次,以显示当前的客户端

status /var/log/openvpn/openvpn-status.log

# 缺省日志会记录在系统日志中,但也可以导向到其他地方

# 建议调试的使用先不要设置,调试完成后再定义

;log /var/log/openvpn/openvpn.log

;log-append /var/log/openvpn/openvpn.log

# 设置日志的级别

#

# 0 is silent, except for fatal errors

# 4 is reasonable for general usage

# 5 and 6 can help to debug connection problems

# 9 is extremely verbose

verb 3

# Silence repeating messages. At most 20

# sequential messages of the same message

# category will be output to the log.

;mute 20

# 打开管理界面,可以定义监控的IP和端口

management localhost 7505

※几个需要注意的地方:

a.定义tun为使用路由方式的VPN

b.小心处理证书的路径,.key文件要保存好,特别是ca.key。

(ca.key不需要在OpenVPN中用到,可以另外保存)

2、客户端安装

客户端的安装比较简单:

1、服务端安装

rpm -ivh lzo-1.08-4.redflag.i386.rpm

rpm -ivh openvpn-2.0.7-2.redflag.i386.rpm

1)示例配置文件在:

引用

/usr/share/doc/openvpn-2.0.7/

2)从服务器拷贝客户端的证书到客户端

首先在服务器上准备好需要的文件:

cd /etc/openvpn/easy-rsa/keys

tar czvf client1.tar.gz ca.crt client1.crt client1.key

scp client1.tar.gz 192.168.228.201:/etc/openvpn

然后客户端解压即可:

cd /etc/openvpn

mkdir -p easy-rsa/keys

tar xzvf client1.tar.gz

3)拷贝示例配置文件

mkdir config

cp -ra /usr/share/doc/openvpn-2.0.7/sample-config-files/client.conf config/

ln -s config/client.conf ./

4)修改配置文件

cd /etc/openvpn

vi client.conf

引用

# 2006-08-11 由linuxing编写

# #号和;号都是注释

# 定义是一个客户端

client

# 定义使用路由IP模式,与服务端一致

;dev tap

dev tun

# 定义Windows下使用的网卡名称,linux不需要

;dev-node MyTap

# 定义使用的协议,与服务端一致

;proto tcp

proto udp

# 指定服务端地址和端口,可以用多行指定多台服务器

# 实现负载均衡(从上往下尝试)

remote 192.168.228.155 1194

;remote my-server-2 1194

# 若上面配置了多台服务器,让客户端随机连接

;remote-random

# 解析服务器域名

# Keep trying indefinitely to resolve the

# host name of the OpenVPN server. Very useful

# on machines which are not permanently connected

# to the internet such as laptops.

resolv-retry infinite

# 客户端不需要绑定端口

# Most clients do not need to bind to

# a specific local port number.

nobind

# 也是为了让Openvpn也nobody运行(安全)

# 注意:Windows不能设置

;user nobody

;group nobody

# Try to preserve some state across restarts.

persist-key

persist-tun

# 若客户端通过HTTP Proxy,在这里设置

# 要使用Proxy,不能使用UDP为VPN的通讯协议

;http-proxy-retry # retry on connection failures

;http-proxy [proxy server] [proxy port #]

# 无线网络有很多多余的头文件,设置忽略它

;mute-replay-warnings

# 重点,就是指定ca和客户端的证书

ca ./easy-rsa/keys/ca.crt

cert ./easy-rsa/keys/client1.crt

# 如果服务端打开了PAM认证模块,客户端需要另其有效

;auth-user-pass

# 一些安全措施

# Verify server certificate by checking

# that the certicate has the nsCertType

# field set to "server". This is an

# important precaution to protect against

# a potential attack discussed here:

# http://openvpn.net/howto.html#mitm

#

# To use this feature, you will need to generate

# your server certificates with the nsCertType

# field set to "server". The build-key-server

# script in the easy-rsa folder will do this.

;ns-cert-type server

# If a tls-auth key is used on the server

# then every client must also have the key.

;tls-auth ta.key 1

# Select a cryptographic cipher.

# If the cipher option is used on the server

# then you must also specify it here.

;cipher x

# 使用lzo压缩,与服务端一致

comp-lzo

# Set log file verbosity.

verb 3

# Silence repeating messages

;mute 20

3、启动服务

1)先启动服务端

cd /etc/openvpn

openvpn server.conf &

2)然后启动客户端

cd /etc/openvpn

openvpn client.conf &

3)使用ifconfig,可以看到VPN通道已经建立:

server端:


4)测试

server端:

client端:

※注意,每个虚拟tun网卡都是成对的,只有inet addr标识的才是用于VPN通讯。并且必须在/30网段中,详见附录。

4、建立路由

其实到这里,OpenVPN部分的工作已经完成。服务端和客户端的通讯已经正常。但常见一个问题,就是客户端虽然可以访问到192.168.56.129,但却不能访问公司网内部的192.168.228.128服务器。

原因很简单,因为通讯是双方的,192.168.228.128没有到10.8.0.0网段的路由,有几种可能:

a、VPN服务器与公司网的网关不是同一台机器,解决办法是在公司网网关上设置到10.8.0.0网段的路由,接口是VPN服务器网卡;

b、192.168.56.128没有设置默认网关,解决办法是设置默认网关就是VPN服务器,或已经做了1配置的公司网网关;

c、有防火墙屏蔽。

对于本示例中只有一台192.168.56.128,可以这样做:

1)原路由表

2)增加路由

route add -net 10.8.0.0 netmask 255.255.255.0 gw 192.168.56.129 dev eth0

路由表

3)或增加默认网关

route add default gw 192.168.56.129

路由表

※当然,实际应用中不应该出现这样手动配置路由的情况。应该对公司网内部做好统一管理,以避免类似的问题。

四、附录

1、示例配置文件可以从这里下载:

服务端

客户端

2、为了兼容Windows的TAP驱动,所以每对tun都必须在/30子网中,如下列表:

引用

[ 1, 2] [ 5, 6] [ 9, 10] [ 13, 14] [ 17, 18]

[ 21, 22] [ 25, 26] [ 29, 30] [ 33, 34] [ 37, 38]

[ 41, 42] [ 45, 46] [ 49, 50] [ 53, 54] [ 57, 58]

[ 61, 62] [ 65, 66] [ 69, 70] [ 73, 74] [ 77, 78]

[ 81, 82] [ 85, 86] [ 89, 90] [ 93, 94] [ 97, 98]

[101,102] [105,106] [109,110] [113,114] [117,118]

[121,122] [125,126] [129,130] [133,134] [137,138]

[141,142] [145,146] [149,150] [153,154] [157,158]

[161,162] [165,166] [169,170] [173,174] [177,178]

[181,182] [185,186] [189,190] [193,194] [197,198]

[201,202] [205,206] [209,210] [213,214] [217,218]

[221,222] [225,226] [229,230] [233,234] [237,238]

[241,242] [245,246] [249,250] [253,254]

3、OpenVPN安装后会自动加载到系统服务中,并启动。可以手动关闭:

chkconfig openvpn off

4、如果已经打开防火墙,在使用OpenVPN的时候必须让其通过

iptables -A INPUT -i tun+ -j ACCEPT

iptables -A FORWARD -i tun+ -j ACCEPT

iptables -A INPUT -i tap+ -j ACCEPT

iptables -A FORWARD -i tap+ -j ACCEPT

5、OpenVPN功能很强大,更多的配置请见后面的介绍。

相关推荐

Micheal Nielsen's神经网络学习之二

依然是跟着MichaelNielsen的神经网络学习,基于前一篇的学习,已经大概明白了神经网络的基本结构和BP算法,也能通过神经网络训练数字识别功能,之后我试验了一下使用神经网络训练之前的文本分类,...

CocoaPods + XCTest进行单元测试 c单元测试工具

在使用XCTest进行单元测试时,我们经常会遇到一些CocoaPods中的开源框架的调用,比如“Realm”或“Alamofire”在测试的时候,如果配置不当,会导致“frameworknotfo...

Java基础知识回顾第四篇 java基础讲解

1、&和&&的区别作为逻辑运算符:&(不管左边是什么,右边都参与运算),&&(如果左边为false,右边则不参与运算,短路)另外&可作为位运算符...

项目中的流程及类似业务的设计模式总结

说到业务流程,可能是我做过的项目中涉及业务最多的一个方面了。除了在流程设计之外,在一些考核系统、产业审批、还有很多地方,都用到相似的设计思路,在此一并总结一下。再说到模式,并不是因为流行才用这个词,而...

联想三款显示器首批获得 Eyesafe Certified 2.0 认证

IT之家7月31日消息,据外媒报道,三款全新联想显示器是全球首批满足EyesafeCertified2.0的设备。据报道,联想获得EyesafeCertified2.0认证的显...

maven的生命周期,插件介绍(二) 一个典型的maven构建生命周期

1.maven生命周期一个完整的项目构建过程通常包括清理、编译、测试、打包、集成测试、验证、部署等步骤,Maven从中抽取了一套完善的、易扩展的生命周期。Maven的生命周期是抽象的,其中的具体任务都...

多线程(3)-基于Object的线程等待与唤醒

概述在使用synchronized进行线程同步中介绍了依赖对象锁定线程,本篇文章介绍如何依赖对象协调线程。同synchronized悲观锁一样,线程本身不能等待与唤醒,也是需要对象才能完成等待与唤醒的...

jquery mobile + 百度地图 + phonegap 写的一个"校园助手"的app

1jquerymobile+百度地图+phonegap写的一个"校园助手"的app,使用的是基于Flat-UI的jQueryMobile,请参考:https://github.com/...

Apache 服务启动不了 apache系统服务启动不了

{我是新手,从未遇到此问题,请各位大大勿喷}事由:今天早上上班突然发现公司网站出现问题。经过排查,发现是Apache出现问题。首先检查配置文件没有出问题后,启动服务发现Apache服务能启动,但是没法...

健康债和技术债都不能欠 公众号: 我是攻城师(woshigcs)

在Solr4.4之后,Solr提供了SolrCloud分布式集群的模式,它带来的主要好处是:(1)大数据量下更高的性能(2)更好扩展性(3)更高的可靠性(4)更简单易用什么时候应该使用Sol...

Eye Experience怎么用?HTC告诉你 eyebeam怎么用

IT之家(www.ithome.com):EyeExperience怎么用?HTC告诉你HTC上周除了发布HTCDesireEYE自拍机和HTCRE管状运动相机之外,还发布了一系列新的智能手机...

Android系统应用隐藏和应用禁止卸载

1、应用隐藏与禁用Android设置中的应用管理器提供了一个功能,就是【应用停用】功能,这是针对某些系统应用的。当应用停用之后,应用的图标会被隐藏,但apk还是存在,不会删除,核心接口就是Packag...

计算机软件技术分享--赠人玫瑰,手遗余香

一、Netty介绍Netty是由JBOSS提供的一个java开源框架。Netty提供异步的、事件驱动的网络应用程序框架和工具,用以快速开发高性能、高可靠性的网络服务器和客户端程序。也就是说,Netty...

Gecco爬虫框架的线程和队列模型 爬虫通用框架

简述爬虫在抓取一个页面后一般有两个任务,一个是解析页面内容,一个是将需要继续抓取的url放入队列继续抓取。因此,当爬取的网页很多的情况下,待抓取url的管理也是爬虫框架需要解决的问题。本文主要说的是g...

一点感悟(一) 初识 初读感知的意思

时间过得很快,在IT业已从业了两年多。人这一辈子到底需要什么,在路边看着人来人往,大部分人脸上都是很匆忙。上海真是一个魔都,它有魅力,有底蕴,但是一个外地人在这里扎根置业,真的是举全家之力,还贷3...