在网络管理和远程访问领域,构建一个稳定、安全的VPN隧道是至关重要的,Linux凭借其强大的网络堆栈和灵活性,成为搭建VPN服务器的理想选择,L2TP(Layer 2 Tunneling Protocol,第二层隧道协议)本身并不提供加密,因此通常与IPsec(Internet Protocol Security)结合使用,形成一个既安全又具备良好穿透性的VPN解决方案,以下将详细介绍如何在Linux系统上一步步配置L2TP/IPsec VPN服务。
准备工作
在开始配置之前,请确保您具备以下条件:
- 一台拥有公网IP地址的Linux服务器(本文以CentOS 7/8和Ubuntu 20.04为例)。
- 拥有root权限或sudo权限的普通用户。
- 确保服务器内核已加载必要的L2TP模块,可以通过以下命令检查:
modprobe l2tp_ppp && lsmod | grep l2tp
如果输出包含
l2tp_ppp
和l2tp_core
等模块,则表示已加载成功。 - 为了简化初始配置过程,建议临时关闭防火墙和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
[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
mtu
和mru
设置为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规则。
协议 | 端口 | 用途 |
---|---|---|
UDP | 500 | IKE(密钥交换) |
UDP | 4500 | NAT-T(NAT穿透) |
UDP | 1701 | L2TP隧道 |
对于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):
sudo ufw allow 500/udp sudo ufw allow 4500/udp sudo ufw allow 1701/udp # 需要在 /etc/ufw/before.rules 中添加 NAT 规则
注意:UFW的NAT配置稍复杂,需在规则文件顶部添加`nat和
POSTROUTING`规则。*
启动服务与验证
启动并启用服务
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转发问题,请首先确认以下两点:
- IP转发是否已开启? 再次检查
/etc/sysctl.conf
中的net.ipv4.ip_forward = 1
是否已设置并使用sysctl -p
生效。 - 防火墙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配置本身或服务状态问题。
- 检查连接名称: “no connection named …” 错误意味着Libreswan无法在
/etc/ipsec.conf
文件中找到匹配的连接定义,请检查客户端发起连接时使用的连接名称(或ID)是否与服务器ipsec.conf
中conn L2TP-IPsec
定义的名称一致。 - 服务状态与重启: “pluto busy” 可能表示Libreswan守护进程(pluto)状态异常或正在处理其他连接,尝试重启IPsec服务:
sudo systemctl restart ipsec
,如果问题依旧,检查journalctl -u ipsec
的详细日志,通常会给出更具体的失败原因,如密钥不匹配、网络接口问题等。 - 文件语法: 确认
/etc/ipsec.conf
和/etc/ipsec.secrets
文件的语法正确无误,特别是PSK的引号、ID的格式等,使用ipsec verify
命令也可以帮助发现一些基本的配置错误。
图片来源于AI模型,如侵权请联系管理员。作者:酷小编,如若转载,请注明出处:https://www.kufanyun.com/ask/10337.html