通过frp实现内网穿透

951 阅读6分钟

1.下载软件包

wget https://github.com/fatedier/frp/releases/download/v0.32.0/frp_0.32.0_linux_amd64.tar.gz

2.解压

tar zxvf frp_0.32.0_linux_amd64.tar.gz
cd frp_0.32.0_linux_amd64

3.查看服务文件

# frpc.service  客户端服务文件
[Unit]
Description=Frp Client Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frpc -c /etc/frp/frpc.ini
ExecReload=/usr/bin/frpc reload -c /etc/frp/frpc.ini

[Install]
WantedBy=multi-user.target


# frps.service  服务器端服务文件
[root@localhost systemd]# cat frps.service
[Unit]
Description=Frp Server Service
After=network.target

[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/frps -c /etc/frp/frps.ini

[Install]
WantedBy=multi-user.target


# 把二进制文件移动到服务文件对应的地址,并且提高权限
# 允许绑定1024以下的端口,就这个问题弄了一晚上,卧槽无情
mv frps /usr/bin/
setcap cap_net_bind_service=+eip /usr/bin/frps

# 发现自
# https://cloud.tencent.com/developer/article/1526429
# 里面还有解除权限和端口转发

4.配置服务器端

cat >frps.ini<<EOF
[common]
bind_port=10086  # 与客户端绑定的通信端口
vhost_http_port=80 #访问客户端web服务自定义的端口号
EOF

# 创建服务器端服务文件对应的文件夹,并将修改好的服务文件复制过去
mkdir -p /etc/frp
cp frps.ini /etc/frp

# 将服务器的服务文件移动到linux下专门放服务文件的地方
cp systemd/frps.service /usr/lib/systemd/system


# 启动frp服务,并且设为开机启动
systemctl enable --now frps.service

# 查看端口有没有打开
ss -ntl

LISTEN      0      128          :::10086    :::*     users:(("frps",pid=8406,fd=7))
LISTEN      0      128          :::2222     ::       users:(("frps",pid=8406,fd=10))
LISTEN      0      128          :::111      :::*     users:(("rpcbind",pid=490,fd=11))
LISTEN      0      128          :::80       :::*     users:(("frps",pid=8406,fd=8))

5.配置客户端

cat >frpc.ini<<EOF
[common]
server_addr=47.93.200.163 # 公网服务器ip
server_port= 10086 # 与服务器端bind_port一致

# 公网通过ssh访问内部服务器
[ssh]
type=tcp  # 连接协议
local_ip=10.0.0.8 # 内网服务器ip
local_port=22 # ssh默认端口号
remote_poet=2222 # 自定义访问内部ssh端口号

# 公网访问内部web服务器以http方式
[web]
type=http # 访问协议
local_port=80 # 内部web服务的端口号
custom_domains=wyjn.icu/IP #所绑定的公网服务器域名
EOF

# 创建服务器端服务文件对应的文件夹,并将修改好的服务文件复制过去
mkdir -p /etc/frp
cp frpc.ini /etc/frp

# 将服务器的服务文件移动到linux下专门放服务文件的地方
cp systemd/frpc.service /usr/lib/systemd/system

# 启动frp服务,并且设为开机启动
systemctl enable --now frpc.service

6.访问

ssh -p 2222 root@47.93.200.163  用内网的root密码
ssh -p 2222 域名
web访问47.93.200.163/域名会访问到内网的机器上

7.脚本化

菜单-函数目录-函数体分离

菜单

[root@iz2ze6e74gz7l00leucekiz script]# cat execution.sh
#!/bin/bash
#
#********************************************************************
#Author:                wangjian
#QQ:                    3555409634
#Date:                  2020-03-15
#FileName:             execution.sh
#URL:                   NOT FOUND
#Description:          The test script
#Copyright (C):         2020 All rights reserved
#********************************************************************
. function

PS3="`echo -e "\e[1;32m输入函数序号:\e[0m"`"

select MENU in `awk -F"-" '{print $2}' function.repo|tr "\n" " "`;do
case $REPLY in
$REPLY)
`grep "^$REPLY" function.repo| awk -F"-" '{print $2}'`
;;

esac
done

函数目录

[root@iz2ze6e74gz7l00leucekiz script]# cat function.repo
1-disable_selinux
2-disable_firewall
3-install_frp_server
4-remove_frp_server
5-install_frp_client
6-remove_frp_client

函数体

#!/bash/bin
disable_selinux(){
 setenforce 0
 echo -e "\e[1;37msetenforce 0\e[0m"
 echo -e "\e[1;32m`getenforce`-selinux已临时禁用\e[0m"

 sed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
 echo -e "\e[1;37msed -i.bak 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config\e[0m" 
 echo -e  "\e[1;32mSElinux配置文件已修改,重新启动后才可生效\e[0m"
}

disable_firewall(){
 systemctl disable --now firewalld &> /dev/null
 echo -e "\e[1;37msystemctl disable --now firewalld &> /dev/null\e[0m"
 echo -e  "\e[1;32m防火墙已禁用且开机不会启动\e[0m"
}

install_frp_server(){
wget http://47.93.200.163/ssh/software/frp_0.32.0_linux_amd64.tar.gz
tar zxvf frp_0.32.0_linux_amd64.tar.gz 
cd frp_0.32.0_linux_amd64
mv frps /usr/bin/
setcap cap_net_bind_service=+eip /usr/bin/frps
cat >frps.ini<<EOF
[common]
bind_port = 10086
# 与客户端绑定的通信端口
vhost_http_port = 80
#访问客户端web服务自定义的端口号
EOF
mkdir -p /etc/frp
cp frps.ini /etc/frp
cp systemd/frps.service /usr/lib/systemd/system
systemctl enable --now frps.service
cd -
rm -rf frp_0.32.0_linux_amd64.tar.gz frp_0.32.0_linux_amd64
}

remove_frp_server(){
    
}

install_frp_client(){
wget http://47.93.200.163/ssh/software/frp_0.32.0_linux_amd64.tar.gz
tar zxvf frp_0.32.0_linux_amd64.tar.gz 
cd frp_0.32.0_linux_amd64
mv frps /usr/bin/
cat >frpc.ini<<EOF
[common]
server_addr = 47.93.200.163
# 公网服务器ip
server_port = 10086
# 与服务器端bind_port一致

# 公网通过ssh访问内部服务器
[ssh]
type = tcp
# 连接协议
local_ip = 10.0.0.8
# 内网服务器ip
local_port = 22
# ssh默认端口号
remote_port = 2222
# 自定义访问内部ssh端口号

#  公网访问内部web服务器以http方式
[web]
type = http
# 访问协议
local_port = 80
# 内部web服务的端口号
custom_domains = wyjn.icu
#所绑定的公网服务器域名
EOF
mkdir -p /etc/frp
cp frpc.ini /etc/frp

# 将服务器的服务文件移动到linux下专门放服务文件的地方
cp systemd/frpc.service /usr/lib/systemd/system

# 启动frp服务,并且设为开机启动
systemctl enable --now frpc.service
cd -
rm -rf frp_0.32.0_linux_amd64.tar.gz frp_0.32.0_linux_amd64

}

remove_frp_client(){
    
}

8.有关脚本化的感想

# 不足:模块化没有做
比如,frp内网穿透
类型一:可以做成一个模块
        一个模块四个功能
        客户端安装卸载
        服务端安装卸载
        之后做成一个小功能
        frp client/server install
        frp client/server remove
类型二:把安装和卸载的分类做在一起
        install frp client/server
        remove frp client/server

# 后期填充-脚本结构
模型1:菜单-模块目录-模块相关函数目录-函数体
模型2:菜单-功能目录-功能模块目录-函数体
# 有关功能模块的几点补充
安装-卸载-修改配置文件
# 有关功能模块目录的几点补充
install frp sever/client 
remove frp server/client
update frp server/client
# 个人想法
模型二的耦合性不足,太分散,无法形成有效的工具链
模块一随着软件历史发展,可以再进行耦合,将相同类型的软件再形成一层抽象层
比如:
菜单-功能目录-模块目录-模块相关函数目录-函数体
功能:比如说dns功能,有bind模块。dnsqmax模块???咳咳举个栗子

# 再到后期,可以对功能模块细化,根据业务和资源的不同进行细化
菜单-功能目录-轻量级/重量级-模块目录-模块相关函数目录-函数体

# 最终实现层层调用的同时,便于管理和进行耦合

9.提升脚本化能力

基本的文本处理三剑客要会常见用法
还有命令的调用,变量的调用有些小陷阱
``,"",''的区别和应用

10.常见的脚本化的过程中遇到的错误

1.服务起不来
首先jourxx -xe看日志
根据日志看问题
有的服务不报错,只能看日志,或者systenctl status xxx
或者直接看对应端口有没有开,之后再看日志,开了,基本就ok了ss -nutlp
比如:
端口占用
    80端口被占用无法绑定
1024以下的端口普通用户没有权限
    端口转发还是提升权限
文件无法读取
    文件加读权限或者修改所有者
2.无法通信
访问10.0.0.8的时候,长时间无响应
    我开了代理(vpn),走隧道到国外主机再访问再返回值能快嘛

11.这就是今晚的感想了,没想到装一个frp弄出这么多事,还好吧!还有好多服务啊!哈哈哈!赶紧学