内网穿透

tool

# 一、内网穿透

NAT(Network Address Translation)

# 内网穿透工具

  • NPS-NPC
  • FRP
  • Cpolar(不推荐)

# 二、NPS与NPC

# 1、简介

nps是一款轻量级、高性能、功能强大的内网穿透代理服务器。

目前支持tcp、udp流量转发,可支持任何tcp、udp上层协议(访问内网网站、本地支付接口调试、ssh访问、远程桌面,内网dns解析等等……),此外还支持内网http代理、内网socks5代理、p2p等。

nps带有功能强大的web管理端。

  • NPS:一台有公网IP的服务器
  • NPC:需要穿透的内网服务器

2

# 2、特点

  • Go语言编写
  • 支持跨平台
  • 支持多种协议的代理
  • web管理端

# 3、使用

# 三、FRP

# 1、简介

FRP 是一个开源的反向代理工具,能够帮助用户在 NAT 网络环境下实现内网穿透,让位于内网的服务可以被公网访问。它的设计简洁且功能强大,常用于远程访问内网设备、搭建个人服务器、实现服务代理等场景。

# 2、核心功能

  • 反向代理:将公网服务器的流量转发到内网的指定设备或服务。
  • 内网穿透:突破 NAT 限制,让内网服务(如 Web 网站、SSH 服务、数据库等)被公网访问。
  • 多协议支持:支持 TCP、UDP、HTTP、HTTPS 等多种协议。
  • 负载均衡:可将流量分发到多个内网服务节点。
  • 加密与压缩:传输过程支持加密和压缩,提升安全性和传输效率。

# 3、典型应用场景

  • 远程访问内网设备:如远程控制家里的电脑、访问内网 NAS 存储。
  • 开发测试:本地开发的 Web 应用通过 FRP 暴露到公网,方便调试和测试。
  • 搭建个人服务:在内网搭建博客、文件服务器,通过公网域名访问。
  • 企业内网互联:分支机构与总部内网服务互通。

# 4、FRP 的工作原理

FRP 采用 客户端 - 服务器(C/S)架构:

  1. FRP 服务器(Server):部署在具有公网 IP 的服务器上,作为流量入口。
  2. FRP 客户端(Client):部署在内网设备上,与服务器建立连接,并指定需要转发的内网服务。

常用配置项解析

  1. 服务器端(frps.ini)
配置项 说明
bind_port 服务器监听客户端连接的端口(必填)。
token 客户端与服务器通信的认证密钥,需与客户端一致。
dashboard_port 管理面板端口,可通过浏览器查看 FRP 运行状态。
vhost_http_port HTTP 服务默认监听端口(用于域名转发)。
vhost_https_port HTTPS 服务默认监听端口(用于域名转发)。
  1. 客户端(frpc.ini)
配置项 说明
server_addr FRP 服务器的公网 IP 或域名(必填)。
server_port 服务器监听端口(需与服务器端 bind_port 一致)。
token 与服务器端一致的认证密钥。
type 转发类型(tcp、udp、http、https)。
local_ip 内网服务的 IP 地址(通常为 127.0.0.1)。
local_port 内网服务的端口。
remote_port 公网服务器映射的端口(TCP/UDP 转发时必填)。
custom_domains HTTP/HTTPS 转发时绑定的域名(可多个,用逗号分隔)。

# 5、使用

# 1)部署服务端frps(docker)

下载镜像

docker pull snowdreamtech/frps:0.52.3
1

安装

mkdir -p /usr/local/docker/resource/frp/frps
cd /usr/local/docker/resource/frp/frps
vi frps.toml
vi docker-compose.yml
1
2
3
4

frps.toml

# 客户端与服务连接端口
bindPort = 7000
# http协议监听端口
vhostHTTPPort = 880
# web界面配置
webServer.addr = "0.0.0.0"
webServer.port = 7001
webServer.user = "admin"
webServer.password = "123456"
1
2
3
4
5
6
7
8
9

docker-compose.yml

services:
  frps:
    image: snowdreamtech/frps:0.52.3
    container_name: frps
    network_mode: host
    volumes:
      - ./frps.toml:/etc/frp/frps.toml
    restart: always
1
2
3
4
5
6
7
8

# 2)部署客户端frpc(docker)

下载镜像

docker pull snowdreamtech/frps:0.52.3
1

安装

mkdir -p /usr/local/docker/resource/frp/frps
cd /usr/local/docker/resource/frp/frps
vi frps.toml
vi docker-compose.yml
1
2
3
4

frps.toml

serverAddr = "39.99.123.230"
serverPort = 7000
webServer.addr = "0.0.0.0"
webServer.port = 7400
webServer.user = "admin"
webServer.password = "admin"

[[proxies]]
name = "Nexus-http"
type = "http"
localIP = "192.168.0.200"
localPort = 8081
customDomains = ["39.99.123.230"]

1
2
3
4
5
6
7
8
9
10
11
12
13
14

docker-compose.yml

version: '3'
services:
  frpc:
    restart: always
    image: 'snowdreamtech/frpc:0.52.3'
    container_name: frpc
    volumes:
      - './frpc.toml:/etc/frp/frpc.toml'
    ports:
      - "7400:7400"
1
2
3
4
5
6
7
8
9
10

# 3)部署客户端frpc(linux)

下载

frp 0.52.3(和服务端版本一致)

cd /tmp

# 代理1
wget https://gh-proxy.com/https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz

# 不行换代理2
wget https://ghfast.top/https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz

# 不行换代理3
wget https://gh.llkk.cc/https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
1
2
3
4
5
6
7
8
9
10

如果全都不行,就在别的能上网的机器下好,scp 拷到 /tmp/:

bash

scp frp_0.52.3_linux_amd64.tar.gz root@海康机器IP:/tmp/
1

下载完确认文件大小(应十几 MB):

ls -lh /tmp/frp_0.52.3_linux_amd64.tar.gz
1

解压 + 安装 frpc

cd /tmp
tar -zxvf frp_0.52.3_linux_amd64.tar.gz
cd frp_0.52.3_linux_amd64

cp frpc /usr/local/bin/
chmod +x /usr/local/bin/frpc
mkdir -p /etc/frp

# 验证
/usr/local/bin/frpc --version      

# 应输出 0.52.3
1
2
3
4
5
6
7
8
9
10
11
12

写配置文件

vi /etc/frp/frpc.toml
1

内容(你当前这版):

serverAddr = "39.99.123.230"
serverPort = 7000

# frps.toml 里没配 auth.token,所以这里不要写 auth 段

log.to = "/var/log/frpc.log"
log.level = "info"
log.maxDays = 7

# ===== SQL Server 1443 =====
[[proxies]]
name = "hikvision-1443"
type = "tcp"
localIP = "127.0.0.1"
localPort = 1443
remotePort = 6300

# ===== 6200 =====
[[proxies]]
name = "hikvision-6200"
type = "tcp"
localIP = "127.0.0.1"
localPort = 6200
remotePort = 6200
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24

注意:

  • name 两条不同
  • remotePort 两条不同(6300、6200)
  • 不写 auth(因为服务端没配 token)
  • localPort 是你本机服务真实端口(1443、6200)

重启

杀干净旧进程 + 手动跑一次验证

pkill -9 frpc
sleep 1
ps aux | grep frpc        # 确认只剩 grep 自己

/usr/local/bin/frpc -c /etc/frp/frpc.toml
1
2
3
4
5

成功的样子:

login to server success
start proxy success
start proxy success      ← 两条
1
2
3

同时云服务器看 frps 日志:

docker logs -f frps
1

应看到:

new proxy [hikvision-1443] type [tcp] success
new proxy [hikvision-6200] type [tcp] success
1
2

两边都 success → Ctrl+C 停掉,进入下一步。

后台常驻 + 开机自启

先确认 PID 1 是不是 systemd

ps -p 1 -o comm=
1
  • 是 systemd → 用 systemd(推荐)
vi /etc/systemd/system/frpc.service
1
[Unit]
Description=frp client
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frpc -c /etc/frp/frpc.toml
LimitNOFILE=1048576

[Install]
WantedBy=multi-user.target
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

执行

systemctl daemon-reload
systemctl enable frpc
systemctl start frpc
systemctl status frpc
tail -f /var/log/frpc.log
1
2
3
4
5
  • 不是 systemd → 用 nohup + crontab

    手动后台跑:

    pkill -9 frpc
    nohup /usr/local/bin/frpc -c /etc/frp/frpc.toml >/var/log/frpc.log 2>&1 &
    tail -f /var/log/frpc.log
    
    1
    2
    3

    配开机自启:

    crontab -e
    
    1

    加一行(如果是在 crontab -e root 用户下,不用写 root;如果是 /etc/crontab,要写 root):

    @reboot /usr/local/bin/frpc -c /etc/frp/frpc.toml >/dev/null 2>&1 &
    
    1

云服务器安全组放行新端口

你 remotePort 改成了 6300 和 6200。云服务器安全组要放行:

  • 6300(TCP)
  • 6200(TCP)

(7000 之前已放行。)

frps 是 host 模式,compose 不用改,frps 直接监听 6300、6200。


# 6、外网验证

# 6300(对应本机 1443)
telnet 39.99.123.230 6300

# 6200
telnet 39.99.123.230 6200
1
2
3
4
5

# 四、Cpolar(不推荐)

# 1、简介

官网 (opens new window)

NPS官方源码地址-GitHub (opens new window)

NPS官方下载 (opens new window)

公开一个本地Web站点至公网。

只需一行命令,就可以将内网站点发布至公网,方便给客户演示。高效调试微信公众号、小程序、对接支付宝网关等云端服务,提高您的编程效率。

# 2、使用

# 1)下载安装

在内网服务器,下载安装。

curl -L https://www.cpolar.com/static/downloads/install-release-cpolar.sh | sudo bash
1

向系统添加服务

sudo systemctl enable cpolar
1

启动Cpolar服务

sudo systemctl start cpolar
1

启动成功后,访问地址:【内网IP:9200】

# 2)注册Cpolar账户

注册 (opens new window)

输入用户名、登录邮箱(账号)、联系电话、密码。

登录 (opens new window)

a、选择免费套餐;

b、在验证菜单 (opens new window),复制验证token。

c、在内网服务器执行该认证。

cpolar authtoken xxxxxxxYmQtNGzLTgwMxxxxxxxxxxxxx
1

# 3)配置公网地址

a、添加隧道

点击左侧仪表盘的隧道管理—创建隧道,创建一个Nexus的公网地址隧道!

  • 隧道名称:可自定义命名,注意不要与已有的隧道名称重复;
  • 协议:选择红框中显示的http;
  • 本地地址:内网要穿透的服务的端口,例:8081;
  • 域名类型:选择随机域名;
  • 地区:选择China;

注意:

  1. 使用随机域名,不固定,隔一段时间就变。(免费的蛋糕你还想一直吃...)
  2. 若有自己的域名,建议选择二级子域名、自定义域名。(但这2种类型,需要把当前Cpolar账户升级为付费版哦)

b、访问域名

创建隧道成功后,点击左侧仪表盘的状态—在线隧道列表,可查看到刚生成的隧道有2种访问方式(http和https)。

任意复制一个即可进行访问。

自此,一个内网系统,即可通过Cpolar,生成域名进行互联网访问!