局域网(LAN)内的所有设备通常共享一个出口 IP(NAT),广域网无法直接访问局域网内的某一设备,主要有以下限制
- NAT(网络地址转换)
- 防火墙
- 动态公网 IP
内网穿透技术就是突破这一限制。这样就可以在外部很方便地直接访问内部设备,比如进行 ssh 连接内网某台 linux 主机
实现方式
- 工具:frp,一台具有公网 IP 的服务器
- 端口转发(Port Forwarding)
将路由器某个特定的公网端口的请求,转发到内网中某个设备的私有 IP 地址和端口上 - 打洞
- 代理转发(Proxy)
通过一个具有公网 IP 地址的中心服务器作为中转站,eg FRP
在 ubuntu 上使用 FRP 实现代理转发
开启 ubuntu 的 ssh 功能
安装 openssh
sudo apt update
sudo apt install openssh-server
查看 ssh 状态
sudo systemctl status ssh
启动 ssh
sudo systemctl start ssh
设置开机自启
sudo systemctl enable ssh
ubuntu 自带 ufw 防火墙
先启动防火墙,这样会阻止一切未允许的服务
sudo ufw enable
允许 ssh 连接(默认是 22 端口)
sudo ufw allow ssh
安装并启动 FRP 服务
从 github 仓库下载 ubuntu 的 FRP 包 ,在公网 IP 的服务器与局域网服务器各安装一份,进入解压后的文件夹
首先在广域网服务器启动 server 端服务
./frps -c ./frps.toml
并且打开与局域网建立连接的 端口 7000,以及对公网暴露的端口 6000 用于 ssh 访问等(也可以设置成其他非特殊端口)
然后在局域网服务器,先修改 frpc.toml 文件
serverAddr = "your_server_ip" # 公网IP
serverPort = 7000 # 与局域网连接的端口
# 如果frps设置了token,这里需要加上
# token = "your_auth_token"
[[proxies]]
name = "linux1-ssh" # 代理名称必须唯一
type = "tcp"
localIP = "127.0.0.1"
localPort = 22 # 假设SSH服务在本机的22端口
remotePort = 6000 # 公网暴露的端口
启动 FRP 的 client 端服务
./frpc -c ./frpc
如果成功连接,会同时在两个端显示成功连接信息
在外网通过 ssh 访问局域网服务器
ssh -p 6000 user@ip
第一次连接需要同意认证指纹