阿里云服务器搭建frps实现内网穿透
frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。想要配置frp穿透,首先必须先要有一台具有外网ip(即:可以外网访问)的服务器,这里使用阿里云ECS云服务器。
·
简介
frp 是一个开源、简洁易用、高性能的内网穿透和反向代理软件,支持 tcp, udp, http, https等协议。官网
- 服务端运行,监听一个主端口,等待客户端的连接;
- 客户端连接到服务端的主端口,同时告诉服务端要监听的端口和转发类型;
- 服务端fork新的进程监听客户端指定的端口;
- 外网用户连接到客户端指定的端口,服务端通过和客户端的连接将数据转发到客户端;
- 客户端进程再将数据转发到本地服务,从而实现内网对外暴露服务的能力。
想要配置frp穿透,首先必须先要有一台具有外网ip(即:可以外网访问)的服务器,这里使用阿里云ECS云服务器
服务端(阿里云ECS云服务器——ubuntu系统)
# 下载linux版本
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.33.0_linux_amd64.tar.gz
# 进入目录
cd frp_0.33.0_linux_amd64/
# 打开配置文件
vim frps.ini
修改配置文件如下
[common]
# frp监听的端口,默认是7000(测试时发现开放了7000端口但是客户端连接超时,建议改为其他)
bind_port = 8000
# 授权码,请改成更复杂的
# 这个token之后在客户端会用到
token = 52010
# frp管理后台端口,请按自己需求更改
dashboard_port = 7500
# frp管理后台用户名和密码,请改成自己的
dashboard_user = admin
dashboard_pwd = admin
enable_prometheus = true
# frp日志配置
log_file = /var/log/frps.log
log_level = info
log_max_days = 3
设置开机启动
sudo mkdir -p /etc/frp
sudo cp frps.ini /etc/frp
sudo cp frps /usr/bin
sudo cp systemd/frps.service /usr/lib/systemd/system/
sudo systemctl enable frps
sudo systemctl start frps
防火墙开放端口
# 添加监听端口
sudo firewall-cmd --permanent --add-port=8000/tcp
# 添加管理后台端口
sudo firewall-cmd --permanent --add-port=7500/tcp
sudo firewall-cmd --reload
修改服务器控制台安全组,这里全开放端口
打开后端控制网站(http://ip:7500)
客户端(内网服务器——ubuntu系统)
# 下载linux版本
wget https://github.com/fatedier/frp/releases/download/v0.33.0/frp_0.33.0_linux_amd64.tar.gz
# 解压
tar -zxvf frp_0.33.0_linux_amd64.tar.gz
# 进入目录
cd frp_0.33.0_linux_amd64/
# 打开配置文件,注意,这里是 frpc.ini
vim frpc.ini
修改配置文件如下
# 客户端配置
[common]
server_addr = 服务器ip
server_port = 8000 # 与frps.ini的bind_port一致
token = 52010 # 与frps.ini的token一致
# 配置ssh服务,[ssh]这样的名称必须全局唯一
[ssh]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6000 # 这个自定义,之后再ssh连接的时候要用
# 配置http服务,可用于小程序开发、远程调试等,如果没有可以不写下面的
[web]
type = http
local_ip = 127.0.0.1
local_port = 8080
subdomain = test.hijk.pw # web域名
remote_port = 自定义的远程服务器端口,例如8080
自启动
cd /etc/systemd/system
sudo touch frpc.service
[Unit]
Description=My Frp Client Service - %i
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
Restart=on-failure
RestartSec=5s
ExecStart=/bin/bash -c '/home/hsp/Desktop/frpc/frp_0.42.0_linux_amd64/frpc -c /home/hsp/Desktop/frpc/frp_0.42.0_linux_amd64/frpc.ini'
[Install]
WantedBy=multi-user.target
# 启动
sudo systemctl start frpc
# 查看状态
sudo systemctl status frpc
# 开机启动
sudo systemctl enable frpc
一些容器没有systemctl,可以使用 sysv-rc-conf
apt-get install sysv-rc-conf
touch /etc/init.d/frpc
chmod +x /etc/init.d/frpc
## File: /etc/init.d/frpc
#!/bin/sh
#
# frps: FRP-Client Daemon
#
# description: FRP-Client Daemon
# 请按实际情况修改
PID_FILE=/run/frpc.pid
CONFIG_FILE=/etc/frpc.ini
FRPC_File=/usr/local/frp/frpc
start()
{
if [ ! -f $PID_FILE ]; then
echo -n $"Starting FRP client..."
nohup $FRPC_File -c $CONFIG_FILE < /dev/null > /dev/null 2> /dev/null &
echo $! > $PID_FILE
echo ""
else
PID=$(cat $PID_FILE)
if [ ! -f /proc/$PID/cmdline ]; then
echo -n $"Starting FRP client..."
nohup $FRPC_File -c $CONFIG_FILE < /dev/null > /dev/null 2> /dev/null &
echo $! > $PID_FILE
echo ""
else
echo "FRP client is already running..."
fi
fi;
}
stop()
{
if [ -f $PID_FILE ]; then
echo -n $"Shutting down FRP client..."
kill -9 $(cat $PID_FILE)
rm -f $PID_FILE
echo ""
else
echo "FRP client is not running..."
fi;
}
status()
{
if [ -f $PID_FILE ]; then
PID=$(cat $PID_FILE)
if [ -f /proc/$PID/cmdline ]; then
echo "FRP client is running..."
else
echo "FRP client is not running..."
rm -f $PID_FILE
fi
else
echo "FRP client is not running..."
fi;
}
[ -f $FRPC_File ] || exit 1
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status
;;
restart)
stop
sleep 3
start
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
exit 1
esac
exit 0
# 添加到自动任务
sysv-rc-conf frpc
# 打开管理
sysv-rc-conf
图中打X的即表示运行在对应Runlevel时开机启动的服务,空格反选,q退出。
Linux 系统主要启动步骤
1. 读取 MBR 的信息,启动 Boot Manager
Windows 使用 NTLDR 作为 Boot Manager,如果您的系统中安装多个
版本的 Windows,您就需要在 NTLDR 中选择您要进入的系统。
Linux 通常使用功能强大,配置灵活的 GRUB 作为 Boot Manager。
2. 加载系统内核,启动 init 进程
init 进程是 Linux 的根进程,所有的系统进程都是它的子进程。
3. init 进程读取 /etc/inittab 文件中的信息,并进入预设的运行级别,
按顺序运行该运行级别对应文件夹下的脚本。脚本通常以 start 参数启
动,并指向一个系统中的程序。
通常情况下, /etc/rcS.d/ 目录下的启动脚本首先被执行,然后是
/etc/rcN.d/ 目录。例如您设定的运行级别为 3,那么它对应的启动
目录为 /etc/rc3.d/ 。
4. 根据 /etc/rcS.d/ 文件夹中对应的脚本启动 Xwindow 服务器 xorg
Xwindow 为 Linux 下的图形用户界面系统。
5. 启动登录管理器,等待用户登录
Ubuntu 系统默认使用 GDM 作为登录管理器,您在登录管理器界面中
输入用户名和密码后,便可以登录系统。(您可以在 /etc/rc3.d/
文件夹中找到一个名为 S13gdm 的链接)
Ubunto中的运行级别
/etc/rc0.d Run level 0
/etc/rc1.d Run level 1
/etc/rc2.d Run level 2
/etc/rc3.d Run level 3
/etc/rc4.d Run level 4
/etc/rc5.d Run level 5
/etc/rc6.d Run level 6
#启动
service frpc start
#停止
service frpc stop
#重启
service frpc restart
#查看状态
service frpc status
此外可以使用crontab定时任务
编写启动脚本 run_frpc.sh
#!/bin/bash
export PATH=/usr/sbin:/usr/bin:/bin:/usr/local/sbin:/usr/local/bin:$PATH
FRPC_STATUS=$(service frpc status)
if ! [[ $FRPC_STATUS == *"is running"* ]]; then
echo "$(date): frpc is not running, restarting..."
service frpc restart
if [ $? -eq 0 ]; then
echo "$(date): frpc restarted successfully."
else
echo "$(date): frpc restart failed."
fi
else
echo "$(date): frpc is running."
fi
指定执行权限
chmod +x /data/software/frp_0.33.0_linux_amd64/run_frpc.sh
添加定时任务
crontab -e
# 在最后添加一行,每分钟执行check_frpc.sh脚本,并将标准输出(>> /path/to/your/script/run.log)和标准错误(2>&1)都追加到run.log文件中
* * * * * /data/software/frp_0.33.0_linux_amd64/run_frpc.sh >> /data/software/frp_0.33.0_linux_amd64/run.log 2>&1
测试
ssh 内网服务器用户名@阿里云服务器公网ip -p 端口号(内网配置中的remote_port)
多个客户端
用一个frps连接多个frpc,原理上多个frpc和frps绑定同一个端口,但是多个frpc用不同的remote_port连接
第二个 frpc
[common]
server_addr = 服务器ip
server_port = 8000 # 与frps.ini的bind_port一致
token = 52010 # 与frps.ini的token一致
# 多个客户端,名称不要重复
[ssh1]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6001 # 远程连接端口不要重复
第三个 frpc
[common]
server_addr = 服务器ip
server_port = 8000 # 与frps.ini的bind_port一致
token = 52010 # 与frps.ini的token一致
# 多个客户端,名称不要重复
[ssh2]
type = tcp
local_ip = 127.0.0.1
local_port = 22
remote_port = 6002 # 远程连接端口不要重复
密钥登录
上述内网穿透会暴露内网服务器,容易被黑客攻击,密码容易被破解挖矿,因此,可以采用去掉服务器密码登录,采用密钥登录,具体参考Ubuntu18.04设置SSH密钥登录
更多推荐
已为社区贡献2条内容
所有评论(0)