使用frp进行内网穿透

frp-GitHub

服务器端

  • 下载合适的版本(查看版本arch

  • 解压tar -zxvf frp_0.22.0_linux_amd64.tar.gz

  • 配置frps.ini

    [common]
    bind_port = 7000
    dashboard_port = 7500
    token = 12345678
    dashboard_user = admin
    dashboard_pwd = admin
    vhost_http_port = 10080
    vhost_https_port = 10443
    • “bind_port”表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。
    • “dashboard_port”是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.x为VPS的IP)查看frp服务运行信息。
    • “token”是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。
    • “dashboard_user”和“dashboard_pwd”表示打开仪表板页面登录的用户名和密码,自行设置即可。
    • “vhost_http_port”和“vhost_https_port”用于反向代理HTTP主机时使用,本文不涉及HTTP协议,因而照抄或者删除这两条均可。
  • 运行
    ./frps -c frps.ini

客户端(Windows)

  • 下载、解压

  • 修改frpc.ini配置

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    token = 12345678
    [rdp]
    type = tcp
    local_ip = 127.0.0.1           
    local_port = 3389
    remote_port = 7001  
    [smb]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 445
    remote_port = 7002
    • “server_addr”为服务端IP地址,填入即可。
    • “server_port”为服务器端口,填入你设置的端口号即可,如果未改变就是7000
    • “token”是你在服务器上设置的连接口令,原样填入即可。
    • “[xxx]”表示一个规则名称,自己定义,便于查询即可。
    • “type”表示转发的协议类型,有TCP和UDP等选项可以选择,如有需要请自行查询frp手册。
    • “local_port”是本地应用的端口号,按照实际应用工作在本机的端口号填写即可。
    • “remote_port”是该条规则在服务端开放的端口号,自己填写并记录即可。
RDP,即Remote Desktop 远程桌面,Windows的RDP默认端口是3389,协议为TCP,建议使用frp远程连接前,在局域网中测试好,能够成功连接后再使用frp穿透连接。
SMB,即Windows文件共享所使用的协议,默认端口号445,协议TCP,本条规则可实现远程文件访问。

Shell目录下执行:./frpc -c frpc.ini

  • windows后台运行
    @echo off
    if "%1" == "h" goto begin
    mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
    :begin
    REM
    C:\frp\frpc -c C:\frp\frpc.ini
    exit

客户端(Linux)

  • 下载合适的版本(同服务端一样)

  • 编辑客户端配置frpc.ini

    [common]
    server_addr = x.x.x.x
    server_port = 7000
    token = 12345678
    [PCSSH]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 22
    remote_port = 7003
  • 运行./frpc -c frpc.ini

web端查看frp运行状态

http://x.x.x.x:7500/static/#/proxies/tcp

  • initState:widget创建执行的第一个方法,可以再里面初始化一些数据,以及绑定控制器
  • didChangeDependencies:当State对象的依赖发生变化时会被调用;例如:在之前build() 中包含了一个InheritedWidget,然后在之后的build() 中InheritedWidget发生了变化,那么此时InheritedWidget的子widget的didChangeDependencies()回调都会被调用。InheritedWidget这个widget可以由父控件向子控件共享数据,案例可以参考 scoped_model开源库。
  • build :它主要是用于构建Widget子树的。
  • reassemble:此回调是专门为了开发调试而提供的,在热重载(hot reload)时会被调用,此回调在Release模式下永远不会被调用。
  • didUpdateWidget:当树rebuid的时候会调用该方法。
  • deactivate:当State对象从树中被移除时,会调用此回调。
  • dispose():当State对象从树中被永久移除时调用;通常在此回调中释放资源。

注:代码中的didChangeAppLifecycleState方法复写需要State with WidgetsBindingObserver这个抽象类

@override
  void initState() {
    // TODO: implement initState
    super.initState();
    WidgetsBinding.instance.addObserver(this);
    print('initState');
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    print(state.toString());
  }

  @override
  void didChangeDependencies() {
    // TODO: implement didChangeDependencies
    super.didChangeDependencies();
    print('didChangeDependencies');
  }

  @override
  void didUpdateWidget(LifeDemo oldWidget) {
    // TODO: implement didUpdateWidget
    super.didUpdateWidget(oldWidget);
    print('didUpdateWidget');
  }

  @override
  Widget build(BuildContext context) {
    print('build');
    // TODO: implement build
    return MaterialApp(
      home: Center(
          child: GestureDetector(
        child: new Text('lifeCycle'),
        onTap: () {
          Navigator.of(context)
              .push(new MaterialPageRoute(builder: (BuildContext c) {
            return new Text('sdfs');
          }));
        },
      )),
    );
  }
  @override
  void reassemble() {
    // TODO: implement reassemble
    super.reassemble();
    print('reassemble');
  }
  @override
  void deactivate() {
    // TODO: implement deactivate
    super.deactivate();
    print('deactivate');
  }

  @override
  void dispose() {
    // TODO: implement dispose
    super.dispose();
    WidgetsBinding.instance.addObserver(this);
    print('dispose');
  }

添加catchtouchmove


    <view wx:if="{{alert}}" catchtouchmove="myCatchTouch">
        <template is="alert" data="{{alertData}}" />
    </view>
  myCatchTouch: function () {
    console.log('stop user scroll it!');
    return;
  },

针对catchtouchmove方法,原生小程序使用catchtouchmove="touchmoveHandler",mpvue中使用@touchmove.stop="touchmoveHandler",注意要给个空方法,否则会报警

CSS

给遮罩层加css

height: 100vh;
overflow: hidden;

查看原版本

java -version

显示如下

java version "1.7.0_101"
OpenJDK Runtime Environment (IcedTea 2.6.6) (7u101-2.6.6-0ubuntu0.14.04.1)
OpenJDK 64-Bit Server VM (build 24.95-b01, mixed mode)

安装 opensdk 8

add-apt-repository ppa:openjdk-r/ppa
apt-get update
apt-get install openjdk-8-jdk

列出已经安装的Java版本

update-java-alternatives -l

显示如下:

java-1.7.0-openjdk-amd64 1071 /usr/lib/jvm/java-1.7.0-openjdk-amd64
java-1.8.0-openjdk-amd64 1069 /usr/lib/jvm/java-1.8.0-openjdk-amd64

手动切换版本

update-alternatives --config java

选择java-8-openjdk-amd64即可

    There are 2 choices for the alternative java (providing /usr/bin/java).

      Selection    Path                                            Priority   Status
    ------------------------------------------------------------
      0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      auto mode
      1            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      manual mode
    * 2            /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java   1069      manual mode

    Press enter to keep the current choice[*], or type selection number: 2

在证书控制台下载Nginx版本证书。下载到本地的压缩文件包解压后包含:

  • .crt文件:是证书文件,crt是pem文件的扩展名。
  • .key文件:证书的私钥文件(申请证书时如果没有选择自动创建CSR,则没有该文件)。
    友情提示: .pem扩展名的证书文件采用Base64-encoded的PEM格式文本文件,可根据需要修改扩展名。

以Nginx标准配置为例,假如证书文件名是a.pem,私钥文件是a.key。

1.在Nginx的安装目录下创建cert目录,并且将下载的全部文件拷贝到cert目录中。如果申请证书时是自己创建的CSR文件,请将对应的私钥文件放到cert目录下并且命名为a.key;

2.打开 Nginx 安装目录下 conf 目录中的 nginx.conf 文件,找到:

# HTTPS server
# #server {
# listen 443;
# server_name localhost;
# ssl on;
# ssl_certificate cert.pem;
# ssl_certificate_key cert.key;
# ssl_session_timeout 5m;
# ssl_protocols SSLv2 SSLv3 TLSv1;
# ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;
# ssl_prefer_server_ciphers on;
# location / {
#
#
#}
#}

3.将其修改为 (以下属性中ssl开头的属性与证书配置有直接关系,其它属性请结合自己的实际情况复制或调整) :

server {
 listen 443;
 server_name localhost;
 ssl on;
 root html;
 index index.html index.htm;
 ssl_certificate   cert/a.pem;
 ssl_certificate_key  cert/a.key;
 ssl_session_timeout 5m;
 ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
 ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
 ssl_prefer_server_ciphers on;
 location / {
     root html;
     index index.html index.htm;
 }
}

保存退出。

4.重启 Nginx。