# 前言

鉴于当前各运营商因政策收紧已难以申请到公网 IPv4,即使已拥有公网 IP 的用户也因各种理由被收回。虽然可以获得公网 IPv6,但 IPv6 的普及尚未成熟,仍有部分环境不支持 IPv6,影响访问。因此,在无法获得公网 IPv4 且不愿使用 IPv6 的情况下,内网穿透成为一种解决方案。

# 使用 STUN 实现内网穿透

STUN 是解决 P2P 应用中 NAT 穿透问题的常见技术。它能帮助网络设备找出经过 NAT 设备后的通信端点的 IP 地址和端口号,并利用这些信息在通信双方之间建立一条能够穿越 NAT 设备的数据通道,从而实现 P2P 通信。使用 STUN 进行内网穿透的优点在于不需要依赖任何外部服务;然而,缺点是对网络环境要求严格,要求 NAT 类型必须为 Fullcone NAT,并且不能自定义端口号。接下来将演示如何在 Openwrt 环境下使用 Lucky 实现 STUN 内网穿透。

首先需要测试当前网络是否为 Fullcone NAT。在 Windows 系统上,可以使用 NatTypeTester 进行测试。对于 Android 设备,则可以使用 NekoBox 来查看。

打开 Lucky 的 STUN 内网穿透并点击 添加穿透规则

lucky

根据图中的提示填写,如果你不是在路由器上运行 Lucky,并且不想将 Lucky 的运行设备设置为 DMZ 主机,那么你需要执行以下步骤:

  • 打开路由器的 NAT-PMP 功能。

  • 在穿透规则中,打开 NAT-PMP。

  • 将路由器的 IP 地址填写到 NAT-PMP 网关地址中。

miniupnp

全部按要求设置完毕后点击添加即可成功穿透,可直接通过穿透出的 [IP:端口号] 从外网访问你的服务。

# 使用 Frp 实现内网穿透

相比于 STUN 内网穿透,Frp 的优点在于可以自定义穿透出的端口号。然而,Frp 的缺点是需要一个拥有公网 IP 的服务器来作为服务端。Frp 通常由两个组件组成:客户端(frpc)和服务端(frps)。服务端需要部署在拥有公网 IP 地址的机器上,而客户端则部署在需要进行内网穿透的内网服务所在的机器上。以下是在 Linux 系统上配置 Frp 的演示步骤。

首先到 这里 下载 Frp,然后先在有公网 IP 的设备上配置。打开解压出的文件中的 frps.toml ,并按照 这里 的教程配置。

# frps.toml
bindPort = 7000 //服务端口,可自行修改
screen -l //新建一个screen
./ frps -c frps.toml //运行frps

之后在内网设备上配置,打开解压出的文件中的 frpc.toml

# frpc.toml
serverAddr = "x.x.x.x" //服务器IP地址
serverPort = 7000 //服务端填写的端口
[[proxies]]
name = "ssh" //服务名称
type = "tcp" //协议
localIP = "127.0.0.1" //本地地址,可填写其他IP
localPort = 22 //本地端口
remotePort = 6000 //远程端口
screen -l //新建一个screen
./ frpc -c frpc.toml //运行frpc

注意放行 Frps 和 Frpc 所需的端口号。如果要穿透多项服务,复制 [[proxies]] 字段,然后修改 name 即可。

# 使用 Zerotier 实现内网穿透

Zerotier 是一种利用 UDP 打洞技术实现内网穿透的工具。你可以通过创建网络然后将两个或更多设备加入该网络来实现此目的。你可以使用 Zerotier 玩游戏、连接到远程业务资源。Zerotier 的优点是让设备之间的通信如同在局域网一样,如果打洞成功则可以让两个设备直接通信。缺点是对网络环境的要求比较严格,如果打洞失败则只能通过 Planet 服务器进行通信,在国外还好说,在国内延迟直接爆炸。下面演示在 Linux 上使用 Zerotier 实现内网穿透。

首先到 这里 创建 Zerotier 账号,直接第三方账号登陆也可以。

登录后点击 Create A Network ,然后点击你创建的网络并复制你的网络 ID。下面安装 Zerotier 并加入网络。

# 在线安装 zerotier
curl -s https://install.zerotier.com/ | sudo bash
# 添加开机自启
sudo systemctl enable zerotier-one.service
# 启动 zerotier-one.service
sudo systemctl start zerotier-one.service
# 加入网络
sudo zerotier-cli join a45cd3e67deedff

之后回到后台,找到新加入的设备,并勾上前面的 Auth?

Zerotier

最后使用 Ping 测试连通性即可。