• 欢迎来到小爱博客,一个分享互联网IT技术的网站,喜欢就收藏吧!

ubuntu openvpn服务端部署和配置

openvpn 小爱 2个月前 (08-21) 64次浏览 已收录 0个评论 扫描二维码

如果您不仅需要预共享密钥,则OpenVPN可以轻松设置公共密钥基础结构(PKI)以使用SSL / TLS证书进行VPN服务器和客户端之间的身份验证和密钥交换。OpenVPN可以在路由或桥接VPN模式下使用,并且可以配置为使用UDP或TCP。端口号也可以配置,但是端口1194是官方端口号。该单个端口用于所有通信。VPN客户端实现几乎可用于所有内容,包括所有Linux发行版,OS X,Windows和基于OpenWRT的WLAN路由器。

服务器安装

要在终端中安装openvpn,请输入:

sudo apt install openvpn easy-rsa

公钥基础结构设置

建立OpenVPN配置的第一步是建立PKI(公钥基础结构)。PKI包括:

  • 服务器和每个客户端的单独证书(也称为公钥)和私钥。
  • 主证书颁发机构(CA)证书和密钥,用于对服务器和客户端证书进行签名。

OpenVPN支持基于证书的双向身份验证,这意味着在建立相互信任之前,客户端必须对服务器证书进行身份验证,并且服务器必须对客户端证书进行身份验证。

服务器和客户端都将通过首先验证提供的证书已由主证书颁发机构(CA)签名,然后通过测试现在已认证的证书头中的信息(例如,证书通用名或证书类型)来对彼此进行身份验证。或服务器)。

证书颁发机构设置

要设置自己的证书颁发机构(CA)并为OpenVPN服务器和多个客户端生成证书和密钥,请首先将该easy-rsa目录复制到/etc/openvpn。这将确保更新软件包时不会丢失对脚本的任何更改。在终端上,运行:

sudo make-cadir /etc/openvpn/easy-rsa

注意:如果需要,您也可以/etc/openvpn/easy-rsa/vars直接编辑,以根据需要进行调整。

root用户切换到新创建的目录/etc/openvpn/easy-rsa并运行时:

./easyrsa init-pki
./easyrsa build-ca

服务器密钥和证书

接下来,我们将为服务器生成一个密钥对:

./easyrsa gen-req myservername nopass

必须为OpenVPN服务器生成Diffie Hellman参数。以下将它们放置在中pki/dh.pem

./easyrsa gen-dh

最后是服务器的证书:

./easyrsa gen-req myservername nopass
./easyrsa sign-req server myservername

所有证书和密钥均已在子目录中生成。常见的做法是将它们复制到/ etc / openvpn /:

cp pki/dh.pem pki/ca.crt pki/issued/myservername.crt pki/private/myservername.key /etc/openvpn/

客户证书

VPN客户端也将需要证书来向服务器进行身份验证。通常,您为每个客户端创建一个不同的证书。

这可以在服务器上完成(如上面的密钥和证书),然后安全地分发到客户端。反之亦然:客户端可以生成并提交由服务器发送并签名的请求。

要创建证书,请以root用户身份在终端中输入以下内容:

./easyrsa gen-req myclient1 nopass
./easyrsa sign-req client myclient1

如果上面的第一个命令是在远程系统上完成的,则将.req文件复制到CA服务器。在那里,您可以通过导入它easyrsa import-req /incoming/myclient1.req myclient1。然后,您可以继续执行第二个sign-eq命令。

在两种情况下,之后都使用安全方法将以下文件复制到客户端:

  • pki/ca.crt
  • pki/issued/myclient1.crt

由于客户端证书和密钥仅在客户端计算机上是必需的,因此可以将其从服务器中删除。

简单服务器配置

在安装OpenVPN的同时,您还获得了以下示例配置文件(如果您检查的话,还有更多):

root@server:/# ls -l /usr/share/doc/openvpn/examples/sample-config-files/
total 68
-rw-r--r-- 1 root root 3427 2011-07-04 15:09 client.conf
-rw-r--r-- 1 root root 4141 2011-07-04 15:09 server.conf.gz

首先将server.conf.gz复制并解压缩到/etc/openvpn/server.conf。

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz /etc/openvpn/myserver.conf.gz
sudo gzip -d /etc/openvpn/myserver.conf.gz

编辑/etc/openvpn/myserver.conf以确保以下行指向您在上一节中创建的证书和密钥。

ca ca.crt
cert myservername.crt
key myservername.key
dh dh2048.pem

使用etc/openvpntls-auth 的ta键完成此设置,例如:

sudo openvpn --genkey --secret ta.key

编辑/etc/sysctl.conf并取消注释以下行以启用IP转发。

#net.ipv4.ip_forward=1

然后重新加载sysctl。

sudo sysctl -p /etc/sysctl.conf

这是您必须配置才能获得可用的OpenVPN服务器的最低要求。您可以使用示例server.conf文件中的所有默认设置。现在启动服务器。

请注意,“systemctl启动OpenVPN的”不是开始您的OpenVPN刚刚定义。
Openvpn使用模板化的systemd作业,openvpn @ CONFIGFILENAME。因此,例如,如果您的配置文件是myserver.conf您的服务,则称为openvpn @ myserver。您可以对像openvpn @ server这样的模板服务运行各种服务和systemctl命令,例如启动/停止/启用/禁用/预设。

$ sudo systemctl start openvpn@myserver

您将在日志中找到日志记录和错误消息。例如,如果启动了模板化服务 openvpn @ server,则可以使用以下方法对此特定消息源进行过滤:

sudo journalctl -u openvpn@myserver -xe

相同的模板化方法适用于所有systemctl:

$ sudo systemctl status openvpn@myserver
openvpn@myserver.service - OpenVPN connection to myserver
   Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-10-24 10:59:25 UTC; 10s ago
     Docs: man:openvpn(8)
           https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
           https://community.openvpn.net/openvpn/wiki/HOWTO
 Main PID: 4138 (openvpn)
   Status: "Initialization Sequence Completed"
    Tasks: 1 (limit: 533)
   Memory: 1.0M
   CGroup: /system.slice/system-openvpn.slice/openvpn@myserver.service
           └─4138 /usr/sbin/openvpn --daemon ovpn-myserver --status /run/openvpn/myserver.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/myserver.conf --writepid /run/

Oct 24 10:59:26 eoan-vpn-server ovpn-myserver[4138]: /sbin/ip addr add dev tun0 local 10.8.0.1 peer 10.8.0.2
Oct 24 10:59:26 eoan-vpn-server ovpn-myserver[4138]: /sbin/ip route add 10.8.0.0/24 via 10.8.0.2
Oct 24 10:59:26 eoan-vpn-server ovpn-myserver[4138]: Could not determine IPv4/IPv6 protocol. Using AF_INET
Oct 24 10:59:26 eoan-vpn-server ovpn-myserver[4138]: Socket Buffers: R=[212992->212992] S=[212992->212992]
Oct 24 10:59:26 eoan-vpn-server ovpn-myserver[4138]: UDPv4 link local (bound): [AF_INET][undef]:1194
Oct 24 10:59:26 eoan-vpn-server ovpn-myserver[4138]: UDPv4 link remote: [AF_UNSPEC]
Oct 24 10:59:26 eoan-vpn-server ovpn-myserver[4138]: MULTI: multi_init called, r=256 v=256
Oct 24 10:59:26 eoan-vpn-server ovpn-myserver[4138]: IFCONFIG POOL: base=10.8.0.4 size=62, ipv6=0
Oct 24 10:59:26 eoan-vpn-server ovpn-myserver[4138]: IFCONFIG POOL LIST
Oct 24 10:59:26 eoan-vpn-server ovpn-myserver[4138]: Initialization Sequence Completed

您可以在一个系统上启用/禁用各种openvpn服务,但也可以让Ubuntu为您完成。有配置为AUTOSTART/etc/default/openvpn。允许的值为VPN名称的“全部”,“无”或以空格分隔的列表。如果为空,则假定为“全部”。VPN名称是指VPN配置文件的名称。也就是说home/etc/openvpn/home.conf如果正在运行systemd,则更改此变量将需要运行,systemctl daemon-reload然后重新启动 openvpn服务(如果删除了条目,则可能必须手动停止这些条目)。

在“ systemctl daemon-reload”之后,重新启动“通用” openvpn将重新启动当您调用daemon-reload时,/ lib / systemd / system-generators / openvpn-generator中的conf文件为该conf文件创建的所有依赖服务。

现在检查OpenVPN是否创建了tun0接口:

root@server:/etc/openvpn# ip addr show dev tun0
5: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::b5ac:7829:f31e:32c5/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

简单客户端配置

有和没有GUI的各种不同的OpenVPN客户端实现。您可以在后面的“ VPN客户端”中阅读有关客户端的更多信息。现在,我们为Ubuntu使用基于命令行/服务的OpenVPN客户端,该客户端与服务器是同一软件包的一部分。因此,您必须openvpn在客户端计算机上再次安装该软件包:

sudo apt install openvpn

这次将client.conf示例配置文件复制到/ etc / openvpn /:

sudo cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/

将您在上一节中创建的以下客户端密钥和证书文件复制到/ etc / openvpn /中,然后进行编辑/etc/openvpn/client.conf以确保以下行指向这些文件。如果文件在/ etc / openvpn /中,则可以省略路径。

ca ca.crt
cert myclient1.crt
key myclient1.key
tls-auth ta.key 1

并且您必须指定OpenVPN服务器名称或地址。确保关键字client在配置中。这就是启用客户端模式的原因。

client
remote vpnserver.example.com 1194

现在使用相同的模板化机制启动OpenVPN客户端:

$ sudo systemctl start openvpn@client

您可以像在服务器上一样检查状态:

$ sudo systemctl status openvpn@client
openvpn@client.service - OpenVPN connection to client
   Loaded: loaded (/lib/systemd/system/openvpn@.service; disabled; vendor preset: enabled)
   Active: active (running) since Thu 2019-10-24 11:42:35 UTC; 6s ago
     Docs: man:openvpn(8)
           https://community.openvpn.net/openvpn/wiki/Openvpn24ManPage
           https://community.openvpn.net/openvpn/wiki/HOWTO
 Main PID: 3616 (openvpn)
   Status: "Initialization Sequence Completed"
    Tasks: 1 (limit: 533)
   Memory: 1.3M
   CGroup: /system.slice/system-openvpn.slice/openvpn@client.service
           └─3616 /usr/sbin/openvpn --daemon ovpn-client --status /run/openvpn/client.status 10 --cd /etc/openvpn --script-security 2 --config /etc/openvpn/client.conf --writepid /run/openvp

Oct 24 11:42:36 eoan-vpn-client ovpn-client[3616]: Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
Oct 24 11:42:36 eoan-vpn-client ovpn-client[3616]: Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
Oct 24 11:42:36 eoan-vpn-client ovpn-client[3616]: ROUTE_GATEWAY 192.168.122.1/255.255.255.0 IFACE=ens3 HWADDR=52:54:00:3c:5a:88
Oct 24 11:42:36 eoan-vpn-client ovpn-client[3616]: TUN/TAP device tun0 opened
Oct 24 11:42:36 eoan-vpn-client ovpn-client[3616]: TUN/TAP TX queue length set to 100
Oct 24 11:42:36 eoan-vpn-client ovpn-client[3616]: /sbin/ip link set dev tun0 up mtu 1500
Oct 24 11:42:36 eoan-vpn-client ovpn-client[3616]: /sbin/ip addr add dev tun0 local 10.8.0.6 peer 10.8.0.5
Oct 24 11:42:36 eoan-vpn-client ovpn-client[3616]: /sbin/ip route add 10.8.0.1/32 via 10.8.0.5
Oct 24 11:42:36 eoan-vpn-client ovpn-client[3616]: WARNING: this configuration may cache passwords in memory -- use the auth-nocache option to prevent this
Oct 24 11:42:36 eoan-vpn-client ovpn-client[3616]: Initialization Sequence Completed

在服务器日志上,传入连接如下所示。
您可以看到客户端名称和源地址以及成功/失败消息。

ovpn-myserver[4818]: 192.168.122.114:55738 TLS: Initial packet from [AF_INET]192.168.122.114:55738, sid=5e943ab8 40ab9fed
ovpn-myserver[4818]: 192.168.122.114:55738 VERIFY OK: depth=1, CN=Easy-RSA CA
ovpn-myserver[4818]: 192.168.122.114:55738 VERIFY OK: depth=0, CN=myclient1
ovpn-myserver[4818]: 192.168.122.114:55738 peer info: IV_VER=2.4.7
ovpn-myserver[4818]: 192.168.122.114:55738 peer info: IV_PLAT=linux
ovpn-myserver[4818]: 192.168.122.114:55738 peer info: IV_PROTO=2
ovpn-myserver[4818]: 192.168.122.114:55738 peer info: IV_NCP=2
ovpn-myserver[4818]: 192.168.122.114:55738 peer info: IV_LZ4=1
ovpn-myserver[4818]: 192.168.122.114:55738 peer info: IV_LZ4v2=1
ovpn-myserver[4818]: 192.168.122.114:55738 peer info: IV_LZO=1
ovpn-myserver[4818]: 192.168.122.114:55738 peer info: IV_COMP_STUB=1
ovpn-myserver[4818]: 192.168.122.114:55738 peer info: IV_COMP_STUBv2=1
ovpn-myserver[4818]: 192.168.122.114:55738 peer info: IV_TCPNL=1
ovpn-myserver[4818]: 192.168.122.114:55738 Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, 2048 bit RSA
ovpn-myserver[4818]: 192.168.122.114:55738 [myclient1] Peer Connection Initiated with [AF_INET]192.168.122.114:55738
ovpn-myserver[4818]: myclient1/192.168.122.114:55738 MULTI_sva: pool returned IPv4=10.8.0.6, IPv6=(Not enabled)
ovpn-myserver[4818]: myclient1/192.168.122.114:55738 MULTI: Learn: 10.8.0.6 -> myclient1/192.168.122.114:55738
ovpn-myserver[4818]: myclient1/192.168.122.114:55738 MULTI: primary virtual IP for myclient1/192.168.122.114:55738: 10.8.0.6
ovpn-myserver[4818]: myclient1/192.168.122.114:55738 PUSH: Received control message: 'PUSH_REQUEST'
ovpn-myserver[4818]: myclient1/192.168.122.114:55738 SENT CONTROL [myclient1]: 'PUSH_REPLY,route 10.8.0.1,topology net30,ping 10,ping-restart 120,ifconfig 10.8.0.6 10.8.0.5,peer-id 0,cipher AES-256-GCM' (status=1)
ovpn-myserver[4818]: myclient1/192.168.122.114:55738 Data Channel: using negotiated cipher 'AES-256-GCM'
ovpn-myserver[4818]: myclient1/192.168.122.114:55738 Outgoing Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key
ovpn-myserver[4818]: myclient1/192.168.122.114:55738 Incoming Data Channel: Cipher 'AES-256-GCM' initialized with 256 bit key

您可以检查客户端是否创建了tun0接口:

$ ip addr show dev tun0
4: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fe80::5a94:ae12:8901:5a75/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

检查是否可以ping通OpenVPN服务器:

root@client:/etc/openvpn# ping 10.8.0.1
PING 10.8.0.1 (10.8.0.1) 56(84) bytes of data.
64 bytes from 10.8.0.1: icmp_req=1 ttl=64 time=0.920 ms

注意

OpenVPN服务器始终使用客户端网络中的第一个可用IP地址,并且只有该IP可ping通。例如,如果您为客户端网络掩码配置了/ 24,则将使用.1地址。您在ip addr上面的输出中看到的PtP地址通常不回答ping请求。

查看您的路线:

$ ip route 
default via 192.168.122.1 dev ens3 proto dhcp src 192.168.122.114 metric 100 
10.8.0.1 via 10.8.0.5 dev tun0 
10.8.0.5 dev tun0 proto kernel scope link src 10.8.0.6 
192.168.122.0/24 dev ens3 proto kernel scope link src 192.168.122.114 
192.168.122.1 dev ens3 proto dhcp scope link src 192.168.122.114 metric 100

首次故障排除

如果以上方法都不适合您,请检查以下内容:

  • 检查你的 journal -xe
  • 检查是否在客户端和服务器conf文件中正确指定了密钥文件名
  • 客户端可以连接到服务器计算机吗?也许防火墙阻止了访问?检查服务器上的日志。
  • 客户端和服务器必须使用相同的协议和端口,例如UDP端口1194,请参阅端口和协议配置选项
  • 客户端和服务器必须使用相同的压缩配置,请参阅comp-lzo config选项
  • 客户端和服务器必须对桥接模式和路由模式使用相同的配置,请参阅服务器vs服务器桥配置选项

进阶设定

服务器上的高级路由VPN配置

上面是一个非常简单的工作VPN。客户端可以通过加密隧道访问VPN服务器计算机上的服务。如果要连接更多服务器或其他网络中的任何设备,请向客户端推送一些路由。例如,如果可以将您公司的网络汇总为192.168.0.0/16网络,则可以将此路由推送给客户。但是,您还必须更改返回路径的路由-您的服务器需要知道通往VPN客户端网络的路由。

我们在本指南中使用的示例配置文件以注释和禁用的配置行为例,包含了所有这些高级选项。

注意

请阅读《 OpenVPN 强化安全指南》以获取更多安全建议。

服务器上的高级桥接VPN配置

可以将OpenVPN设置为路由VPN模式或桥接VPN模式。有时,这也称为OSI第2层与第3层VPN。在桥接VPN中,所有第2层帧(例如,所有以太网帧)都发送到VPN伙伴,而在路由VPN中,只有第3层数据包发送到VPN伙伴。在桥接模式下,所有流量(包括传统上是LAN本地的流量,例如本地网络广播,DHCP请求,ARP请求等)都将发送到VPN合作伙伴,而在路由模式下,它将被过滤。

准备用于在服务器上桥接的接口配置

首先,使用netplan使用所需的以太网设备配置桥接设备。

$ cat /etc/netplan/01-netcfg.yaml
network:
    version: 2
    renderer: networkd
    ethernets:
        enp0s31f6:
            dhcp4: no
    bridges:
        br0:
            interfaces: [enp0s31f6]
            dhcp4: no
            addresses: [10.0.1.100/24]
            gateway4: 10.0.1.1
            nameservers:
                addresses: [10.0.1.1]

强烈建议使用静态IP寻址。DHCP寻址也可以,但是您仍然必须在OpenVPN配置文件中编码静态地址。

服务器上的下一步是在启动时将以太网设备配置为混杂模式。为此,请确保已安装networkd-dispatcher软件包并创建以下配置脚本。

sudo apt update
sudo apt install networkd-dispatcher
sudo touch /usr/lib/networkd-dispatcher/dormant.d/promisc_bridge
sudo chmod +x /usr/lib/networkd-dispatcher/dormant.d/promisc_bridge

然后添加以下内容。

#!/bin/sh
set -e
if [ "$IFACE" = br0 ]; then
    # no networkd-dispatcher event for 'carrier' on the physical interface
    ip link set enp0s31f6 up promisc on
fi

准备用于桥接的服务器配置

编辑/etc/openvpn/server.conf以使用tap而不是tun并将服务器设置为使用server-bridge指令:

;dev tun
dev tap
;server 10.8.0.0 255.255.255.0
server-bridge 10.0.0.4 255.255.255.0 10.0.0.128 10.0.0.254

配置服务器后,通过输入以下内容重新启动openvpn:

sudo systemctl restart openvpn@myserver

准备要桥接的客户端配置

与上面概述的桥接模式相比,客户端的唯一区别是您需要编辑/etc/openvpn/client.conf和设置tap模式:

dev tap
;dev tun

最后,重新启动openvpn:

sudo systemctl restart openvpn@client

现在,您应该能够通过VPN连接到完整的远程LAN。


小爱博客 , 版权所有
转载请注明原文链接:ubuntu openvpn服务端部署和配置
喜欢 (0)
【你的支持, 我的动力】
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址