标签归档:CentOS

如何快速在CentOS7上部署VPN服务器

简介

IKEv2,是一款全新的IPSec VPN协议,相较之前的版本,支持终端在不同的网络之间切换,连接也更加稳定可靠。目前主流操作系统,包括Windows 7及以后的版本,MAC OS, iOS等,都已经预装的官方的VPN客户端。

本文介绍如何在CentOS 7服务器上安装配置Strongswan VPN服务器软件。

安装StrongSwan

Strongswan是一款开源的IPSec软件,我们用它来配置我们的VPN服务器。在终端里执行以下命令,安装Strongswan套件。

sudo yum -y install epel-release
sudo yum install -y strongswan

自签发证书

拨入VPN服务器需要使用证书来认证。我们可以使用Strongswan自带的PKI工具来生成CA证书,服务器证书及密钥。所有这些证书文件都保存在 /etc/strongswan/ipsec.d/目录下。

第一步是生成CA密钥。

sudo strongswan pki --gen --type rsa --size 4096 --outform pem > \
         /etc/strongswan/ipsec.d/private/ca-key.pem

接下来使用CA密钥生成CA证书,下面命令行中“VPN root CA”是签发机构名称,可以替换成任何字符串。

sudo strongswan pki --ca --lifetime 3650 \
        --in /etc/strongswan/ipsec.d/private/ca-key.pem \
        --type rsa --dn "CN=VPN root CA" --outform pem > \
        /etc/strongswan/ipsec.d/cacerts/ca-cert.cer

同样的方式,我们再生成服务器密钥。

sudo strongswan pki --gen --type rsa --size 4096 --outform pem > \
         /etc/strongswan/ipsec.d/private/server-key.pem

 然后用刚才生成的服务器密钥,CA密钥和证书,签发服务器证书。你需要替换下面段落中服务器的域名。

sudo strongswan pki --pub --type rsa \
        --in /etc/strongswan/ipsec.d/private/server-key.pem  \
    | sudo strongswan pki --issue --lifetime 3600 \
        --cacert /etc/strongswan/ipsec.d/cacerts/ca-cert.cer \
        --cakey /etc/strongswan/ipsec.d/private/ca-key.pem \
        --dn "CN=vpn.mydomain.com" --san vpn.mydomain.com \
        --flag serverAuth --flag ikeIntermediate --outform pem \
    >  /etc/strongswan/ipsec.d/certs/server-cert.cer

配置VPN服务器

Strongswan有两个文件,一个是配置文件/etc/strongswan/ipsec.conf, 另一个是密钥文件 /etc/strongswan/ipsec.secrets。使用你熟悉的编辑器对这些文件直接修改。

/etc/strongswan/ipsec.conf
# ipsec.conf - strongSwan IPsec configuration file

# basic configuration

config setup
    charondebug="ike 1, knl 1, cfg 1"
    uniqueids=no

conn %default
    left=%any
    # Windows requires aes256-sha1-modp1024 to be placed in the 1st position
    # these lines end without '!' to append default crypto suites automatically
    ike=aes256-sha1-modp1024
    esp=aes256-sha1
    compress=no
    type=tunnel
    fragmentation=yes
    forceencaps=yes
    dpddelay=300s
    dpdtimeout=30s
    dpdaction=restart
    forceencaps=yes
    ikelifetime=4h
    lifetime=2h

conn ras-winlinux
    eap_identity=%identity
    auto=add
    rekey=no
    dpdaction=clear
    leftid=%any
    leftcert=server-cert.cer
    leftsendcert=always
    leftsubnet=0.0.0.0/0
    right=%any
    rightid=%any
    rightauth=eap-mschapv2
    rightsourceip=10.255.255.1/24
    rightdns=8.8.8.8,8.8.4.4
    rightsendcert=never

conn ras-apple
    also=ras-winlinux
    [email protected]
参数说明
  1. ike, esp: 这两个参数是设置密码算法的,由于Windows的bug原因,必须把上述范例里的这两个算法放在最前面。
  2. leftsubnet: IKEv2支持split tunnel,也就是本地流量走本地,远端流量走服务器。如果要让所有互联网流量走服务器,就要配置为0.0.0.0/0,否则配置为远端目标网段,例如192.168.100.0/24。
  3. rightsourceip,VPN客户端动态分配的地址池。
  4. rightdns,VPN客户端使用的DNS服务器地址,只在leftsubnet为0.0.0.0/0才有意义。
  5. leftid,对应苹果客户端要求设置的remote id,一般都配置为服务器的域名,也可以是任何字符串。
/etc/strongswan/ipsec.secrets
# ipsec.secrets - strongSwan IPsec secrets file

# roadwarrior user accounts 

 : RSA server-key.pem

user1  : EAP "userpassword1"

配置防火墙

我们需要配置防火墙策略实现以下目的:

  1. 允许IPSec相关流量进入;
  2. 允许转发客户端流量,并对客户端IP进行地址转换;
  3. 对TCP包设置最大包大小,避免大包碎片化造成性能下降;

首先修改/etc/sysctl.conf,允许转发。

sudo echo "# VPN forwarding setup
net.ipv4.ip_forward = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0" >> /etc/sysctl.conf
sudo sysctl -p

接下来设置防火墙策略,允许IPSec流量进入。

sudo firewall-cmd --zone=public --add-service=ipsec
sudo firewall-cmd --zone=public --add-port=4500/udp

设置出口地址转换,让远端客户端可以使用服务器IP访问相关资源。

sudo firewall-cmd --zone=public --add-masquerade

增加一条防火墙策略,允许转发客户端流量,注意下面的网段需要和ipsec.conf里的设置一致。

sudo firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -s 10.255.255.0/24 -j ACCEPT

设置TCP MSS(最大报文段长度),避免过多的碎片包影响性能。一般我们可以设置TCP大小在360字节左右,如果再考虑某些使用GRE隧道的情况,建议设置在1300字节更保险。

sudo firewall-cmd --direct --add-passthrough ipv4 -t mangle \
            -I FORWARD -p tcp --syn -j TCPMSS --set-mss 1300

最后,将新配置的策略永久保存,下次重启时firewalld会自动装载。

sudo firewall-cmd --runtime-to-permanent

测试

接下来我们开始测试,先启用StrongSwan服务。

sudo systemctl enable strongswan
sudo systemctl start strongswan

查看证书是否正确装载。

sudo strongswan listcerts

显示所有连接状态。

sudo strongswan statusall

  如果无法正常建立连接,日志是一个非常有用的工具。

sudo tail -f -n 200 /var/log/messages