前言

鉴于当前各运营商因政策收紧已难以申请到公网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的运行设备设置为DMZ主机,那么你需要执行以下步骤:

  • 打开路由器的NAT-PMP功能。
  • 在穿透规则中,打开NAT-PMP。
  • 将路由器的IP地址填写到NAT-PMP网关地址中。

全部按要求设置完毕后点击添加即可成功穿透,可直接通过穿透出的[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?

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