如何在客厅中通过静态IP自托管服务器
摘要
一份使用L2TP隧道和静态IP在家中自托管服务器的指南,绕过CGNAT等ISP限制。
<p><a href="https://lobste.rs/s/sh9bbn/how_self_host_servers_your_living_room_on">评论</a></p>
查看缓存全文
缓存时间: 2026/07/25 22:08
# 如何在你家客厅用静态IP自托管服务器 - Leah Rowe的失眠吐槽
来源:https://vimuser.org/l2tp.html
- 博客 (https://vimuser.org/)
- 使用我的 \.vimrc\! (https://vimuser.org/vim.html)
- 1337box (https://vimuser.org/1337box.html)
- 一场基本不流血的政变 \(书籍\) (https://vimuser.org/story.html)
- 联系我 (https://vimuser.org/contact.html)
- 我不是机器人。我叫 Leah Rowe。
---
Leah Rowe
返回索引 (https://vimuser.org/)
文章作者:Leah Rowe
发布日期:2022年11月29日
- << (https://vimuser.org/matrix.html)
- < 上一篇 (https://vimuser.org/1337box.html)
- 下一篇 \> (https://vimuser.org/hypocrites.html)
- \>\> (https://vimuser.org/british.html)
## 引言
大多数人认为路由器是一种硬件,但这并不正确。路由器实际上是软件,硬件只是运行该软件的载体。几乎任何东西都可以成为路由器,就像《瑞克和莫蒂》某一集中任何东西都可以插在玉米棒上一样。照片里的笔记本电脑就是我的路由器,其配置方式完全按照本指南所述。
你是否曾想在家或办公室托管一台服务器,却因为ISP不提供静态IP而无法实现?你是否处在CGNAT之后?本指南就是为你准备的。它将教你如何将静态IPv4和(原生)IPv6地址路由到你的网络,让主机可以直接从互联网上ping通,并且所有端口*开放*。有了本指南,你不再需要将你的软件项目托管在*github*上,因为你可以转而安装gitea/cgit,配合邮件列表,放在你的*树莓派*上,然后托管在地下室或客厅里!
我最近将libreboot\.org (https://libreboot.org/) 的托管迁移到了一个比以前快得多的网络,但新ISP不提供线路上的静态IPv4或IPv6子网,并且存在各种限制,尽管速度、在线率和延迟都很好。因此,我决定使用Andrews & Arnold Ltd (A&A) 的L2TP隧道服务 (https://www.aa.net.uk/broadband/l2tp-service/) 建立隧道连接。这基本上类似于大多数VPN服务,但你有更多的自由度和灵活性,例如IPv4子网(比如,你可以在此之上托管自己的DNS)。它也可以用于普通的日常互联网任务。A&A提供*未过滤*的服务,没有任何限制或限速。
## 简要技术概述
请根据你的发行版调整本指南。基本上我们要做的是通过L2TP进行PPP连接,并在Linux中启用数据包转发,以便数据包可以在两个接口之间传递。然后我们设置路由。我们将拥有以下接口:
- WAN口(以太网) – 上游ISP
- 隧道口(PPP over L2TP) – 物理上通过WAN口
- LAN口(以太网) – 数据包仅在该端口和隧道之间路由,不直接与WAN口通信。据此设置路由。
L2TP是一种用于在互联网上隧道传输流量的协议。ISP经常使用它来将客户连接到其后端,然后提供PPP登录。只要你有*以太网口*可用于互联网,你的隧道路由器就可以正常工作。如果需要,你*可以*在另一台机器上设置WiFi连接或4G热点,通过RJ45以太网口共享给L2TP路由器连接;例如,树莓派通过USB连接到4G LTE服务的加密狗,通过以太网分配IP(可能是NAT+DHCP)。流量将通过静态路由强制发送到A&A的L2TP隧道服务器。这样,*所有*流量都将通过L2TP,没有其他。它与你的主网络完全隔离。
通过这种设置,你可以在任何地方托管你的服务器,并且非常容易迁移。
## 准备工作
## 硬件
你需要一台带有两个以太网接口(RJ45)的计算机。然后在上面运行Linux或BSD。在本教程中,我将告诉你如何配置*Debian Linux*,但这里的信息也可以适用于其他系统。我强烈建议只在BSD或Linux上进行托管。
## 接口名称
在我的例子中,我有以下物理接口:
- `enp14s0` 通过NAT地址配置到普通ISP路由器,并设置静态路由到A&A的L2TP服务器。客户端L2TP将通过此接口连接。
- `eno0` 用于将来自L2TP的IP路由到交换机。这基本上是我的LAN口。
你的接口可能不同,请相应调整。
## 入门
当你首次在路由器上安装Debian时,最好直接使用网络安装程序。只安装*基础系统*(在`tasksel`中选择`Standard system utilities`)。如果你愿意,也可以启用SSH。在真正配置路由之前,你的Debian机器必须有*网络*以便下载软件包。或者,你也可以将apt配置为从安装介质获取软件包。这取决于你。
你必须安装*这些*软件包:
apt-get install ppp pppoe xl2tpd iproute2 tcpdump net-tools resolvconf
你应该在做其他事情之前安装这些软件包。只需通过DHCP等方式连接,然后安装这些即可。你也可以从Debian安装介质中获取它们。如果你需要一个好的文本编辑器,我推荐Vim (https://www.vim.org/)。尽管这听起来有些骇人听闻,但Debian默认不安装它!
## 网络配置
在继续之前,请确保已安装上述列出的软件包。此时,我们直接进入并配置所有内容。为了我们的目的,路由器上的WAN端将通过NAT连接到主ISP网络,但我们不会使用DHCP。相反,我们将指定一个静态(NAT)IP地址,但不设置网关;这样就不会设置默认路由,而是设置一条静态路由。该静态路由仅将流量路由到`90.155.53.19`,即A&A的L2TP服务器,通过本应是网关的IP地址,在我的情况下是`10.42.0.1`,但在你的情况下可能是`192.168.1.1`。请相应调整。通过这样设置静态路由,当隧道连接断开时,我们只能连接到A&A L2TP。当隧道连接建立时,我们仍然没有默认路由,但随后我们添加一条默认路由,经过PPP over L2TP隧道。这样,所有流量(除了直接到`90.155.53.19`的流量)都将通过L2TP隧道,而不是你的主上游ISP(例如Virgin、Sky、TalkTalk)。通过这样做,我们确保所有流量正确只通过*A&A*。我们直接使用A&A的IP地址,是因为当L2TP隧道断开时我们没有DNS。
## /etc/network/interfaces
*请阅读*下面示例中的注释。它们很重要。你必须根据自己的情况调整以下配置:
```
source /etc/network/interfaces.d/*
# 环回网络接口
auto lo
iface lo inet loopback
# 注意:10.42.0.116 是普通网关路由器,LAN侧,与l2tp无关。
# 下面的10地址在你的情况下很可能需要改为 `192.168.x.x/24`
# 请相应调整
# 注意:eno0上的IP是A&A为我的l2tp服务分配的/28子网IP
# 请根据你的线路调整。另外请注意,A&A通常为l2tp提供/29,但给了我/28;
# 对于/29,你应该使用子网掩码255.255.255.248,但我的情况指定了255.255.255.240
auto enp14s0
allow-hotplug enp14s0
iface enp14s0 inet static
address 10.42.0.116
netmask 255.255.255.0
network 10.42.0.0
# gateway 10.42.0.1 # 我们将设置自定义路由。见下文
broadcast 10.42.0.255
up /sbin/ip route add 90.155.53.19/32 via 10.42.0.1 dev enp14s0
# LAN
auto eno0
iface eno0 inet static
address 81.187.172.129
netmask 255.255.255.240
dns-nameservers 217.169.20.20 217.169.20.21
iface eno0 inet6 static
address 2001:8b0:b95:1bb5::1
netmask 64
dns-nameservers 2001:8b0::2020 2001:8b0::2021
# 注意:由于上述原因,我们强制所有流量通过L2TP,在L2TP建立之前不会有DNS。
# 这就是为什么直接使用A&A L2TP路由器的IP地址!
# 注意:没有硬线连接,所以这里没有配置PPP。这由xl2tpd处理。
```
注意:IP地址`90.155.53.19`是`l2tp.aa.net.uk`解析到的地址,由于网络初始化时(设置L2TP时)没有名称解析,我们将直接使用它。我们在`enp14s0`上设置的静态路由确保WAN端(连接到主ISP,不是A&A)有互联网,前提是(物理)主网络本身工作正常。
## 启用IP转发
你必须允许数据包转发,以便流量可以在两个网络接口之间流动。编辑这个文件:
## /etc/sysctl.conf
取消注释这一行:
#net.ipv4.ip_forward=1
以及这一行(注意:禁用无状态地址自动配置)
#net.ipv6.conf.all.forwarding=1
这些行应该变成:
net.ipv4.ip_forward=1
net.ipv6.conf.all.forwarding=1
现在运行:
sysctl -p
最后一个命令只是*现在*应用它,但系统每次启动时也会应用。
## L2TP
你可能觉得奇怪,我们像在硬线上一样配置PPP,但这对下一步很重要。A&A提供无需认证的L2TP,然后你通过经由L2TP路由的PPP进行认证。正是通过PPP,A&A分配你的(公有)IP地址。这也适用于他们的硬线服务器(例如VDSL/FTTP)。Debian内核应该已经有正确的模块,但否则你必须确保内核配置中启用了`CONFIG_PPPOL2TP`和`CONFIG_L2TP`选项。
需要注意的是,A&A的L2TP服务(截至今日)目前没有使用IPSEC或其他加密(如WireGuard)。这并不理想,但你可能已经在线上做了很多加密的事情(很多网站现在都支持https)。*因为*使用了纯L2TP,你可以在非常弱的硬件上托管,仍能获得全速。有一天,我可能会写关于如何以启用IPSEC的方式使用L2TP(使用除A&A之外的上游L2TP服务)的指南。
在L2TP建立之前,你将无法使用DNS,所以我们将直接使用A&A的IP地址`l2tp.aa.net.uk`,即`90.155.53.19`。
## /etc/xl2tpd/xl2tpd.conf
放置以下内容:
```
[lac aaisp]
lns = 90.155.53.19
require authentication = no
pppoptfile = /etc/ppp/options.aaisp
```
## /etc/ppp/options.aaisp
创建这个文件,并放置以下内容:
注意:`name`和`password`条目是你的A&A L2TP登录详情。
```
+ipv6
ipv6cp-use-ipaddr
name [email protected]
password [email protected]_password
noauth
ifname ppp-aaisp-l2tp
```
## ppp ifupdown 脚本
PPP和L2TP由`pppd`管理,当接口启动或关闭时,它会执行if up/down脚本。我们将据此进行操作:
## /etc/ppp/ipv6-up.d/0000-defaultroute
此文件在IPv6上设置默认路由,但通常可以(滥)用来处理L2TP/PPP的启动/关闭。这个文件用于链路*启动*时。必须设置默认路由!
文件应包含以下逻辑:
```bash
#!/bin/bash
/bin/logger $1 is up
if [ $1 = "ppp-aaisp-l2tp" ]; then
/bin/logger "AAISP over L2TP circuit is online; adding routes"
/sbin/ip route add default dev ppp-aaisp-l2tp scope link
/sbin/ip -6 route add default dev ppp-aaisp-l2tp scope link
fi
```
不要忘记使其*可执行*:
chmod 755 /etc/ppp/ipv6-up.d/0000-defaultroute
## /etc/ppp/ipv6-down.d/0000-defaultroute
当线路断开时,必须删除路由:
```bash
#!/bin/bash
/bin/logger $1 is down
if [ $1 = "ppp-aaisp-l2tp" ]; then
/bin/logger "AAISP over L2TP circuit is offline; removing routes"
/sbin/ip route del default dev ppp-aaisp-l2tp scope link
/sbin/ip -6 route del default dev ppp-aaisp-l2tp scope link
fi
```
不要忘记*这个*也设为可执行:
chmod 755 /etc/ppp/ipv6-down.d/0000-defaultroute
## xl2tpd 控制文件
你可能注意到,到目前为止我们还没有指定L2TP隧道连接实际上*如何启动*。现在将对此进行说明。
创建xl2tpd控制文件:
mkdir -p /var/run/xl2tpd
touch /var/run/xl2tpd/l2tp-control
启动xl2tpd服务:
systemctl start xl2tpd
使其在每次启动时启用:
systemctl enable xl2tpd
我们现在让L2TP守护进程在启动时自动启动,但它*不会*自动建立你的连接。该*守护进程*监视写入一个*控制文件*的操作,我们刚刚在`/var/run/xl2tpd/l2tp-control`创建了它。告诉守护进程连接到aaisp:
echo "c aaisp" > /var/run/xl2tpd/l2tp-control
要停止L2TP连接,请执行:
echo "d aaisp" > /var/run/xl2tpd/l2tp-control
通过运行`ip a`,你将看到隧道连接列为`ppp-aaisp-l2tp`,但仅在PPP(over L2TP)连接活跃时。如你之前所见,我们使用了Debian中的ifup/down脚本来添加/删除路由。你需要决定是否希望在路由器中自动启动L2TP。在某些情况下,自动启动可能实际上并不理想,比如你只想快速测试一个新网络,但还没有准备好投入生产。
## 调试
你可以在`/var/log/messages`中找到关于`xl2tpd`的有用日志。
## 自动连接
## 每分钟重试
由于xl2tpd的工作方式(控制文件),我得出结论,最好的处理方法是使用crontab。以root身份执行:
crontab -e
在其中插入:
```
* * * * * echo "c aaisp" > /var/run/xl2tpd/l2tp-control
```
你可能还需要添加如下内容,用于解析域名:
```
* * * * * echo "nameserver 217.169.20.20" > /etc/resolv.conf
```
这个L2TP路由设置有点hacky,本指南可能需要进一步完善。上述用于`resolvconf`的规则只是保持DNS工作。上面例子中使用的nameserver IP是A&A提供给客户的。当L2TP已建立时运行该命令不会产生任何效果,xl2tpd只会退出该次运行,而隧道保持打开。当隧道断开时,运行该命令会重新建立连接。
## 每5秒重试
如果你的连接经常有几秒的中断,xl2tpd每分钟重新运行一次会带来更多不必要的停机时间。建议改为每5秒运行一次。`crontab`文件不提供这种功能,在我们的情况下只允许*每分钟*执行指令。你可以简单地在启动时运行一个脚本,该脚本以5秒为循环执行。例如:
```bash
#!/bin/sh
while true
do
echo "c aaisp" > /var/run/xl2tpd/l2tp-control
sleep 5
done
```
一个更智能的方法可能是在上述ifdown脚本中加入指令,运行上述循环,但让循环在隧道建立时退出。同样的修改脚本也会在启动时运行。这样,你可能节省一两秒,但我觉得不必费心。
## 如何在主机上使用互联网
## 物理设置
你可以简单地将一个以太网交换机连接到路由器的第二个接口,该接口上已分配了根据`/etc/network/interfaces`配置的IPv4/6子网地址。然后你的主机将连接到该交换机。在该以太网交换机上,你将设置你的主机使用来自/28或/29 IPv4子网的IP地址。如果你向A&A客气地要求,甚至可能获得更大的子网。你也可以使用IPv6,但不使用SLAAC;只需在主机上设置任意数量的静态IPv6地址。
## 操作系统中的IP配置(针对主机)
通过这种路由设置,任何连接到它的主机都可以实现双栈IPv4和IPv6。互联网应该直接在路由器本身上正常工作。在此配置中没有运行DHCP或NAT;也许可以针对*这种情况*写一篇指南,但对于本页面描述的这个确切设置,你可以简单地将以下内容指定为静态IP地址:
- IP(主机):A&A给你子网中的任何未使用IP地址(v4或v6)。例如(对于libreboot\.org):`81.187.172.132` 和 `2001:8b0:b95:1bb5::4`
- 网关:L2TP路由器的LAN侧IP地址。在上面的例子中,这将是
相似文章
使用 OpenBSD 搭建一个简单的自托管网页服务器
一份在 OpenBSD 上使用 httpd 和 WireGuard 通过 VPS 隧道隐藏 IP 来设置自托管网页服务器的逐步指南。
mikeroyal/Self-Hosting-Guide
全面指南,介绍如何在本地自托管软件应用程序,涵盖云服务、LLM、WireGuard、自动化、Home Assistant 和网络。
从自有可路由IPv4块起步的硬核自托管邮件
一份关于使用专属IPv4块自托管邮箱的详细技术指南,涵盖信誉管理、SPF、DKIM、DMARC以及使用Dovecot和Roundcube等工具的服务器设置。
HomeLab #1: MikroTik 作为家庭路由器
实用指南:设置MikroTik路由器用于家庭实验室,涵盖如何识别ISP连接类型(IPoE与PPPoE)以及WAN IPv4地址(公网与CGNAT/DS-Lite),以便正确配置路由器。
在树莓派上托管网站
技术教程,介绍如何在树莓派上自托管网站,涵盖端口转发、DNS 配置、使用 Caddy 作为反向代理、PM2 进行 Node.js 进程管理,以及使用 GitHub Actions 实现 CI/CD 自动化。