frps 内网穿透
原文:https://blog.csdn.net/jiuweideqixu/article/details/120167410
内网穿透的作用包括跨网段访问一个局域网中的一台主机
如上图,假设我们想要通过主机A访问主机C,但是主机A和主机C绑定的都是私有ip地址,所以它们之间是无法直接进行通信的。要想使得A和C能够进行通信,就需要用到内网穿透的技术。
我们可以借助frps(服务端)和frpc(客户端)来实现主机A对主机C的访问。
需要做的是:
1.在绑定了公网ip的主机B中配置frps(服务端)
2.在主机C中配置frpc(客户端)
frps/frpc的工具包的github地址是:
Releases · fatedier/frp · GitHub
下载适合自己机器的版本即可。
在服务端,即主机B中,编辑frps.ini文件:
[common] bind_port = 7000 # 服务端与客户端通信端口 dashboard_port = 7500 # 后台管理端口 dashboard_user = admin # 后台登录用户名 dashboard_pwd = admin vhost_http_port = 7002 # http穿透端口 ,访问端口时,frp将http请求转发到内网服务器 vhost_https_port = 7003 # https穿透端口,访问端口时,frp将http请求转发到内网服务器 max_pool_count = 50 token = aaa123 # 身份验证令牌,frpc要与frps一致 tcp_mux = true log_file = /usr/local/frp/frps.log # 日志相关 log_level = info log_max_days = 3 authentication_timeout = 0 # 服务器与客户端时间相差15min会连接失败,0表示不验证 subdomain_host = feng.top # 注册的域名 privilege_mode = true
然后可以启动服务端,切换到frps软件的解压目录之后,使用命令:
./frps -c frps.ini
在客户端,即主机C中,编辑frpc.ini文件:
[common] server_addr = x.x.x.x # frps公网服务器ip server_port = 7000 # frps公网服务端通信端口 token = aaa123 # 令牌,与frps公网服务端保持一致 tcp_mux = true log_file = /usr/local/frp/frpc.log # 日志相关 log_level = info log_max_days = 3 authentication_timeout = 0 # 服务器与客户端时间相差15min会连接失败,0表示不验证 [ssh] # 不能重复 远程windows 需要内网电脑开启远程桌面 type = tcp local_ip = 127.0.0.1 local_port = 3389 remote_port = 33389 # 不能重复 [web01] type = http local_ip = 127.0.0.1 local_port = 8002 custom_domains = 1.feng.top # 通过域名解析 由于frps公网服务配置的http端口是7002,所以请求 1.feng.top:7002 [web02] type = http local_ip = 127.0.0.1 local_port = 8003 custom_domains = 2.feng.top # 通过域名解析 由于frps公网服务配置的http端口是7002,所以请求 2.feng.top:7002 [web03] type = tcp local_ip = 127.0.0.1 local_port = 8004 remote_port = 8004 [mysql] type = tcp local_ip = 127.0.0.1 local_port = 3306 remote_port = 33306
客户端会根据frpc.ini文件中配置的server的ip以及port 与 服务端监听的7000端口进行连接
客户端使用命令连接到服务端:
./frpc -c frpc.ini
这里主机C(客户端)相当于是充当了反向代理的角色,而主机B(服务端)充当了正向代理的角色。
正向代理是代理客户端,为客户端收发请求,使真实客户端对服务器不可见;而反向代理是代理服务器端,为服务器收发请求,使真实服务器对客户端不可见。
因此,主机B用来接收主机A发送过来的请求,然后主机B将请求转发给主机C,从而主机A和主机C就能够进行通信了。
比如根据上面frpc.ini配置的ssh的内容,可知主机A通过ssh访问主机B的20022端口的时候,主机B会把该请求转发给主机C的22端口,因此主机A和主机C就建立了ssh的连接。
举例:
Windows中openssh的下载地址是:mls-software.com,安装完成之后,可以直接在powershell的命令行中调用ssh命令。
现在通过主机A(WIndows7)进行ssh访问,我们还知道主机B和主机C都是linux系统。
假设主机C中有两个用户,一个用户的用户名是acat,另一个用户的用户名是oracle,
那么ssh命令的格式是为: ssh -p 公网的转发端口 主机C的用户名@公网的ip
同样,可以使用SFTP协议传输文件,相当于是使用SCP命令来完成这种操作,因为SCP相当于是传输文件的过程中加了密。
命令格式:
把主机A(本地机器WIndows7)上的文件传到主机C:(注意这里的P是大写的)
scp -P 公网的转发端口 主机A文件路径 主机C用户名@公网ip地址:主机C文件路径
拉取主机C上的文件到主机A(本地机器Windows7)中:
scp -P 公网的转发端口 主机C用户名@公网ip地址:主机C文件路径 主机A的目录