系列文章目录

第一章 PPTP 虚拟专用网络搭建实战:企业级配置指南(全流程问题详解)
第二章 L2TP 虚拟专用网络搭建实战:企业级配置指南(全流程问题详解)



前言

本次实验采用的是天枢一体化仿真靶场平台(感兴趣的可以查看:https://mp.weixin.qq.com/s/5Uihq_uBAdRB1vyxgFs-YA),如果没有平台的可以使用VMaware替代
注意:虚拟专用网络名称英文是:Virtual Private Network,本文统一称为虚拟专用网络

快速拓扑构建

实验概述

这次使用的设备是天枢平台的两台 openEuler 22.03sp4 服务器和一台交换机模拟企业级虚拟专用网络场景。
本实验基于以下环境配置:​

  • 操作系统: openEuler-22.03
  • 协议: IPsec over L2TP​
  • 服务端 IP: 192.168.0.213​
  • 客户端 IP: 192.168.0.26​
  • 网络拓扑: 简单的客户端 - 服务端架构
    在这里插入图片描述

理论基础

L2TP是一种工业标准的Internet隧道协议,功能大致和PPTP协议类似,比如同样可以对网络数据流进行加密。不过也有不同之处,比如PPTP要求网络为IP网络,L2TP要求面向数据包的点对点连接;PPTP使用单一隧道,L2TP使用多隧道;L2TP提供包头压缩、隧道验证,而PPTP不支持。

想学习PPTP搭建请点击跳转:第一章 PPTP虚拟专用网络搭建实战:企业级配置指南(全流程问题详解)


一、前期准备

为了实验方便,首先需要关闭两台服务器的防火墙。使用 systemctl stop firewalld 命令停止防火墙服务,然后使用 systemctl status firewalld 命令验证防火墙是否已成功停止。

命令如下:

systemctl stop firewalld # 停止 firewalld 防火墙服务

systemctl status firewalld # 查看 firewalld 防火墙服务的当前状态(如运行中、已停止等)

运行结果:

[root@localhost ipsec.d]# systemctl stop firewalld

[root@localhost ipsec.d]# systemctl status firewalld
○ firewalld.service - firewalld - dynamic firewall daemon
     Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
     Active: inactive (dead) since Tue 2025-08-26 16:43:39 CST; 7s ago
       Docs: man:firewalld(1)
    Process: 813 ExecStart=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS (code=exited, status=0/SUCCESS)
   Main PID: 813 (code=exited, status=0/SUCCESS)

826 16:34:54 localhost systemd[1]: Starting firewalld - dynamic firewall daemon...
826 16:34:55 localhost systemd[1]: Started firewalld - dynamic firewall daemon.
826 16:43:39 localhost.localdomain systemd[1]: Stopping firewalld - dynamic firewall daemon...
826 16:43:39 localhost.localdomain systemd[1]: firewalld.service: Deactivated successfully.
826 16:43:39 localhost.localdomain systemd[1]: Stopped firewalld - dynamic firewall daemon.

【注意事项】​
关闭防火墙仅适用于实验环境,生产环境中应配置适当的防火墙规则​
停止防火墙后,系统安全性会降低,请谨慎操作​
实验完成后建议重新启动防火墙服务​
可以使用 systemctl disable firewalld 命令禁用防火墙开机自启动

二、服务端配置

1.安装相关软件包

安装 libreswan 和 xl2tp 的相关 rpm 软件包
进入软件包目录,使用 rpm -Uvh *.rpm 命令安装所有相关软件包。这些软件包包括 libreswan(IPsec 实现)、xl2tpd(L2TP 实现)、ppp(点对点协议)等,是构建 IPsec over L2TP 虚拟专用网络 的必要组件。

[root@localhost ~]# cd /root/ipsec_over_l2tp/

[root@localhost ipsec_over_l2tp]# ls
initscripts-10.17-3.oe2203sp4.x86_64.rpm  libreswan-help-4.15-1.oe2203sp4.x86_64.rpm    tcpdump-4.99.3-4.oe2203sp4.x86_64.rpm
ldns-1.7.0-28.oe2203sp4.x86_64.rpm        network-scripts-10.17-3.oe2203sp4.x86_64.rpm  xl2tpd-1.3.16-1.oe2203sp4.x86_64.rpm
libreswan-4.15-1.oe2203sp4.x86_64.rpm     ppp-2.4.9-8.oe2203sp4.x86_64.rpm

[root@localhost ipsec_over_l2tp]# rpm -Uvh *.rpm
警告:initscripts-10.17-3.oe2203sp4.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID b675600b: NOKEY
Verifying...                          ################################# [100%]
准备中...                          ################################# [100%]
正在升级/安装...
   1:libreswan-help-4.15-1.oe2203sp4  ################################# [ 13%]
   2:ldns-1.7.0-28.oe2203sp4          ################################# [ 25%]
   3:initscripts-10.17-3.oe2203sp4    ################################# [ 38%]
   4:network-scripts-10.17-3.oe2203sp4################################# [ 50%]
   5:ppp-2.4.9-8.oe2203sp4            ################################# [ 63%]
   6:xl2tpd-1.3.16-1.oe2203sp4        ################################# [ 75%]
   7:libreswan-4.15-1.oe2203sp4       ################################# [ 88%]
正在清理/删除...
   8:initscripts-10.17-2.oe2203sp4    ################################# [100%]

2.配置 IPsec

创建 ipsec 需要的配置文件和秘钥文件
进入 /etc/ipsec.d/ 目录,创建 IPsec 配置文件 testipsec.conf 和密钥文件 testipsec.secrets。将密钥文件权限设置为 600,确保只有 root 用户可以访问,提高安全性。

cd /etc/ipsec.d/ # 进入 IPsec 配置文件存放目录(/etc/ipsec.d/ 是 IPsec 服务默认读取配置的目录之一)
touch testipsec.conf # 创建名为 testipsec.conf 的 IPsec 主配置文件(用于定义 IPsec 连接规则等)
touch testipsec.secrets # 创建名为 testipsec.secrets 的 IPsec 密钥文件(用于存储预共享密钥等敏感信息)
chmod 600 testipsec.secrets # 将密钥文件权限设置为 600(仅文件所有者可读写,增强敏感信息安全性)

【注意事项】​
配置文件和密钥文件必须存储在 /etc/ipsec.d/ 目录下​
密钥文件权限必须严格设置为 600,防止未授权访问​
文件名可以自定义,但建议使用有意义的命名​
确保目录路径正确,避免文件创建在错误位置

写入 IPsec 连接配置
编辑 testipsec.conf 文件,配置 IPsec 连接参数。该配置定义了一个名为 "testipsec" 的 IPsec 连接,使用预共享密钥认证,禁用 PFS,设置传输模式,指定 L2TP 协议端口等关键参数。

因为需要使用vim命令,所以解下来给新手一些vim常用命令表

操作场景 模式 命令/按键 作用说明
进入输入状态 普通模式 i 切换到插入模式(可输入文字)
回到命令状态 插入模式 Esc 退回普通模式(执行命令)
保存文件 普通模式 :w 保存当前修改(w=write)
退出Vim 普通模式 :q 退出程序(q=quit)
保存并退出 普通模式 :wq 保存后退出(最常用)
强制退出(不保存) 普通模式 :q! 放弃修改,强制退出

用法:所有冒号开头的命令,输完后按回车生效;iEsc 直接按就生效。

继续开始

编辑配置文件并写入配置内容(配置内容在下方)

vim testipsec.conf # 使用 vim 编辑器打开 testipsec.conf 文件,把下面的配置内容写入进去
cat testipsec.conf # 查看 testipsec.conf 文件的内容(检查 IPsec 配置规则是否正确设置)

配置内容如下:

conn testipsec
        authby=secret
        pfs=no
        auto=add
        rekey=no
        left=%defaultroute
        right=%any
        ikev2=never
        type=transport
        leftprotoport=17/1701
        rightprotoport=17/%any
        dpddelay=15
        dpdtimeout=30
        dpdaction=clear
        ike=aes256-sha1;modp2048
        phase2alg=aes256-sha1

【注意事项】​
authby=secret 表示使用预共享密钥认证​
pfs=no 禁用完美前向保密,可以提高兼容性​
auto=add 表示 ipsec 服务启动时自动添加此连接​
left=% defaultroute 使用默认路由作为本地端点​
right=% any 接受任何远程端点连接​
leftprotoport=17/1701 指定本地使用 UDP 端口 1701(L2TP 协议)​
ike 和 phase2alg 指定加密算法为 AES256-SHA1

写入秘钥文件
编辑 testipsec.secrets 文件,配置预共享密钥。格式为 "本地 ID 远程 ID : PSK" 密钥内容 "",这里使用 % any 表示任何本地和远程 ID 都可以使用此密钥,密钥内容为"testipsec123456"。

vim testipsec.secrets  # 使用 vim 编辑器打开 testipsec.secrets 文件,接着填入下方的写入内容

写入内容(vim不会用的请看上面的命令表哦):

%any %any : PSK "testipsec123456"

启动ipsec服务
使用 systemctl 命令管理 ipsec 服务。enable 命令设置服务开机自启动,start 命令启动服务,status 命令检查服务状态。成功启动后,服务会加载配置文件并准备接受连接。

输出命令:

systemctl enable ipsec  # 设置 ipsec 服务开机自启动(确保系统重启后 IPsec 服务能自动运行)
systemctl start ipsec  # 启动 ipsec 服务(使配置的 IPsec 规则生效,开始提供 IPsec 相关功能)
systemctl status ipsec  # 查看 ipsec 服务的当前状态(如是否激活、运行状态、最近日志等)

结果如下:

[root@localhost ipsec.d]# systemctl enable ipsec
Created symlink /etc/systemd/system/multi-user.target.wants/ipsec.service → /usr/lib/systemd/system/ipsec.service.
[root@localhost ipsec.d]# systemctl status ipsec
● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
     Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disabled)
     Active: active (running) since Tue 2025-08-26 16:43:00 CST; 3s ago
       Docs: man:ipsec(8)
             man:pluto(8)
             man:ipsec.conf(5)
    Process: 1751 ExecStartPre=/usr/libexec/ipsec/addconn --config /etc/ipsec.conf --checkconfig (code=exited, status=0/SUCCESS)
    Process: 1753 ExecStartPre=/usr/libexec/ipsec/_stackmanager start (code=exited, status=0/SUCCESS)
    Process: 1992 ExecStartPre=/usr/sbin/ipsec --checknss --nssdir /etc/ipsec.d (code=exited, status=0/SUCCESS)
    Process: 2001 ExecStartPre=/usr/sbin/ipsec --checknflog (code=exited, status=0/SUCCESS)
   Main PID: 2012 (pluto)
     Status: "Startup completed."
      Tasks: 3 (limit: 20421)
     Memory: 10.6M
     CGroup: /system.slice/ipsec.service
             └─ 2012 /usr/libexec/ipsec/pluto --leak-detective --config /etc/ipsec.conf --nofork

需要注意输出的内容,服务状态输出显示了 IPsec 连接的详细配置信息,包括网络接口、加密算法、DPD 设置、NAT 穿越等参数。这些信息有助于验证配置是否正确应用。

【注意事项】​
检查输出中的关键参数是否与配置一致​
确认 IPsec 服务正在监听正确的网络接口和端口​
验证 DPD 功能已启用(dpd: active)​
注意 NAT 穿越设置,对于有 NAT 设备的环境很重要​
如参数不正确,检查配置文件并重载服务

3. 配置 pppd

配置 CHAP 密钥
进入 /etc/ppp/ 目录,编辑 chap-secrets 文件配置 CHAP 认证信息。该文件用于存储 L2TP 连接的用户认证信息,格式为 “客户端用户名 服务器名 密码 允许的 IP 地址”。

命令如下:

cd /etc/ppp/  # 进入 ppp 协议配置文件所在目录(ppp 是点对点协议,常用于 虚拟专用网络 中的身份验证等配置)
vim chap-secrets  # 使用 vim 编辑器打开 chap-secrets 文件,该文件用于存储 PPP 协议的 CHAP 身份验证信息(如用户名、密码、允许访问的服务等)

vim编辑的内容如下:

# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
testvpn * testvpn *

配置 pppd 选项
创建 options.xl2tpd 文件,配置 pppd(点对点协议守护进程)的选项。这些选项包括接受本地和远程 IP 地址分配、禁用压缩控制协议、要求客户端认证等。
命令如下:

vim options.xl2tpd  # 使用 vim 编辑器打开 xl2tpd 服务的 PPP 选项配置文件(该文件用于设置 L2TP 连接中 PPP 协议的相关参数,如 IP 地址分配、DNS 服务器、认证方式等)

vim编辑内容如下:

ipcp-accept-local
ipcp-accept-remote
noccp
auth

4. 配置 xl2tpd

创建 xl2tpd 配置文件
创建 xl2tpd.conf 配置文件,设置 L2TP 网络服务器(LNS)的参数。配置包括监听端口、IP 地址范围、认证要求、PPP 选项文件路径等。

命令如下:

cd /etc/xl2tpd/  # 进入 xl2tpd 服务的主配置目录
vim xl2tpd.conf  # 使用 vim 编辑器打开 xl2tpd 服务的主配置文件(用于配置 L2TP 服务的核心参数,如监听端口、隧道设置、PPP 配置文件路径等)

vim编辑内容如下:

[global]​
port = 1701​
listen-addr = 192.168.0.213​
​
[lns default]ip range = 192.168.1.100-192.168.1.200​
local ip = 192.168.1.1​
refuse chap = yes​
refuse pap = yes​
require authentication = yes​
ppp debug = yes​
pppoptfile = /etc/ppp/options.xl2tpd​
length bit = yes

【注意事项】​
listen-addr 应设置为服务端的 IP 地址​
ip range 指定分配给客户端的 IP 地址范围​
local ip 指定 LNS 的本地 IP 地址​
启用认证提高安全性​
pppoptfile 路径必须正确指向 PPP 选项文件

添加 xl2tpd 的运行目录的执行权限

chmod +x /run/xl2tpd # 为 /run/xl2tpd 目录添加可执行权限(确保进程可访问该目录,通常用于存放 xl2tpd 运行时的临时文件或进程 PID 等)
ls -ld /run/xl2tpd # 查看 /run/xl2tpd 目录的详细权限信息(确认权限设置是否生效,此处显示为 drwxr-xr-x,即所有者、组用户、其他用户均有读和执行权限,所有者额外有写权限)

启动客户端 xl2tpd 服务

命令如下:

systemctl enable xl2tpd  # 设置 xl2tpd 服务开机自启动(确保系统重启后 L2TP 服务能自动运行)
systemctl start xl2tpd  # 启动 xl2tpd 服务(使 L2TP 相关配置生效,开始监听并处理 L2TP 隧道连接请求)
systemctl status xl2tpd  # 查看 xl2tpd 服务的当前状态(如是否激活、运行状态、最近日志等,验证服务是否正常启动)

结果如下:

[root@localhost ppp]# systemctl enable xl2tpd
Created symlink /etc/systemd/system/multi-user.target.wants/xl2tpd.service → /usr/lib/systemd/system/xl2tpd.service.[root@localhost xl2tpd]# systemctl start xl2tpd
[root@localhost xl2tpd]# systemctl status xl2tpd
● xl2tpd.service - Level 2 Tunnel Protocol Daemon (L2TP)
Loaded: loaded (/usr/lib/systemd/system/xl2tpd.service; enabled; vendor preset: disabled)
Active: active (running) since Tue 2025-08-26 16:50:53 CST; 2s ago
Process: 2130 ExecStartPre=/sbin/modprobe -q l2tp_ppp (code=exited, status=0/SUCCESS)
Main PID: 2132 (xl2tpd)
Tasks: 1 (limit: 20421)
Memory: 336.0K
CGroup: /system.slice/xl2tpd.service
└─ 2132 /usr/sbin/xl2tpd -D8月 26 16:50:53 localhost.localdomain systemd[1]: Starting Level 2 Tunnel Protocol Daemon (L2TP)...
826 16:50:53 localhost.localdomain systemd[1]: Started Level 2 Tunnel Protocol Daemon (L2TP).
826 16:50:53 localhost.localdomain xl2tpd[2132]: xl2tpd[2132]: Not looking for kernel SAref support.
826 16:50:53 localhost.localdomain xl2tpd[2132]: xl2tpd[2132]: Using l2tp kernel support.
826 16:50:53 localhost.localdomain xl2tpd[2132]: xl2tpd[2132]: xl2tpd version xl2tpd-1.3.16 started on localhost.localdomain PID:2132
826 16:50:53 localhost.localdomain xl2tpd[2132]: xl2tpd[2132]: Written by Mark Spencer, Copyright (C) 1998, Adtran, Inc.
826 16:50:53 localhost.localdomain xl2tpd[2132]: xl2tpd[2132]: Forked by Scott Balmos and David Stipp, (C) 2001
826 16:50:53 localhost.localdomain xl2tpd[2132]: xl2tpd[2132]: Inherited by Jeff McAdams, (C) 2002
826 16:50:53 localhost.localdomain xl2tpd[2132]: xl2tpd[2132]: Forked again by Xelerance ( www.xelerance.com ) (C) 2006-2016
826 16:50:53 localhost.localdomain xl2tpd[2132]: xl2tpd[2132]: Listening on IP address 0.0.0.0, port 1701
[root@localhost xl2tpd]#

【注意事项】​
确保 xl2tpd 服务在 ipsec 服务之后启动​
验证服务是否正确监听配置的 IP 地址和端口​
检查防火墙是否允许 UDP 端口 1701 的流量​
如服务启动失败,查看日志文件获取详细信息​
可以使用 netstat 或 ss 命令检查端口监听状态

三、客户端配置

1. 安装相关软件包

客户端需要安装与服务端相同的软件包,包括 libreswan、xl2tpd、ppp 等。使用 rpm -Uvh 命令安装所有相关软件包。

[root@localhost ~]# cd /root/ipsec_over_l2tp/

[root@localhost ipsec_over_l2tp]# ls
initscripts-10.17-3.oe2203sp4.x86_64.rpm  libreswan-help-4.15-1.oe2203sp4.x86_64.rpm    tcpdump-4.99.3-4.oe2203sp4.x86_64.rpm
ldns-1.7.0-28.oe2203sp4.x86_64.rpm        network-scripts-10.17-3.oe2203sp4.x86_64.rpm  xl2tpd-1.3.16-1.oe2203sp4.x86_64.rpm
libreswan-4.15-1.oe2203sp4.x86_64.rpm     ppp-2.4.9-8.oe2203sp4.x86_64.rpm

[root@localhost ipsec_over_l2tp]# rpm -Uvh *.rpm
警告:initscripts-10.17-3.oe2203sp4.x86_64.rpm: 头V4 RSA/SHA256 Signature, 密钥 ID b675600b: NOKEY

2. 配置 IPsec

客户端 IPsec 配置与服务端类似,需要创建配置文件和密钥文件,并设置适当的权限。

[root@localhost ipsec_over_l2tp]# cd /etc/ipsec.d/

[root@localhost ipsec.d]# touch testipsec.conf

[root@localhost ipsec.d]# touch testipsec.secrets

[root@localhost ipsec.d]# chmod 600 testipsec.secrets

写入客户端 IPsec 配置

客户端 IPsec 配置与服务端的主要区别是 right 参数指定了服务端的 IP 地址(192.168.0.213),而不是使用 % any。其他参数如加密算法、DPD 设置等应与服务端保持一致。

写入命令:

vim testipsec.conf 

写入内容:

conn testipsec
        authby=secret
        pfs=no
        auto=add
        rekey=no
        left=%defaultroute
        right=192.168.0.213
        type=transport
        leftprotoport=17/1701
        rightprotoport=17/1701
        dpddelay=30
        dpdtimeout=70
        dpdaction=clear
        ikev2=never
        ike=aes256-sha1;modp2048
        phase2alg=aes256-sha1

【注意事项】​
right 参数必须指定服务端的正确 IP 地址​
所有加密和认证参数必须与服务端完全一致​
DPD 超时时间可以适当延长,提高稳定性​
确保 leftprotoport 和 rightprotoport 设置正确​
禁用 IKEv2 确保与服务端兼容性

写入客户端密钥文件

客户端密钥文件与服务端完全相同,使用相同的预共享密钥。

写入命令:

vim testipsec.secrets 

写入内容:

%any %any : PSK "testipsec123456"

启动客户端 IPsec 服务

启动客户端 IPsec 服务,与服务端配置类似

启动命令:

systemctl enable ipsec
systemctl start ipsec
systemctl status ipsec

启动结果:

[root@localhost ipsec.d]# systemctl enable ipsec
Created symlink /etc/systemd/system/multi-user.target.wants/ipsec.service → /usr/lib/systemd/system/ipsec.service.

[root@localhost ipsec.d]# systemctl start ipsec

[root@localhost ipsec.d]# systemctl status ipsec
● ipsec.service - Internet Key Exchange (IKE) Protocol Daemon for IPsec
     Loaded: loaded (/usr/lib/systemd/system/ipsec.service; enabled; vendor preset: disabled)
     Active: active (running) since Tue 2025-08-26 16:43:00 CST; 3s ago
       Docs: man:ipsec(8)
             man:pluto(8)
             man:ipsec.conf(5)
    Process: 1751 ExecStartPre=/usr/libexec/ipsec/addconn --config /etc/ipsec.conf --checkconfig (code=exited, status=0/SUCCESS)
    Process: 1753 ExecStartPre=/usr/libexec/ipsec/_stackmanager start (code=exited, status=0/SUCCESS)
    Process: 1992 ExecStartPre=/usr/sbin/ipsec --checknss --nssdir /etc/ipsec.d (code=exited, status=0/SUCCESS)
    Process: 2001 ExecStartPre=/usr/sbin/ipsec --checknflog (code=exited, status=0/SUCCESS)
   Main PID: 2012 (pluto)
     Status: "Startup completed."
      Tasks: 3 (limit: 20421)
     Memory: 10.6M
     CGroup: /system.slice/ipsec.service
             └─ 2012 /usr/libexec/ipsec/pluto --leak-detective --config /etc/ipsec.conf --nofork

3. 配置 pppd

创建 options.test 文件,配置客户端 PPP 选项。这些选项包括接受 IP 地址分配、拒绝 EAP 认证、要求 MSCHAPv2 认证、设置 MTU/MRU 大小、使用默认路由等。

创建 PPP 选项文件

写入命令:

vim options.test 

写入内容

[root@localhost ppp]# 
ipcp-accept-local
ipcp-accept-remote
refuse-eap
require-mschap-v2
noccp
noauth
idle 1800
mtu 1200
mru 1200
defaultroute
noipdefault
usepeerdns
debug
connect-delay 5000
name testvpn
password testvpn

【注意事项】​
用户名和密码必须与服务端 chap-secrets 配置一致​
mtu 和 mru 设置为 1200 可以避免某些网络环境中的分片问题​
defaultroute 会将 虚拟专用网络 设置为默认路由,所有流量通过 虚拟专用网络 传输​
usepeerdns 允许从 虚拟专用网络 服务器获取 DNS 配置​
启用 debug 有助于问题排查,但在生产环境中应禁用

4. 配置 xl2tpd

创建客户端 xl2tpd 配置文件,定义 L2TP 访问 concentrator(LAC)。lns 参数指定 L2TP 网络服务器(LNS)的 IP 地址(192.168.0.213),即 虚拟专用网络 服务端的 IP 地址。

创建客户端 xl2tpd 配置
写入命令:

vim xl2tpd.conf 

写入内容:

[lac testl2tp]
    lns = 192.168.0.213
    ppp debug = yes
    pppoptfile = /etc/ppp/options.test

【注意事项】​
lns 参数必须指定服务端的正确 IP 地址​
pppoptfile 路径必须正确指向 PPP 选项文件​
可以配置多个 LAC 连接不同的 虚拟专用网络 服务器​
确保配置文件格式正确,注意缩进和语法

启动客户端 xl2tpd 服务
启动客户端 xl2tpd 服务,与服务端配置类似。

命令如下:

systemctl enable xl2tpd
systemctl start xl2tpd
systemctl status xl2tpd

结果如下:

[root@localhost xl2tpd]# systemctl enable xl2tpd
Created symlink /etc/systemd/system/multi-user.target.wants/xl2tpd.service → /usr/lib/systemd/system/xl2tpd.service.

[root@localhost xl2tpd]# systemctl start xl2tpd

[root@localhost xl2tpd]# systemctl status xl2tpd
● xl2tpd.service - L2TP daemon
     Loaded: loaded (/usr/lib/systemd/system/xl2tpd.service; enabled; vendor preset: disabled)
     Active: active (running) since Tue 2025-08-26 16:45:00 CST; 1s ago
   Main PID: 2200 (xl2tpd)
      Tasks: 1 (limit: 20421)
     Memory: 656.0K
     CGroup: /system.slice/xl2tpd.service
             └─2200 /usr/sbin/xl2tpd -c /etc/xl2tpd/xl2tpd.conf -p /var/run/xl2tpd/xl2tpd.pid -s /var/run/xl2tpd/l2tp-control

四、虚拟专用网络连接测试

1. 建立 IPsec 连接

使用 ipsec auto 命令手动添加和建立 IPsec 连接。--add 参数添加连接配置,--up 参数建立连接。输出显示 IKE SAIPsec SA 成功建立。

命令如下:

ipsec auto --add testipsec  # 将名为 testipsec 的 IPsec 连接配置添加到 IPsec 服务中(加载配置使其可被服务识别)
ipsec auto --up testipsec  # 启动名为 testipsec 的 IPsec 连接(建立该配置定义的 IPsec 隧道,使连接生效)

结果如下:

[root@localhost ipsec.d]# ipsec auto --add testipsec
002 "testipsec": added IKEv1 connection

[root@localhost ipsec.d]# ipsec auto --up testipsec
002 "testipsec" #1: initiating IKEv1 Main Mode connection
102 "testipsec" #1: sent Main Mode request
104 "testipsec" #1: sent Main Mode I2
106 "testipsec" #1: sent Main Mode I3
002 "testipsec" #1: Peer ID is ID_IPV4_ADDR: '192.168.0.213'
004 "testipsec" #1: IKE SA established {auth=PRESHARED_KEY cipher=AES_CBC_256 integ=HMAC_SHA1 group=MODP2048}
002 "testipsec" #2: initiating Quick Mode IKEv1+PSK+ENCRYPT+DONT_REKEY+UP+IKE_FRAG_ALLOW+ESN_NO+ESN_YES {using isakmp#1 msgid:762ac6bf proposal=AES_CBC_256-HMAC_SHA1_96 pfsgroup=no-pfs}
115 "testipsec" #2: sent Quick Mode request
004 "testipsec" #2: IPsec SA established transport mode {ESP=>0x974aad9d <0x6f63fe50 xfrm=AES_CBC_256-HMAC_SHA1_96 DPD=active}

【注意事项】​
连接建立过程包括 Main Mode 和 Quick Mode 两个阶段​
检查输出中的加密算法是否与配置一致​
确认 SA 成功建立​
如连接失败,检查网络连通性和防火墙规则​
查看日志文件获取详细的错误信息

2. 验证 IPsec 状态

使用 ip xfrm state 命令查看 IPsec 安全关联状态。输出显示了双向的 ESP 规则,包括源地址、目标地址、加密算法、认证算法等详细信息。

命令如下:

ip xfrm state  # 查看 Linux 内核中当前 XFRM(IPsec 安全框架)的状态信息,包括已建立的 IPsec 安全关联(SA)、加密算法、封装模式等,用于验证 IPsec 隧道是否正常建立

结果如下:

[root@localhost ipsec.d]# ip xfrm state
src 192.168.0.213 dst 192.168.0.26
        proto esp spi 0x6f63fe50 reqid 16397 mode transport
        replay-window 0 
        auth-trunc hmac(sha1) 0xf495ebdd08e564d0d7c02b700f01319206218df2 96
        enc cbc(aes) 0x7233cb78892eea0263e1d67dcec5a2cff448fd2af9785b262df546bc17b71018
        anti-replay esn context:
         seq-hi 0x0, seq 0x0, oseq-hi 0x0, oseq 0x0
         replay_window 128, bitmap-length 4
         00000000 00000000 00000000 00000000 
        sel src 192.168.0.213/32 dst 192.168.0.26/32 proto udp sport 1701 dport 1701 

src 192.168.0.26 dst 192.168.0.213
        proto esp spi 0x974aad9d reqid 16397 mode transport
        replay-window 0 
        auth-trunc hmac(sha1) 0xc8b99225acaf8f92e23b446155af184e4d5e5156 96
        enc cbc(aes) 0x97955d547ace4ecbcac24edd6dc91a7a15c824927e6407a1a01dfc5af6722f70
        anti-replay esn context:
         seq-hi 0x0, seq 0x0, oseq-hi 0x0, oseq 0x0
         replay_window 128, bitmap-length 4
         00000000 00000000 00000000 00000000 
        sel src 192.168.0.26/32 dst 192.168.0.213/32 proto udp sport 1701 dport 1701 

【注意事项】​
验证源地址和目标地址是否正确​
确认加密和认证算法与配置一致​
SPI 值是随机生成的,每次连接可能不同​
检查选择器是否正确匹配 L2TP 流量​
确保双向规则都已正确建立

3. 建立 L2TP 连接

启动 xl2tpd 服务并建立 L2TP 连接。xl2tpd -c 命令指定配置文件启动服务,echo 命令向控制文件写入 "c testl2tp" 命令,触发 L2TP 连接的建立。

xl2tpd -c /etc/xl2tpd/xl2tpd.conf  
# 使用指定的配置文件(/etc/xl2tpd/xl2tpd.conf)启动 xl2tpd 服务(-c 选项用于指定配置文件路径,强制使用该文件进行初始化)

echo "c testl2tp" > /var/run/xl2tpd/l2tp-control  
# 向 xl2tpd 服务的控制管道(/var/run/xl2tpd/l2tp-control)发送命令,请求建立名为 "testl2tp" 的 L2TP 连接("c" 表示 create,即创建连接)

【注意事项】​
确保 IPsec 连接已成功建立​
控制文件路径必须正确​
“c testl2tp” 中的 “testl2tp” 对应配置文件中的 LAC 名称​
连接建立可能需要几秒钟时间​
如连接失败,检查 xl2tpd 日志文件

4. 验证网络接口

使用 ip a 命令查看网络接口状态。成功建立 L2TP 连接后,会创建一个新的 ppp0 接口,并分配虚拟专用网络 网段的 IP 地址。

命令如下:

ip a  # 查看当前系统中所有网络接口的详细信息,包括接口名称、IP地址(IPv4/IPv6)、MAC地址、接口状态(如UP/DOWN)等,可用于验证连接是否成功分配IP

结果如下:

[root@localhost xl2tpd]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 52:54:00:12:34:56 brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.26/24 brd 192.168.0.255 scope global noprefixroute ens3
       valid_lft forever preferred_lft forever
    inet6 fe80::5054:ff:fe12:3456/64 scope link noprefixroute
       valid_lft forever preferred_lft forever
3: ppp0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1200 qdisc fq_codel state UNKNOWN group default qlen 3
    link/ppp
    inet 192.168.1.100 peer 192.168.1.1/32 scope global ppp0
       valid_lft forever preferred_lft forever

【注意事项】​
查找 ppp 接口(如 ppp0)确认连接成功​
检查分配的 IP 地址是否在预期的网段内​
验证接口状态是否为 UP​
如未看到 ppp 接口,检查连接配置和日志​
记录分配的 IP 地址用于后续测试

5. 测试网络连通性

使用 ping 命令测试 虚拟专用网络 连接的连通性。首先 ping 虚拟专用网络服务端的本地 IP 地址(192.168.1.1),然后 ping 服务端的物理 IP 地址(192.168.0.213),验证连接是否正常。

使用命令:

ping 192.168.1.1  # 向目标IP地址 192.168.1.1 发送ICMP回声请求包,用于测试本地主机与该目标IP之间的网络连通性

结果如下:

[root@localhost xl2tpd]# ping 192.168.1.1
PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.23 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.89 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=1.01 ms

--- 192.168.1.1 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2002ms
rtt min/avg/max/mdev = 0.890/1.043/1.230/0.143 ms

[root@localhost xl2tpd]# ping 192.168.0.213
PING 192.168.0.213 (192.168.0.213) 56(84) bytes of data.
64 bytes from 192.168.0.213: icmp_seq=1 ttl=64 time=0.76 ms
64 bytes from 192.168.0.213: icmp_seq=2 ttl=64 time=0.65 ms

【注意事项】​
测试多个目标地址,确保连接稳定性​
注意 ping 的响应时间,判断网络质量​
检查是否有丢包现象​
如无法 ping 通,检查路由表和防火墙规则​
可以使用 traceroute 命令分析路由路径

总结

本实验详细介绍了在 openEuler 22.03-LTS-SP4 系统上构建 IPsec over L2TP虚拟专用网络的完整过程,包括服务端和客户端的安装配置、连接建立和网络测试。通过使用 libreswan 实现 IPsec 协议、xl2tpd 实现 L2TP 协议,成功建立了安全的虚拟专用网络连接,实现了客户端与服务端之间的加密通信。实验采用预共享密钥认证方式,使用 AES256-SHA1 加密算法,配置了 CHAP 用户认证,最终实现了虚拟专用网络连接的成功建立和网络连通性验证。

关键注意事项

  • 网络环境准备:确保服务端和客户端网络连通,关闭防火墙或配置适当规则
  • 软件版本兼容性:服务端和客户端应使用相同版本的libreswan、xl2tpd 和 ppp 软件包
  • 配置参数一致性:IPsec加密算法、预共享密钥、认证方式等参数在服务端和客户端必须完全一致
  • 密钥安全管理:生产环境中应使用强密钥并定期更换,严格控制密钥文件权限
  • 服务启动顺序:应先启动 ipsec 服务,再启动 xl2tpd 服务 连接建立顺序:必须先建立 IPsec 连接,再建立 L2TP 连接
  • 网络接口验证:连接建立后应检查 ppp 接口是否正确创建并分配 IP 地址
  • 故障排查方法:遇到问题时查看/var/log/secure、/var/log/messages 等日志文件
  • 生产环境建议:实验环境中关闭防火墙仅为方便测试,生产环境应配置完整的防火墙规则
  • 性能优化考虑:根据网络环境调整 MTU/MRU 大小,优化虚拟专用网络连接性能

想学习PPTP搭建请点击跳转第一章 PPTP虚拟专用网络搭建实战:企业级配置指南(全流程问题详解)

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐