Linux下L2TP配置,怎样才算最简单的方法?

在网络管理和远程访问领域,构建一个稳定、安全的VPN隧道是至关重要的,Linux凭借其强大的网络堆栈和灵活性,成为搭建VPN服务器的理想选择,L2TP(Layer 2 Tunneling Protocol,第二层隧道协议)本身并不提供加密,因此通常与IPsec(Internet Protocol Security)结合使用,形成一个既安全又具备良好穿透性的VPN解决方案,以下将详细介绍如何在Linux系统上一步步配置L2TP/IPsec VPN服务。

Linux下L2TP配置,怎样才算最简单的方法?

准备工作

在开始配置之前,请确保您具备以下条件:

  1. 一台拥有公网IP地址的Linux服务器(本文以CentOS 7/8和Ubuntu 20.04为例)。
  2. 拥有root权限或sudo权限的普通用户。
  3. 确保服务器内核已加载必要的L2TP模块,可以通过以下命令检查:
    modprobe l2tp_ppp && lsmod | grep l2tp

    如果输出包含l2tp_pppl2tp_core等模块,则表示已加载成功。

  4. 为了简化初始配置过程,建议临时关闭防火墙和SELinux,配置完成后再根据需要开启并设置相应规则。

安装必要软件

我们将使用xl2tpd作为L2TP守护进程,Libreswan作为IPsec守护进程,这两款软件成熟稳定,且社区支持良好。

对于基于Red Hat的系统(如CentOS, Rocky Linux):

sudo yum install epel-release -y
sudo yum install xl2tpd libreswan -y

对于基于Debian的系统(如Ubuntu, Debian):

sudo apt-get update
sudo apt-get install xl2tpd librewsan -y

配置IPsec (Libreswan)

IPsec负责为L2TP流量提供加密和认证。

编辑主配置文件 /etc/ipsec.conf

version 2.0
config setup
    protostack=netkey
    # 日志记录级别,调试时可设为"all"
    plutodebug="all"
    plutostderrlog=/var/log/pluto.log
conn L2TP-IPsec
    authby=secret
    pfs=no
    rekey=no
    keyingtries=3
    type=transport
    left=%defaultroute
    leftid=@your-vpn-server-id  # 可以是公网IP或域名,需与客户端匹配
    leftprotoport=17/1701
    right=%any
    rightid=%any
    rightprotoport=17/%any
    # DPD (Dead Peer Detection) 配置,用于检测客户端是否在线
    dpddelay=30
    dpdtimeout=120
    dpdaction=clear
    auto=add
  • type=transport:L2TP/IPsec使用传输模式,因为L2TP已经处理了隧道。
  • leftid:建议使用服务器的公网IP地址或一个FQDN(完全限定域名)。

设置预共享密钥 (PSK) /etc/ipsec.secrets

此文件定义了IPsec连接的认证密钥,请将your-strong-pre-shared-key替换为您自己的强密码。

%any %any : PSK "your-strong-pre-shared-key"

配置L2TP (xl2tpd)

L2TP负责建立第二层隧道并承载PPP会话。

编辑主配置文件 /etc/xl2tpd/xl2tpd.conf

Linux下L2TP配置,怎样才算最简单的方法?

[global]
listen-addr = YOUR_SERVER_PUBLIC_IP  # 替换为您的公网IP
port = 1701
[lns default]
ip range = 192.168.101.2-192.168.101.254  # 分配给VPN客户端的IP地址池
local ip = 192.168.101.1                  # VPN服务器的虚拟IP
require chap = yes
refuse pap = yes
require authentication = yes
name = l2tp-vpn-server
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

配置PPP选项 /etc/ppp/options.xl2tpd

此文件定义了PPP会话的参数,如DNS、MTU等。

ipcp-accept-local
ipcp-accept-remote
ms-dns 8.8.8.8
ms-dns 8.8.4.4
auth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000
  • mtumru设置为1410是为了适应IPsec封装后的包大小,避免分片问题。

设置VPN用户名和密码 /etc/ppp/chap-secrets

此文件存储了客户端的登录凭证。

# 用户名  服务器  密码  分配的IP地址
testuser    *       "userpassword"    *
  • 第二个表示name字段在xl2tpd.conf中定义的任何值。
  • 最后一个表示从ip range动态分配IP。

网络与防火墙设置

开启内核IP转发

编辑/etc/sysctl.conf文件,添加或修改以下行:

net.ipv4.ip_forward = 1

然后执行 sudo sysctl -p 使配置立即生效。

配置防火墙

开放L2TP/IPsec所需的端口,并设置NAT规则。

协议端口用途
UDP500IKE(密钥交换)
UDP4500NAT-T(NAT穿透)
UDP1701L2TP隧道

对于firewalld (CentOS/RHEL):

sudo firewall-cmd --permanent --add-service="ipsec"
sudo firewall-cmd --permanent --add-port=1701/udp
sudo firewall-cmd --permanent --add-masquerade
sudo firewall-cmd --reload

对于ufw (Ubuntu):

Linux下L2TP配置,怎样才算最简单的方法?

sudo ufw allow 500/udp
sudo ufw allow 4500/udp
sudo ufw allow 1701/udp
# 需要在 /etc/ufw/before.rules 中添加 NAT 规则

注意:UFW的NAT配置稍复杂,需在规则文件顶部添加`natPOSTROUTING`规则。*

启动服务与验证

启动并启用服务

sudo systemctl enable ipsec xl2tpd
sudo systemctl restart ipsec xl2tpd

验证IPsec状态

sudo ipsec verify

这个命令会检查IPsec配置的各个方面,确保没有问题,所有检查项都应显示为 [OK]

检查日志
如果连接失败,查看系统日志是关键。

sudo journalctl -u ipsec -f
sudo journalctl -u xl2tpd -f

至此,服务器端的L2TP/IPsec配置已全部完成,您现在可以在Windows、macOS、iOS或Android等客户端上,使用您设置的PSK、用户名和密码来连接VPN,连接成功后,客户端应获得一个168.101.x网段的IP地址,并能通过服务器访问互联网。


相关问答FAQs

问题1:客户端连接成功,也获取到了IP地址,但无法访问任何网站或外部网络,是什么原因?
解答: 这是一个典型的NAT或IP转发问题,请首先确认以下两点:

  1. IP转发是否已开启? 再次检查 /etc/sysctl.conf 中的 net.ipv4.ip_forward = 1 是否已设置并使用 sysctl -p 生效。
  2. 防火墙NAT规则是否正确? 这是导致此问题的最常见原因,请确保您的防火墙(如firewalld或iptables)已经添加了MASQUERADE(地址伪装)规则,允许从VPN客户端IP地址池(如168.101.0/24)出去的流量,其源地址被伪装成服务器的公网IP,对于firewalld,命令是 sudo firewall-cmd --permanent --add-masquerade,对于iptables,规则类似 iptables -t nat -A POSTROUTING -s 192.168.101.0/24 -o eth0 -j MASQUERADE(其中eth0是您的公网网卡)。

问题2:IPsec连接建立失败,日志中常出现“no connection named …”或“pluto busy”等错误,该如何排查?
解答: 这种错误通常指向IPsec配置本身或服务状态问题。

  1. 检查连接名称: “no connection named …” 错误意味着Libreswan无法在 /etc/ipsec.conf 文件中找到匹配的连接定义,请检查客户端发起连接时使用的连接名称(或ID)是否与服务器 ipsec.confconn L2TP-IPsec 定义的名称一致。
  2. 服务状态与重启: “pluto busy” 可能表示Libreswan守护进程(pluto)状态异常或正在处理其他连接,尝试重启IPsec服务:sudo systemctl restart ipsec,如果问题依旧,检查 journalctl -u ipsec 的详细日志,通常会给出更具体的失败原因,如密钥不匹配、网络接口问题等。
  3. 文件语法: 确认 /etc/ipsec.conf/etc/ipsec.secrets 文件的语法正确无误,特别是PSK的引号、ID的格式等,使用 ipsec verify 命令也可以帮助发现一些基本的配置错误。

图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/10337.html

(0)
上一篇2025年10月17日 03:45
下一篇 2025年10月17日 03:52

相关推荐

  • 如何使用虚拟主机,虚拟主机如何操作 ?

    大家对虚拟主机并不陌生,特别是个人网站站长,一般的个人站长虚拟主机可以完全满足需求,但是新手站长却不知所措,许多新的站长为了更好地了解虚拟主机,自己也购买了虚拟主机或者服务器,但不…

    2019年1月15日
    03.1K0
  • 如何配置Maven远程仓库地址来解决依赖下载慢的问题?

    在Java项目的构建与管理中,Maven扮演着至关重要的角色,它通过一个核心概念——仓库,来管理项目所需的依赖(如JAR包),默认情况下,Maven会从其官方的中央仓库下载依赖,但对于身处国内或需要使用公司内部私有库的开发者来说,配置一个或多个远程仓库地址是提升构建速度、保障依赖安全性和可用性的必要步骤,本文将……

    2025年10月13日
    070
  • 经常看到的云盘指的是虚拟主机吗?

    经常看到的云盘指的是虚拟主机吗?不是,这是不同的两种产品。虚拟主机是服务器划分出来的一部分空间,享部分服务器的资源,支持虚拟系统运行环境,可以安装软件、搭建网站等。而云盘,只是一块…

    2022年3月22日
    05880
  • 云虚拟主机具有vps的功能吗?

    云虚拟主机有vps的功能吗?云虚拟主机基于云计算,一般是共享IP,也可以增加独立ip,不能根据需要安装操作系统和配置环境,支持的程序是服务商默认已经配置好的。而vps有独立IP,可…

    2022年3月10日
    06500

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注