如何在客厅中通过静态IP自托管服务器

Lobsters Hottest 工具

摘要

一份使用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地址。在上面的例子中,这将是

相似文章

mikeroyal/Self-Hosting-Guide

GitHub Trending (daily)

全面指南,介绍如何在本地自托管软件应用程序,涵盖云服务、LLM、WireGuard、自动化、Home Assistant 和网络。

HomeLab #1: MikroTik 作为家庭路由器

Hacker News Top

实用指南:设置MikroTik路由器用于家庭实验室,涵盖如何识别ISP连接类型(IPoE与PPPoE)以及WAN IPv4地址(公网与CGNAT/DS-Lite),以便正确配置路由器。

在树莓派上托管网站

Hacker News Top

技术教程,介绍如何在树莓派上自托管网站,涵盖端口转发、DNS 配置、使用 Caddy 作为反向代理、PM2 进行 Node.js 进程管理,以及使用 GitHub Actions 实现 CI/CD 自动化。