[笔记] 使用frp从外网访问内网
之前尝试过otunnel
,也记录过使用方法,见[笔记] 使用otunnel从外网访问内网,但是用了几天发现还是不够稳定。
然后尝试frp
,发现性能稳定,够用,将过程及配置分享在这里吧。
需求
内网机器没有公网IP,但是可以访问外网,现在需要从外网访问内网机器。
举例,在家里机器A访问公司内网机器B。
前提
需要一台有公网IP的服务器S做中转,这样就可以打通AB两端了。
A <---> S <---> B
环境
- 家中A机,Win10
- 服务器S,Ubuntu 16.04 LTS 64 bit,公网IP: 123.12.23.13 (举例而已),SSH 端口: 22
- 内网B机,Ubuntu 18.04 LTS 64 bit,内网IP: 192.168.2.3 (举例而已),SSH 端口: 1122,用户名: shit
工具
大牛fatedier开发的frp,官网介绍如下:“frp 是一个可用于内网穿透的高性能的反向代理应用,支持 tcp, udp 协议,为 http 和 https 应用协议提供了额外的能力,且尝试性支持了点对点穿透。”
下载链接:frp,支持Mac,FreeBSD,Linux,OpenBSD,Windows等平台,当前最新版本是v0.28.2
教程
frp架构如下,在服务器上运行frps,在客户机上运行frpc。
官方教程:frp用法
最简配置实战
基于上面的环境,作如下操作:
在服务器S上下载frp并解压出
frps
和frps.ini
,修改frps.ini
如下:[common]
bind_port = 7000
启动
frps
:./frps -c ./frps.ini
这是在服务器S上监听端口7000。
在内网B机上下载frp并解压出
frpc
和frpc.ini
,修改frpc.ini
如下:[common]
server_addr = 123.12.23.13
server_port = 7000 [ssh]
type = tcp
local_ip = 192.168.2.3
local_port = 1122
remote_port = 6000
启动
frpc
:./frpc -c ./frpc.ini
这是从内网机器连接到服务器S的7000端口,以后外网SSH连接到服务器S的6000端口,就等价于连接到内网B机的1122端口
从家中A机的bash窗口运行SSH:
$ ssh shit@123.12.23.13 -p 6000
内网多HTTP服务透出配置实战
只是ssh肯定不够用,当然想将内网更多的HTTP服务透出啊,比方jupyter notebook
,或者内网机器上搭建的git server
。基于上面的环境,作如下操作:
修改服务器S上的配置文件
frps.ini
如下:[common]
bind_port = 7000
vhost_http_port = 8080
token = ohmygod
重新启动
frps
:./frps -c ./frps.ini
这是在服务器S上监听端口7000,同时将内网HTTP服务以8080端口透出,并且使用
ohmygod
作为Token加密。修改内网B机上的配置文件
frpc.ini
如下:[common]
server_addr = 123.12.23.13
server_port = 7000
token = ohmygod [ssh]
type = tcp
local_ip = 192.168.2.3
local_port = 1122
remote_port = 6000
use_encryption = true
use_compression = true [cmcc]
type = http
local_port = 10086
custom_domains = cmcc [unicom]
type = http
local_port = 10010
custom_domains = unicom
重新启动
frpc
:./frpc -c ./frpc.ini
这样就可以同时将内网的两个HTTP服务(cmcc和unicom)透出。
从家中A机的浏览器访问内网机B上的HTTP服务
修改
%windir%\system32\drivers\etc\hosts
文件,添加如下内容:123.12.23.13 cmcc
123.12.23.13 unicom
如果需要访问内网B机的
cmcc
服务,在浏览器中输入http://cmcc:8080
。如果需要访问内网B机的
unicom
服务,在浏览器中输入http://unicom:8080
。注意到了吗?访问的端口,都是8080,只是域名不同。服务器S会根据这个域名映射到内网B机真正的HTTP服务上。
[笔记] 使用frp从外网访问内网的更多相关文章
- [笔记] 使用otunnel从外网访问内网
需求 内网机器没有公网IP,但是可以访问外网,现在需要从外网访问内网机器. 举例,在家里机器A访问公司内网机器B. 前提 需要一台有公网IP的服务器S做中转,这样就可以打通AB两端了. A <- ...
- 简单物联网:外网访问内网路由器下树莓派Flask服务器
最近做一个小东西,大概过程就是想在教室,宿舍控制实验室的一些设备. 已经在树莓上搭了一个轻量的flask服务器,在实验室的路由器下,任何设备都是可以访问的:但是有一些限制条件,比如我想在宿舍控制我种花 ...
- 外网访问内网Docker容器
外网访问内网Docker容器 本地安装了Docker容器,只能在局域网内访问,怎样从外网也能访问本地Docker容器? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Docker容器 ...
- 外网访问内网SpringBoot
外网访问内网SpringBoot 本地安装了SpringBoot,只能在局域网内访问,怎样从外网也能访问本地SpringBoot? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装Java 1 ...
- 外网访问内网Elasticsearch WEB
外网访问内网Elasticsearch WEB 本地安装了Elasticsearch,只能在局域网内访问其WEB,怎样从外网也能访问本地Elasticsearch? 本文将介绍具体的实现步骤. 1. ...
- 怎样从外网访问内网Rails
外网访问内网Rails 本地安装了Rails,只能在局域网内访问,怎样从外网也能访问本地Rails? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Rails 默认安装的Rails端口 ...
- 怎样从外网访问内网Memcached数据库
外网访问内网Memcached数据库 本地安装了Memcached数据库,只能在局域网内访问,怎样从外网也能访问本地Memcached数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装 ...
- 怎样从外网访问内网CouchDB数据库
外网访问内网CouchDB数据库 本地安装了CouchDB数据库,只能在局域网内访问,怎样从外网也能访问本地CouchDB数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动Cou ...
- 怎样从外网访问内网DB2数据库
外网访问内网DB2数据库 本地安装了DB2数据库,只能在局域网内访问,怎样从外网也能访问本地DB2数据库? 本文将介绍具体的实现步骤. 1. 准备工作 1.1 安装并启动DB2数据库 默认安装的DB2 ...
随机推荐
- git fetch和pull的区别
Git中从远程的分支获取最新的版本到本地有这样2个命令: 1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge 1 2 3 Git fetch origin master ...
- Web Api(4)
参考原文链接https://www.cnblogs.com/JamelAr/,本文大部分内容是根据这位博主进行实验测试的,非常感谢分享,另外也参考了https://www.cnblogs.com/vi ...
- .NET Core 3时代DevExpress Winforms v19.2增强Scheduler控件
DevExpress Winforms Controls 内置140多个UI控件和库,完美构建流畅.美观且易于使用的应用程序.无论是Office风格的界面,还是分析处理大批量的业务数据,DevExpr ...
- fastclick无需对IOS11及以上做处理
// 解决click点击300毫秒延时问题 (IOS11及以上无需处理) import FastClick from 'fastclick' const device = navigator.user ...
- vue 剪切图片上传头像,使用 cropperjs 实现
我使用的是vue,移动端的项目. 官网地址:cropperjs GitHub地址:https://github.com/fengyuanchen/cropperjs/blob/master/READM ...
- Mysql入门-对表数据的增删改查
这一部分是最简单的,也是最麻烦的.简单是因为其实只包括增删该插四个部分.大体上看,增加数据.删除数据.修改数据.查询数据都不麻烦啊,我们日常都是常用的.这个谁不会呢?以前在培训机构学mysql的时候, ...
- JVM(二),Java怎样实现一次编译到处运行(平台无关性)
二.Java怎样实现一次编译到处运行(平台无关性) 1.java平台无关性原理 Java源码首先被编译成字节码,再由不同平台的JVM进行解析,JAVA语言在不同的平台上运行时不需要进行重新编译,Jav ...
- Python基础之Python解释器
当我们在编写Python代码时,我们得到的是一个包含Python代码的,以.py为扩展名的文本文件.要运行代码,就需要Python解释器去执行.py文件. 由于整个Python语言从规范到解释器都是开 ...
- 存储映射--mmap
存储映射 使一个磁盘文件与存储空间中的一个缓冲区相映射. 当从缓冲区中取数据,就相当于读文件中的相应字节. 将数据存入缓冲区,则相应的字节就自动写入文件. 使用这种方法,首先应通知内核,将一个指定文件 ...
- Spring Boot教程(三十五)使用MongoDB数据库(1)
MongoDB简介 MongoDB是一个基于分布式文件存储的数据库,它是一个介于关系数据库和非关系数据库之间的产品,其主要目标是在键/值存储方式(提供了高性能和高度伸缩性)和传统的RDBMS系统(具有 ...