服务器内网穿透访问住宅主机服务:服务器内网穿透访问住宅主机
写在前面:为什么你需要用服务器内网穿透访问住宅主机
很多人在家里搭了NAS、开发服务器或监控面板,但运营商不给公网IP,或者给的也是动态IP,没法直接从外网访问。
通过内网穿透工具,你可以租一台低配云服务器作为跳板,让家中的主机主动连接到这台云服务器,然后在云服务器上开一个端口,所有发往该端口的流量都会被转发到你家里服务的端口。
这样你就能在任何地方通过公网IP访问家里的服务了。
本文以最流行的 frp 为例,从零开始讲清楚每个步骤。
准备阶段:你需要的东西和系统环境
- 一台公网服务器(随便几十块钱的轻量云即可,操作系统建议 CentOS 7+ 或 Ubuntu 20.04+,本文以 Ubuntu 22.04 为例)。
- 一台家庭内网主机(可以是树莓派、旧电脑或NAS,同样 Linux 或 Windows 都行,这里用 Linux 举例)。
- frp 软件包:到 frp GitHub Releases 下载对应架构的压缩包。一般下载
frp_0.xx.x_linux_amd64.tar.gz(64位 x86)。
两个机器都能正常上网,并且家里的主机能主动访问公网服务器(HTTP/HTTPS 和自定义端口)。
分步操作:从下载到启动一次跑通
1. 在公网服务器上部署 frps(服务端)
SSH 登录你的公网服务器,执行:
wget https://github.com/fatedier/frp/releases/download/v0.58.0/frp_0.58.0_linux_amd64.tar.gz
tar -xzf frp_0.58.0_linux_amd64.tar.gz
cd frp_0.58.0_linux_amd64
编辑服务端配置文件 frps.toml(新版 frp 使用 TOML 格式,旧版是 ini,以下按新版 TOML 示例):
[common]
bind_port = 7000
保存后启动:
./frps -c frps.toml
看到 start frps success 即成功。
如果报端口被占用,换一个端口(如 7001)并同步修改后续配置。
重要:需要在云服务器的安全组/防火墙中放行 bind_port(7000)以及后面打算给客户端用的远程端口(例如 8080),否则客户端连不上。
2. 让 frps 后台运行并开机自启
用 screen 或 nohup 简单后台:
nohup ./frps -c frps.toml > frps.log 2>&1 &
更推荐使用 systemd 管理,确保重启后自动启动:
sudo vi /etc/systemd/system/frps.service
写入:
[Unit]
Description=frp server
After=network.target
[Service]
Type=simple
ExecStart=/root/frp_0.58.0_linux_amd64/frps -c /root/frp_0.58.0_linux_amd64/frps.toml
Restart=on-failure
[Install]
WantedBy=multi-user.target
然后执行:
sudo systemctl daemon-reload
sudo systemctl enable frps
sudo systemctl start frps
sudo systemctl status frps
看到 active (running) 即可。
3. 在家里主机上部署 frpc(客户端)
把 frp_0.58.0_linux_amd64.tar.gz 下载到家里主机,同样解压。
也可以直接用 scp 从服务器下载:
scp root@你的公网IP:~/frp_0.58.0_linux_amd64/frpc ~/
scp root@你的公网IP:~/frp_0.58.0_linux_amd64/frpc.toml ~/
编辑 frpc.toml:
[common]
server_addr = "你的公网IP"
server_port = 7000
[web]
type = "tcp"
local_ip = "127.0.0.1"
local_port = 80
remote_port = 8080
这里假设你家里有 Web 服务(比如 Nginx 或本地开发环境)监听在 80 端口。如果你想访问其他服务(如 SSH),修改local_port和remote_port即可。
启动客户端测试:
./frpc -c frpc.toml
看到 start proxy success 表示连接成功。
4. 客户端同样设置自启
在家里的主机上创建 systemd 服务(路径根据实际情况调整):
sudo vi /etc/systemd/system/frpc.service
内容:
[Unit]
Description=frp client
After=network.target
[Service]
Type=simple
ExecStart=/home/pi/frp_0.58.0_linux_amd64/frpc -c /home/pi/frp_0.58.0_linux_amd64/frpc.toml
Restart=on-failure
[Install]
WantedBy=multi-user.target
启用并启动:
sudo systemctl daemon-reload
sudo systemctl enable frpc
sudo systemctl start frpc
sudo systemctl status frpc
避坑指南:常见报错与排查方法
- 连接超时或拒绝:检查公网服务器防火墙是否放行了
bind_port和remote_port。云服务商安全组也需要入方向允许这两个端口。 - 客户端报错
dial tcp ... i/o timeout:大概率是家里网络禁止出站到服务器端口,检查家里路由器是否有限制,或改用其他端口(如 443)。 bind_port冲突:frps 默认 7000 端口,如果已被占用,用netstat -tlnp | grep 7000确认,然后改端口。- 服务已启动但外网访问不到:确认家里主机上的本地服务是否正常运行,可以用
curl http://127.0.0.1:80测试。 - systemd 启动失败:查看日志
journalctl -u frpc.service -n 50,多半是路径或权限问题。
效果验证:确保隧道通路上线
访问 http://你的公网IP:8080 应该能直接看到家里主机的 Web 服务页面。
如果出现错误页面,回退检查每一步的状态日志。
更可靠的方法:在家里主机上执行 tail -f frpc.log 同时刷新浏览器,观察是否有 accept new connection 字样。
如果看到这个,说明流量已经成功打回家了。
常见问题解答
问:frp 支持 UDP 吗?
支持,但需要将 type 改为 udp,并确保服务器和客户端都配置正确。
问:没有公网服务器怎么办?
可以用免费内网穿透服务(如 ngrok、Tailscale),但稳定性和自定义能力不如自建 frp。如果预算紧张,可以先用一台 1 核 1G 的低价云服务器起步。
问:家里主机掉线后重连会自动恢复吗?
设置好 systemd 的 Restart=on-failure 后,frpc 崩溃或网络闪断后会尝试自动重启,通常几秒内恢复。
问:如何添加更多端口映射?
在frpc.toml中加新的 proxy 段,比如 [ssh] type = tcp local_port = 22 remote_port = 2222,然后重启 frpc。
如果你在操作中遇到其他具体报错,可以先去 frp 官方文档或社区搜索,多数问题都有现成解决方案。
按照本文的步骤一步步走,普通人半小时内就能完成服务器内网穿透访问住宅主机服务的搭建。