端口转发与内网穿透指南

📖 阅读时间:50分钟 🎯 难度:高级 🔧 实践操作:高

学习使用iptables、frp、Gost等多种工具,将内网服务安全地发布到公网,或在不同服务器间建立安全隧道,解锁VPS的高级网络玩法。

🧠 核心概念解析

端口转发 (Port Forwarding) 指的是将发送到一个IP地址和端口号组合的数据包,转发到另一个可能不同的IP地址和端口号。而内网穿透 (NAT Traversal) 是一种特殊的端口转发,目的是让位于NAT(网络地址转换)设备(如家庭路由器)后面的内网设备,能够被公网访问。

简单来说,这些技术就像是为没有公网地址的设备(例如您的家庭电脑)在拥有公网IP的VPS上开一个“窗口”,让外部的访问可以通过这个窗口找到并访问您的设备。

🎯 常见应用场景

🏠

远程访问家庭NAS

将家中的NAS或树莓派服务(如Plex, Home Assistant)安全地发布到公网,随时随地访问。

💻

临时开发调试

将本地开发环境的Web服务临时暴露给同事或客户进行预览,无需部署到测试服务器。

🏢

访问内网办公系统

安全地访问公司内网的OA、Jira等系统,而无需使用复杂的VPN。

🌉

跳板机与代理

利用一台服务器作为跳板,访问其内网中的其他机器,或者作为网络代理使用。

⚖️ 方案对比与选择

不同的工具有不同的适用场景,下表可以帮助您快速选择:

工具 易用性 特点 核心应用场景
iptables 困难 内核级转发,性能最高 服务器端口转发、NAT
SSH隧道 简单 系统自带,无需额外软件,加密 临时、安全的端口转发
Gost 中等 功能极其强大,协议支持全面,加密 复杂的多级转发、隧道链
frp 简单 专为内网穿透设计,配置简单,稳定 将NAT后内网服务发布到公网

选择建议:

  • 临时调试、安全访问数据库: 优先使用 `SSH隧道`。
  • 长期、稳定地暴露内网服务: `frp` 是最佳选择。
  • VPS本机端口转发: 使用性能最高的 `iptables`。
  • 构建复杂的加密隧道网络: 选择功能最强大的 `Gost`。

🔥 iptables转发 (同网)

这是Linux内核级别的转发,性能最高,适用于将VPS的一个端口收到的流量转发到本机或其他IP的另一个端口。

1

开启内核IP转发

编辑 /etc/sysctl.conf 文件,确保 `net.ipv4.ip_forward=1` 这一行存在且没有被注释。

# 取消注释或添加此行 net.ipv4.ip_forward=1 # 使配置生效 sysctl -p
2

添加转发规则

假设我们要将VPS `8888` 端口的TCP流量转发到本机 `8080` 端口:

iptables -t nat -A PREROUTING -p tcp --dport 8888 -j DNAT --to-destination 127.0.0.1:8080 iptables -t nat -A POSTROUTING -p tcp -d 127.0.0.1 --dport 8080 -j MASQUERADE

您还需要安装 `iptables-persistent` 来保存规则,以防重启后失效。

🔗 SSH隧道 (便捷)

利用SSH协议建立的加密隧道,无需安装额外软件,非常适合临时和安全的转发需求。

本地转发 (-L)

将**本地端口**通过VPS转发到目标服务器。

# 访问本地8080端口,相当于访问远程服务器的3306端口 ssh -L 8080:localhost:3306 user@vps_ip

常用于安全地访问远程数据库。

远程转发 (-R)

将**VPS端口**转发到本地服务,实现简单的内网穿透。

# 在本地机器上运行此命令 # 访问vps_ip:8080,相当于访问本地的3000端口 ssh -R 8080:localhost:3000 user@vps_ip

需要修改VPS的SSH配置 `GatewayPorts yes`。

👻 Gost隧道 (强大)

Gost是一个功能极其强大的瑞士军刀级隧道工具,支持海量协议和复杂的转发组合。

1

下载并运行Gost

Gost GitHub Releases 页面下载对应您VPS架构的版本。

# 下载并解压 wget https://github.com/ginuerzh/gost/releases/download/v2.11.5/gost-linux-amd64-2.11.5.gz && gzip -d gost-linux-amd64-2.11.5.gz chmod +x gost-linux-amd64-2.11.5
2

简单端口转发示例

将VPS `8888` 端口的TCP流量转发到 `example.com` 的 `80` 端口。

./gost-linux-amd64-2.11.5 -L=tcp://:8888/example.com:80

Gost的玩法远不止于此,可以通过 `-F` 参数建立复杂的多级转发链,请参考其官方文档。

🚀 frp穿透 (常用)

frp是一款专注于内网穿透的高性能反向代理应用,配置简单,非常稳定。

frp架构

frp包含两部分:

  • frps (服务端): 部署在有公网IP的VPS上。
  • frpc (客户端): 部署在需要穿透的内网设备上。
1

在VPS上配置frps (服务端)

下载frp并编辑 `frps.ini` 文件:

[common]
bind_port = 7000
token = your_secure_token

然后运行: ./frps -c ./frps.ini

2

在内网设备上配置frpc (客户端)

下载frp并编辑 `frpc.ini` 文件:

[common]
server_addr = your_vps_ip
server_port = 7000
token = your_secure_token

[web]
type = tcp
local_ip = 127.0.0.1
local_port = 80
remote_port = 8080

[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000

然后运行: ./frpc -c ./frpc.ini

3

访问服务

配置成功后:

  • 访问 `your_vps_ip:8080` 即可看到您内网设备的Web服务。
  • 通过 `ssh -p 6000 user@your_vps_ip` 即可连接到内网设备的SSH。

🔒 安全注意事项

将内网服务暴露到公网会带来安全风险,请务必遵守以下原则:

🔑 使用强Token或认证

在使用frp、Gost等工具时,务必设置复杂的`token`或密码,防止未授权的客户端连接到您的服务端。

🛡️ 最小化暴露原则

只转发您确实需要的端口,不要转发SSH 22端口等高风险端口到公网的默认端口上。frp的stcp模式可以提供更安全的点对点加密访问。

🌐 结合域名和HTTPS

对于暴露的Web服务,强烈建议使用frp的`vhost_http_port`或HTTPS插件,并配合Nginx反向代理和SSL证书,实现HTTPS加密访问。