内网穿透的作用
内网穿透是指在一个局域网内(也称内网)中,通过某种技术手段,将局域网内部的网络资源(如ssh服务、Web服务、数据库等)暴露到公网中,从而实现公网用户对内网资源的访问和控制。它可以使得外部用户能够访问局域网内部的设备和服务,从而达到远程控制、监控、协作等目的。内网穿透通常需要使用专门的工具或软件,例如ngrok、frp、zerotier等,这些工具可以通过各种方式(如端口映射、反向代理等)来实现内网穿透功能。内网穿透技术已经被广泛应用于云服务器、远程办公、物联网等领域。
常见内网穿透方式
实现服务器内网穿透的工具有很多,其中比较常用的有以下几种:
- ngrok:一种基于HTTP和TCP隧道技术的内网穿透工具,可以将本地的Web应用、SSH、RDP等服务映射到公网上,支持多平台使用,无需配置路由器,可以快速方便地进行内网穿透。
- frp:一种高性能的内网穿透工具,支持TCP、UDP、HTTP等多种协议,可用于远程访问和控制内网中的服务,支持多平台使用,配置简单,易于使用。
- zerotier:一种基于SD-WAN技术的内网穿透工具,可以将多个不同地理位置的计算机组成虚拟局域网,实现对内网服务的访问和控制,支持多平台使用,易于配置和使用。
在使用上述工具之前,需要准备以下材料:
- 一台服务器,用于承载内网穿透工具和需要远程访问的服务。
- 一个公网IP地址或者域名,用于映射内网服务器的IP地址和端口(或者直接使用花生壳的服务)。
- 网络端口的设置和配置,包括路由器和防火墙的配置,以确保内网穿透的安全性和稳定性。
根据所选的内网穿透工具,需要下载相应的软件包,并按照其官方文档进行配置和使用。下面将介绍frp实现内网穿透的详细设置。
frp内网穿透设置
frp内网穿透设置
frp内网穿透的基本原理可通过下图来了解。frp服务端软件将内网的CS-Monitor服务器映射到云服务器的公网IP地址上,接入外网的读者计算机,并和云服务器一起组成新的信息邮局,为终端与人机交互系统提供服务。
frp由两部分组成,即frpc和frps。其中,frpc是客户端程序,用于连接服务器端的frps,并将内网的服务映射到公网。而frps是服务端程序,用于接受来自frpc的连接请求,并将请求转发到内网中的服务上。
启动frps
要在有公网IP的云主机上开启frps服务,您可以按照以下步骤进行操作:
wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz
# https://github.com/fatedier/frp/releases查看最新版本frp
tar -xzf frp_0.48.0_linux_amd64.tar.gz
mv frp_0.48.0_linux_amd64 frp
cat > frps.ini <<-EOF
[common]
# bind_port = 12326
# or
allow_ports = 12320-12330
authentication_method = $(token***)
EOF
# 替换$(token***)为对应token,从而保证其安全性
# 注意:如果在云主机启动frps服务,则需要在云主机的控制台设置安全组,开放12320-12330端口
cat > /etc/systemd/system/frps.service <<-EOF
[Unit]
Description=Frp Server
After=network.target
ConditionPathExists=/usr/local/frp/frps
[Service]
Type=simple
DynamicUser=true
ExecStart=/usr/local/frp/frps -c /etc/frp/frps.ini
Restart=always
[Install]
WantedBy=multi-user.target
EOF
sudo mkdir /usr/local/frp
sudo cp frps /usr/local/frp/
sudo chown root:root /usr/local/frp/frps
sudo mkdir /etc/frp
sudo cp frps.ini /etc/frp/
sudo chown root:root /etc/frpc/frps.ini
# 启动frps服务并设置开机自启
sudo systemctl start frps
sudo systemctl enable frps
Token Authentication
When specifyingauthentication_method = token
under [common] in frpc.ini and frps.ini - token based authentication will be used.
Make sure to specify the same token in the [common] section in frps.ini and frpc.ini for frpc to pass frps validation
systemd的更多有关内容请查看systemd服务启动frpc。
启动frpc
命令行启动frpc
在需要反向代理的设备上设置frpc。
wget https://github.com/fatedier/frp/releases/download/v0.48.0/frp_0.48.0_linux_amd64.tar.gz
# https://github.com/fatedier/frp/releases查看最新版本frp
tar -xzf frp_0.48.0_linux_amd64.tar.gz
mv frp_0.48.0_linux_amd64 frp
cd frp
cat >> frpc.ini <<-EOF
[common]
server_addr = IP
server_port = 12300
token = $(token***)
[fmm]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 12326
EOF
# 修改对应配置文件,token部分为frp server短的token
# local_port为本机需要内网穿透的服务所在端口
# remote_port为远端端口该端口,该端口需要安全组配置
./frpc -c frpc.ini
# 尝试根据ssh -p12326 user@ip登录
# 如果登陆成功,表明命令行方式启动正常
# Ctrl+c终止frpc进程,并尝试设置systemd服务
systemd服务启动frpc
Systemd是一种Linux操作系统的初始化系统和服务管理器,它是在引导时第一个启动的进程,并负责启动和管理所有系统服务。相比于传统的init守护进程和Upstart系统,systemd拥有更为现代化的设计理念和更高效的实现方式。Upstart系统类似于原来的SysVinit系统,需要依赖于init脚本来激活服务,以及运行级的概念。而systemd采用一种基于单元文件的配置方式,可以通过简单的配置文件来管理系统服务,避免了编写繁琐脚本的工作。此外,systemd还引入了新的特性和功能,如原生支持容器化应用、更丰富的日志管理能力等,使得系统管理更为便捷和高效。
cat > /etc/systemd/system/frpc.service <<-EOF
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/frp/frpc -c /etc/frpc/frpc.ini
[Install]
WantedBy=multi-user.target
EOF
sudo mkdir /usr/local/frp
sudo cp frpc /usr/local/frp/
sudo chown root:root /usr/local/frp/frpc
sudo mkdir /etc/frpc
sudo cp frpc.ini /etc/frpc/
sudo chown root:root /etc/frpc/frpc.ini
systemctl start frpc
systemctl status frpc
# 尝试根据ssh -p12326 user@ip登录
# 如果登陆成功,表明systemd服务方式启动正常
systemctl enable frpc
# 设置服务开机自启
如果服务器本身无法直接访问网络,则在ExecStart
前添加service所需的代理环境变量:
cat > /etc/systemd/system/frpc.service <<-EOF
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
Environment="http_proxy=http://$(Proxy_IP):7890"
Environment="https_proxy=http://$(Proxy_IP):7890"
Environment="all_proxy=http://$(Proxy_IP):7890"
ExecStart=/usr/local/frp/frpc -c /etc/frpc/frpc.ini
[Install]
WantedBy=multi-user.target
EOF
# 修改完毕之后,尝试重新加载配置和重启服务
sudo systemctl daemon-reload
sudo systemctl restart frpc
# 尝试根据ssh -p12326 user@ip登录
# 如果登陆成功,表明systemd服务方式启动正常
重启设备之后,可sudo cat /var/log/dmesg | grep frpc
或者sudo dmesg | grep frpc
查看服务启动日志,得到/etc/systemd/system/frpc.service:7: Special user nobody configured, this is not safe!
的提醒。
新版systemd引入了一项新的安全规范来替代使用nobody的做法,以提高系统的安全性和稳定性。
将User=nobody
替换为DynamicUser=true
即可
cat > /etc/systemd/system/frpc.service <<-EOF
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
# User=nobody
DynamicUser=true
Restart=on-failure
RestartSec=5s
Environment="http_proxy=http://$(Proxy_IP):7890"
Environment="https_proxy=http://$(Proxy_IP):7890"
Environment="all_proxy=http://$(Proxy_IP):7890"
ExecStart=/usr/local/frp/frpc -c /etc/frpc/frpc.ini
[Install]
WantedBy=multi-user.target
EOF
# 修改完毕之后,尝试重新加载配置和重启服务
sudo systemctl daemon-reload
sudo systemctl restart frpc
# 尝试根据ssh -p12326 user@ip登录
# 如果登陆成功,表明systemd服务方式启动正常
重启设备之后,可sudo cat /var/log/dmesg | grep frpc
或者sudo dmesg | grep frpc
查看服务启动日志,得到/etc/systemd/system/frpc.service:7: Special user nobody configured, this is not safe!
的提醒。
新版systemd引入了一项新的安全规范来替代使用nobody的做法,以提高系统的安全性和稳定性。
将User=nobody
替换为DynamicUser=true
即可
cat > /etc/systemd/system/frpc.service <<-EOF
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
# User=nobody
DynamicUser=true
Restart=on-failure
RestartSec=5s
Environment="http_proxy=http://$(Proxy_IP):7890"
Environment="https_proxy=http://$(Proxy_IP):7890"
Environment="all_proxy=http://$(Proxy_IP):7890"
ExecStart=/usr/local/frp/frpc -c /etc/frpc/frpc.ini
[Install]
WantedBy=multi-user.target
EOF
# 修改完毕之后,尝试重新加载配置和重启服务
sudo systemctl daemon-reload
sudo systemctl restart frpc