Mac使用Charles抓取macOS/iOS/Android的请求

抓取macOS(本机)的请求

先在mac上安装根证书:helpSSL ProxyingInstall Charles Root Certificate
Xnip2018-11-11_13-47-53.png
上一步点击Install Charles Root Certificate后它会自动打开钥匙串,点击钥匙串的Trust(信任)→Always Trust(始终信任),然后直接关闭窗口(没有保存按钮,也不用点保存,直接关闭窗口即可)。
Xnip2018-11-11_14-09-37.png
上一步关闭窗口会提示输入密码,输入后点击Update Settings(更新设置),然后就可以把钥匙串退出了。
Xnip2018-11-11_14-08-51.png
打开网络设置
Xnip2018-11-11_14-23-38.png
点击高级
Xnip2018-11-11_14-29-09.png
点击Proxies,把Web Proxy(Http)Secure Web Proxy(Https)勾上,如果Automatic Proxy Configuration有勾,则把它去掉,一般Automatic Proxy Configuration默认勾上的原因是你用了代理软件(比如ss),最好先把ss关掉,注意你关闭ss的时候,网络设置里它会把你已经勾上的http和https都取消勾选,所以这个要注意反复检查是否勾上了。
Xnip2018-11-11_14-32-31.png
另外勾上的这两个,都要填写代理服务器地址127.0.0.1:8888
Xnip2018-11-11_14-37-54.png
Xnip2018-11-11_14-38-07.png
注意,上一步的端口8888就是对应Charles的ProxyProxy Settings里的Http Proxy的端口,这个8888可以改成其他数字(最大65535),但不能是本地已使用的(例如80最好别用,因为你本地有可能有nginx或者apache占用了这个端口),因为此时Charles就是一个HTTP代理服务器,它监听你设置的这个端口,所以如果这个端口已经被占用,那显然就会出问题。
整个的原理,就是在网络设置里,把mac本机的http和https请求全部转发到代理服务器(这个代理服务器就是Charles),因为Charles是在本机,所以代理服务器ip地址自然就是本机环回测试ip127.0.0.1,而端口在Charles里有设置,只要两边对上,端口未被其他程序占用就行。
Xnip2018-11-11_15-15-04.png
ProxySSL Proxy Settings里,要把*:443加上(如果没有的话),*表示任何ip,:443表示443端口,因为443端口是https的端口,所以要允许,否则无法抓取https的包
Xnip2018-11-11_15-47-51.png
Xnip2018-11-11_14-35-28.png
上面全部配置好,随便刷新一个网页,在Charles里看,应该就能看到请求了(看不到请一步一步对一下,看漏了哪里,实在不行关掉Charles再开看看)
Xnip2018-11-11_15-59-32.png

抓取iPhone手机的请求

也要先安装根证书
Xnip2018-11-11_17-57-03.png
这里说的很清楚,配置你的设备以使用Charles作为它在http://192.168.0.102:8888的代理,然后用iPhone的Safari浏览器访问这个地址chls.pro/ssl来安装证书。
Xnip2018-11-11_17-56-29.png
根据上面所说的,我们在iPhone的设置无线局域网
Xnip2018-11-11_18-18-33.png
点右边那个¡
Xnip2018-11-11_18-20-49.png
点击配置代理
Xnip2018-11-11_18-26-48.png
选择手动,然后填写Charles提示的IP和端口,注意,ip和端口不要照填我的,上面Charles弹出的那个提示框里有你自己的ip和端口。
Xnip2018-11-11_18-29-10.png
点击存储保存,保存后mac上的Charles会提示有一个链接试图连接Charles,这个就是手机的链接,这时当然要允许,即点左边的Allow(允许)按钮。
Xnip2018-11-11_18-35-14.png
允许之后,iPhone打开Safari浏览器,输入前面Charles提示的地址:chls.pro/ssl,然后根据提示一步一步安装证书。
点击允许
Xnip2018-11-11_18-46-03.png
点击右上角的安装
Xnip2018-11-11_18-46-15.png
输入密码
Xnip2018-11-11_18-46-39.png
点击安装
Xnip2018-11-11_18-46-29.png
点击右上角的完成
Xnip2018-11-11_18-46-57.png
手机随便打开一个app或网页,随便点一下,即可看到Charles抓到的请求。
Xnip2018-11-11_18-38-52.png
Xnip2018-11-11_18-38-34.png
不使用的时候手机要关闭代理,否则会上不了网(离开你办公室后),或者很慢(因为通过电脑代理肯定比较慢)。
说一下,其实不安装证书直接设置代理也是可以的,只是这样就只能抓http的包,https的就抓不了,而现在很多服务都用https了,所以还是要安装证书!

抓取Android手机的请求

安卓与iPhone安全一样,也是设置代理,安装证书,但可能容易出问题,比如我的魅蓝S6自带浏览器安装了证书也不行,而Chrome就可以,但小米3 Chrome浏览器也不行,不知道什么问题。

使用自动代理

对于抓包调试手机网页或app,很多童鞋可能遇到过手机如果用wifi怎么也上不了网,而用流量就可以,一度还怀疑wifi网络有问题,最后才发现是因为测试接口抓包的时候忘把代理关掉,把它关掉就可以上了,但是下次测试又得重新设置代理,特别麻烦。
事实上我们使用自动代理,就可以实现『即使忘了关代理也不会上不了网』的问题。自动代理是让配置文件决定要不要代理,配置文件我们叫pac文件(proxy auto config),后缀也是.pac结尾。
以下配置文件的意思,就是判断请求的域名是否为www.hexotest.com,如果是,则把它代理到192.168.0.102:8888,如果192.168.0.102:8888无法访问,那么走后面的DIRECT即直连,不代理了。如果域名不是www.hexotest.com那就直连不走代理。
//一个很简单的调pac文件
function FindProxyForURL(url, host) {
    //这里填写你们公司的host
    if (dnsDomainIs(host, 'www.hexotest.com')) {
        //这里填你自己的局域网ip,端口号是你在Charles里设置的 默认8888
        return "PROXY 192.168.0.102:8888; DIRECT;";
    } else {
        return "DIRECT";
    }
}
Bash
把配置文件命名成xxx.pac,比如我命名成proxy.pac,然后放到nginx目录里,让它可以访问,比如电脑的ip是192.168.0.102,那么我通过在手机通过http://192.168.0.102/proxy.pac就可以访问,这样,手机就会根据pac文件的配置来决定是否代理。
Xnip2018-11-11_18-27-11.png
电脑的话也一样,不过因为配置文件就在电脑本地,所以ip就是127.0.0.1,但是要注意,如果你用了科学上网工具ss,一定要把这工具先关掉,否则它会占用这个配置。
Xnip2018-11-11_21-35-22.png
pac配置文件除了可以放本地,也可以放外网线上,这样你手机可以一直设置着,不会因为你电脑的ip可能会变,又要改ip。

使用RocketChat自建即时聊天服务器

什么是RocketChat?

RocketChat是一个开源的聊天工具(类似微信、QQ),但不同的是,微信、QQ的服务器是腾讯公司的,数据都保存的腾讯的服务器上,而我们用RocketChat,是自己搭建的服务器,所有聊天记录都存在自己的服务器上。
RocketChat支持Mac、Windows、Linux、iPhone、Android、网页版,也就是完全支持所有平台。
RocketChat客户端界面:
-w999

为什么要自己搭建聊天服务器?

现在人们越来越注重隐私,有时候公司内部的一些交流,以及一些众所周知的比较敏感的话题,并不适合使用微信、QQ之类的没有任何隐私可言的工具进行讨论,而RocketChat的服务器是我们自己搭建的,数据在自己手上,所以比较安全。

如何搭建RocketChat服务器?

RocketChat是使用nodejs编写的,使用mongodb作为数据库,所以我们要搭建RocketChat服务器,要安装四个部分:
  • 1、nodejs(以及一些nodejs的工具库)
  • 2、mongodb(数据库)
  • 3、GraphicsMagick(一个图片处理库,RocketChat需要用它来处理图片)
  • 4、RocketChat
下面我们将一步一步安装上边说的四个工具,当然如果你想直接看官方文档也可以:官方安装文档

安装mongodb

添加mongodb的yum源

由于mongodb并没有添加到yum源中,我们要使用yum安装mongodb,需要先添加它的yum源,其实就是在/etc/yum.repos.d/目录中添加一个叫mongodb-org-4.0.repo的文件,并把下边的内容填进去保存即可:
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
Ini
如果你嫌上面的方式麻烦,你可以直接在终端里执行以下命令,就会自动在/etc/yum.repos.d/目录中产生这个文件:
cat << EOF | sudo tee -a /etc/yum.repos.d/mongodb-org-4.0.repo
[mongodb-org-4.0]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.0/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.0.asc
EOF
Bash

安装mongodb

添加完yum源,直接使用我们熟悉的yum安装即可(不过它的包名叫mongodb-org而不是mongodb):
yum -y install mongodb-org
Bash

修改mongodb配置文件

需要把engine设置为wiredTiger,以及把设置replicationreplSetName: rs01,以及把bindIp的ip用引号起起来。
设置完的整个配置如下所示,如果你觉得麻烦,其实直接把我的配置覆盖过去就行:
# mongod.conf

# for documentation of all options, see:
#   http://docs.mongodb.org/manual/reference/configuration-options/

# where to write logging data.
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

# Where and how to store data.
storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true
  engine: wiredTiger
#  wiredTiger:

# how the process runs
processManagement:
  fork: true  # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid  # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

# network interfaces
net:
  port: 27017
  bindIp: "127.0.0.1"  # Enter 0.0.0.0,:: to bind to all IPv4 and IPv6 addresses or, alternatively, use the net.bindIpAll setting.


#security:

#operationProfiling:

replication:
  replSetName: rs01

#sharding:

## Enterprise-Only Options

#auditLog:

#snmp:
YAML

启动mongodb

先启动:
systemctl start mongod
Bash
然后查看是否启动成功:
systemctl status mongod
Bash
如果是如下图所示,有active (running)字样,说明已经成功启动:
-w821
设置开机自动启动:
systemctl enable mongod
Bash
如果你要停止或重启:
# 停止mongodb
systemctl stop mongod

# 重启mongodb
systemctl restart mongod
Bash

初始化mongodb

使用mongo命令登录mongodb:
mongo 127.0.0.1
Bash
创建一个单服务器的复制集(你有多台服务器做集群也可以):
rs.initiate({_id:'rs01',members:[{_id:1,host:'127.0.0.1:27017'}]})
Js
执行结果如下图所示:
-w596
设置后用exit命令退出mongodb。

安装nodejs

执行以下命令安装nodejs:
yum -y install nodejs
Bash
以上安装的nodejs版本比较低(可以用node -v命令查看版本,我这里目前是v6.17.1),但是RocketChat需要使用比较高的nodejs版本,所以我们要使用nodejs的版本管理工具n来切换到新版本(没错,这个工具名称就一个字母n)。
先使用npm安装inherits以及n(前面安装nodejs后,npm命令就自动有了):
npm install -g inherits n
Bash
以上安装可能会有一些WARNING,可以不用理会(当然也可能没有)。
然后使用n工具把nodejs的版本切换到RocketChat要求的版本8.11.4
n 8.11.4
Bash
如下图,切换成功后,你再用node -v查看版本,可能还是原来的版本,原因是终端记录了原来的版本,你需要退出登录,再重新登录服务器,然后再看版本,应该就已经换过来了:
-w718
至此,nodejs已经安装完成。

安装GraphicsMagick

前面说过,GraphicsMagick是一个图片处理工具,RocketChat需要使用它来处理聊天中的图片,所以我们要安装一下。
这个安装比较简单,直接使用yum安装即可:
yum install -y GraphicsMagick
Bash

安装RocketChat

简介

所有准备工作已完成,终于可以开始安装我们的主角“RocketChat”了,前面说过,RocketChat是用nodejs写的,所以其实所谓的安装,就是把把源码下载下来,解压一下,放到合适的地方,做一个systemd的开机自启动,它的启动也很简单,其实就是用node运行RocketChat的入口文件main.js而已,比如:
/usr/local/bin/node /path/to/RocketChat/main.js
Bash

开始安装RocketChat

下载RocketChat最新版本到/tmp/目录中:
curl -L https://releases.rocket.chat/latest/download -o /tmp/rocket.chat.tgz
Bash
进入/tmp/目录,我们可以看到一个叫rocket.chat.tgz的文件,这个文件就是刚刚下载的:
cd /tmp/
Bash
解压rocket.chat.tgz,解压出来是一个bundle文件夹:
tar -zxvf rocket.chat.tgz
Bash
解压完成后,我们进入它里面的server文件夹:
cd bundle/programs/server
Bash
进入server文件夹后,使用npm安装依赖:
npm install
Bash
OK,现在RocketChat其实已经可以用了,但是现在它还在/tmp/目录中,这是Linux的临时文件夹,我们不能把它放在那里(当然你非要放在那运行也是可以的,只不过怕以后清缓存会不小心删除掉,而且也没有人会把程序那在那),所以我们要移动到一个我们认为合适的地方。
放在哪里好呢?其实一般情况下,在Linux中自己安装的程序都会放在/usr/local/目录中的,但是官方文档是把它放在了/opt/目录下,这里我们就根据官方文档的做法,把刚刚解压出来的整个bundle文件夹移动到/opt/目录下,并且重命名为Rocket.Chat(当然你不重命名也是一样可以的,只不过以后可能忘了这是什么程序了)。
执行以下命令,把整个bundle文件夹(也就是Rocket.Chat源码程序)移动到/opt/目录并重命名为Rocket.Chat
mv /tmp/bundle /opt/Rocket.Chat
Bash
然后我们顺便把最开始下载的压缩包删掉,因为我们已经解压出来使用了,这个包在这里只会占用服务器硬盘空间(138M呢):
rm /tmp/rocket.chat.tgz
Bash

设置开机自启动

前面说过,运行Rocket.Chat这个“服务器”,其实就是用node去运行它的入口文件main.js即可,即:
/usr/local/bin/node /path/to/RocketChat/main.js
Bash
但是,为了方便启动/停止,为了方便开机自启动,我们要设置一下开机自启动,Linux的开启自启动有两种,一种是以前的init方式(CentOS6及其以下),一种是CentOS7的systemd,因为我们使用的是CentOS7,所以我们使用systemd方式。
使用systemd来管理程序的启停,其实是在/usr/lib/systemd/system/目录中添加一个以.service结尾的配置文件,比如RocketChat我们就命名为rocketchat.service就行,然后内容直接粘贴以下的内容进去就行(但要注意把ROOT_URL中的ip换成你自己服务器的ip):
[Unit]
Description=The Rocket.Chat server
After=network.target remote-fs.target nss-lookup.target nginx.target mongod.target
[Service]
ExecStart=/usr/local/bin/node /opt/Rocket.Chat/main.js
StandardOutput=syslog
StandardError=syslog
SyslogIdentifier=rocketchat
User=rocketchat
Environment=MONGO_URL=mongodb://127.0.0.1:27017/rocketchat?replicaSet=rs01
Environment=MONGO_OPLOG_URL=mongodb://127.0.0.1:27017/local?replicaSet=rs01
Environment=ROOT_URL=http://你的服务器ip:3000/
Environment=PORT=3000
[Install]
WantedBy=multi-user.target
Ini
由于我们打算使用一个专有的用户来启动RocketChat,所以我们要先创建一个用户,用户名就叫rocketchat吧,使用以下命令即可创建:
useradd -M rocketchat && usermod -L rocketchat
Bash
创建用户后,别忘了把Rocket.Chat的权限修改为该用户:
chown -R rocketchat:rocketchat /opt/Rocket.Chat
Bash
然后我们就可以使用systemctl来启动RocketChat服务器了:
systemctl start rocketchat
Bash
然后我们再查看一下是否启动成功了:
systemctl status rocketchat
Bash
如果一切正常,将会看到类似这样的输出:
-w684
如果像下图这样有红色的failed字样,则说明启动失败,一般来说都是权限问题或者是路径问题,多检查一下即可:
-w782
启动成功后,我们把RocketChat加入到开机启动:
systemctl enable rocketchat
Bash
到这里RocketChat已经启动,下边会继续讲如何使用,如果你要停止或重启RocketChat,由于我们已经使用systemd的启动方式,所以都是systemctl的通用方法:
# 停止
systemctl stop rocketchat

# 重启
systemctl restart rocketchat
Bash

开始使用RocketChat

如果前面RocketChat已经正常启动,那么如果在浏览器访问:
http://你的服务器ip:3000
就能进入首次的安装向导界面了:
-w1440
  • 姓名:不需要傻傻的填你的真实姓名,你可以随便填,也可以填一个你常用的网名,英文名等等;
  • 用户名:不要有空格,由英文下划线数字等组成(不是说一定要下划线,也不是一定要数字,而是说你可以用它们);
  • 组织电邮:填一个你的邮箱
  • 密码:填上密码,这个密码以及前面的用户名,其实就是管理员,当然也是一个用户(可以聊天的)
继续往下,这些你都可以自己看着填:
-w1440
继续:
-w1440
继续:
-w1440
设置好了,现在可以点击“转到你的工作区”
-w974
界面是这样的(这就是后台界面了):
-w1440
然后,你把你的这个地址,即http://你的服务器ip:3000/发给朋友,或者公司同事,他们在浏览器或客户端访问这个链接,注册一个账号,就可以相互聊天了。
同事/朋友在浏览器上访问(要先注册一个账号):
-w1398
在电脑客户端(在手机也一样),第一次连接可能比较慢,要稍等一下:
-w993

使用Nginx做反代

一般情况我们都不建议直接使用ip来访问,所以强烈建议使用nginx做反代,这样我们就可以通过域名来访问我们的RocketChat服务器了,如果你不会安装nginx,自己网上找一下资料就行,这里就不说了。
以下是我使用的nginx反代配置(支持https):
# rocketchat反代
server {
    listen 80;
    listen 443 ssl;
    server_name rocketchat.xxx.com;

    if ($scheme = http){
        return 302 https://$host$request_uri;
    }

    access_log /var/log/nginx/rocketchat.xxx.com_nginx.access.log combined buffer=1k;
    error_log /var/log/nginx/rocketchat.xxx.com_nginx.error.log error;

    #https start
    ssl_certificate /usr/local/nginx/letsencrypt/xiebruce.top/fullchain.pem;
    ssl_certificate_key /usr/local/nginx/letsencrypt/xiebruce.top/private.pem;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHellA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    #https end

    location / {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        #由于RocketChat是使用websocket来传输数据的,所以这里反代的时候要设置支持websocket协议
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
nginx
如果你不知道怎么配置https,可以看一下为你的网站配置免费的HTTPS支持以及https证书自动续订(renew)问题这两篇文章。

当然,如果你不想那么麻烦,也可以使用不支持https的配置:
# rocketchat反代
server {
    listen 80;

    server_name rocketchat.xxx.com;

    access_log /var/log/nginx/rocketchat.xxx.com_nginx.access.log combined buffer=1k;
    error_log /var/log/nginx/rocketchat.xxx.com_nginx.error.log error;

    location / {
        proxy_redirect off;
        proxy_pass http://127.0.0.1:3000;
        proxy_http_version 1.1;
        #由于RocketChat是使用websocket来传输数据的,所以这里反代的时候要设置支持websocket协议
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "upgrade";
        proxy_set_header Host $http_host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}
nginx
  • server_name的值改成你自己的域名,并在你的域名服务商那边添加一个A记录,把域名解析到你这台服务器上;
  • access_logerror_log的路径要修改成真实存在的路径;
  • proxy_pass意思就是把nginx接收到的请求转发给RocketChat,所以它后面的http://127.0.0.1:3000就是RocketChat的地址和端口,由于RocketChat就在本地,所以地址就是127.0.0.1,而端口是我们在/usr/lib/systemd/system/rocketchat.service中用Environment=PORT=3000指定的,如果你不想用这个端口,你可以去修改一下(修改了记得重启)。

如何更新RocketChat服务器

由于更新RocketChat就是更新它的源码,所以我们重复一遍前面的安装步骤即可,即下载→解压→进入server文件夹→npm install→移动并重命名到/opt/目录即可。

客户端的安装

iPhone客户端

直接AppStore搜索“rocket.chat”即可,如下图:
-w495

安卓客户端

1、GooglePlay下载:搜索“rocket.chat”即可,如下图:
-w394
2、apk安装:本来安卓是可以直接下载apk安装包的,但是由于官方不提供apk安装包,只有源码,所以只能想办法上googleplay安装了。

电脑客户端(Mac/Win/Linux)

方式一:直接去官网下载就行,当然这个网站如果没有科学上网可能也有点慢:
image
方式二:你可以去Github下载。

from  http://archive.is/lr4XU#selection-275.7-275.28

PicUploader: 一个还不错的图床工具

一个还不错的图床工具,支持Mac/Win/Linux服务器、支持压缩后上传、添加图片或文字水印、多文件同时上传、同时上传到多个云、右击任意文件上传、快捷键上传剪贴板截图、Web版上传、支持作为Mweb发布图片接口、作为PicGo、ShareX、uPic等的自定义图床,支持在服务器上部署作为图床接口,支持上传任意格式文件。目前支持的云有:七牛、阿里、腾讯、华为、网易、京东、百度、又拍、青云、Ucloud、sm.ms、Imgur、Github、Gitee(码云)、微博、Nextcloud、Cloudinary、Chevereto、Minio、Aws s3、金山、个人服务器(sftp)、本地(即PicUploader所在机器)!

 

PicUploader 是一个用php编写的图床工具,它能帮助你快速上传你的图片到云图床,并自动返回Markdown格式链接到剪贴板。配置完成后,要获取一个可用于markdown的图片外链只需要:

  • 方式一: 右击电脑本地任意格式文件→点击你的自定义上传菜单→系统通知文件上传成功→到Markdown编辑器中粘贴!
  • 方式二: 截图并点击复制到剪贴板→按快捷键→系统通知图片上传成功→到Markdown编辑器中粘贴!
  • 方式三: 右击网页中的图片→点击复制图片→按上传快捷键→系统弹出上传成功通知→到Markdown编辑器中粘贴!
  • 方式四: 使用网页版上传,包括拖放上传(支持多文件)、复制本地图片文件后粘贴上传、截图后粘贴上传、复制网页上的图片后粘贴上传、点击上传按钮选择图片后上传(支持多文件)。

主要功能

  • 支持Mac和Windows(也可用于Linux服务器端)、理论上也支持Linux桌面版,只要你能添加右键菜单或者用快捷键调用上传命令的话;
  • 支持图片压缩后上传(支持jpg/png/webp,gif/bmp不支持压缩);
  • 支持添加水印后上传(支持文字水印、图片水印、自定义水印颜色/透明度/角度/位置,支持jpg/png/bmp/webp,gif不支持水印);
  • 返回的链接可自定义(如原始链接、Markdown格式链接、可点击的Markdown格式链接、完全自定义的链接);
  • 完全自定义上传文件名(可选变量有当前年、月、日、当前时间戳,随机字符串(可调长度))
  • 可作为MWeb的API使用,可作为PicGo、ShareX、uPic等的自定义图床使用;
  • 支持快捷键上传剪贴板中的图片(配合PicUploaderHelper/Alfred/WinHotKey使用);
  • 支持Web端拖放、粘贴、或直接选择上传图片;
  • 支持Web端设置所有参数;
  • 支持上传任意格式文件(除了图片,还可以上传任意格式文件,只要你的存储端支持就行);
  • 目前支持的图床:七牛、阿里、腾讯、华为、网易、京东、百度、又拍、青云、Ucloud、sm.ms、Imgur、Github、Gitee(码云)、微博、Nextcloud、Cloudinary、Chevereto、Minio、Aws s3、金山、个人服务器(sftp)、本地(即PicUploader所在机器)。

功能演示

如果图片看不了请点击图片上边的文字链接单独打开即可查看。


Mac右击图片上传演示(图片不动请点我查看): Mac-demo.gif

Mac快捷键上传截图演示(图片不动请点我查看): Mac-shortcut-upload-demo.gif

Win10右击图片上传演示(图片不动请点我查看) Win10-upload by right click

Win10快捷键上传截图演示(图片不动请点我查看): Win10-upload by shortcut

Win7右击图片上传演示(图片不动请点我查看): demo-win7.gif

Win7快捷键上传截图演示(图片不动请点我查看): Win7-upload by shortcut

Web版演示: screenshot_upload_tmp.jpeg

上传任意格式文件演示(图片不动请点我查看): upload-non-image-demo_optimized.gif

MWeb使用PicUploader上传图片演示 screenshot.jpeg

ShareX使用演示(图片不动请点我查看) sharex-customize-upload-demo_optimized_optimized.gif

上传记录 Xnip2019-05-01_00-50-56.jpg

由于维护多个文档太累,Github flavor markdown不支持视频,并且gif图大点就不显示,还得空两格才会换行,基于种种原因,如果要继续查看文档,请直接查看唯一文档:

http://archive.is/j8slX

from https://github.com/xiebruce/PicUploader

搭建对象存储服务器minio(类似阿里云的OSS或Aws S3)

minio简介

minio是一个高性能的开源的对象存储服务器(github),简单的说就是你可以用它自己搭建一个类似AWS S3或阿里云的OSS一样的东西。

安装minio服务器及客户端

安装minio服务器:
wget https://dl.min.io/server/minio/release/linux-amd64/minio -O /usr/local/bin/minio && chmod +x /usr/local/bin/minio
Bash
其实就是把minio可执行文件下载到/usr/local/bin/目录下并添加可执行权限。
安装minio客户端:
wget https://dl.min.io/client/mc/release/linux-amd64/mc -O /usr/local/bin/mc && chmod +x /usr/local/bin/mc
Bash
其实就是把mc(minio config)可执行文件下载到/usr/local/bin/目录下并添加可执行权限。

设置启动管理(如开机自启动)

下载systemd文件(用于使用systemctl来控制启动/停止/开机自启动等等):
wget https://raw.githubusercontent.com/minio/minio-service/master/linux-systemd/minio.service -O /usr/lib/systemd/system/minio.service
Bash
编辑minio.service文件:
vim /usr/lib/systemd/system/minio.service
Bash
把其中的UserGroup都注释掉(当然也可以创建一个用户和组填进去):
#User=minio-user
#Group=minio-user
Bash
重载minio.service文件:
systemctl daemon-reload
Bash

填写minio配置文件

由于我们使用systemctl来管理minio的启动,所以配置要被minio.service调用。
编辑minio的配置文件(这个文件是在minio.service中的这句EnvironmentFile=/etc/default/minio中被调用的):
vim /etc/default/minio
Bash
把以下内容放进去:
# 指定数据存储目录(注意这个目录要存在)
MINIO_VOLUMES="/data/minio"

# 指定监听端口(也可以不监听具体ip,只写 :9199即可)
MINIO_OPTS="--address 127.0.0.1:9199"

# Access key,相当于账号
MINIO_ACCESS_KEY="CHAW*******I1EWP2"

# Secret key,相当于密码
MINIO_SECRET_KEY="diEvRU6eQez**********Dkkpo4srSh+p"

# 区域值,这是完全自己写的,比如你愿意的话写“abcd”也行,但标准格式是“国家-区域-编号”,
# 如“中国-华北-1号”就可写成“cn-north-1”,又比如“美国-西部-2号”可写成“us-west-1”
MINIO_REGION="cn-south-1"

# 域名
MINIO_DOMAIN=minio.your_domain.com
Ini
其中的参数自己看着修改,比如数据存储目录你想放其它地方,就自己修改,但要保证所指定的目录是存在的,域名MINIO_DOMAIN要与nginx反向代理的域名一致。
启动minio
systemctl start minio
Bash
查看minio启动状态:
systemctl status minio
Bash
重启minio
systemctl restart minio
Bash
停止minio
systemctl stop minio
Bash

配置域名

配置域名,其实就是利用nginx反代到minio服务器:
server {
    listen 443 ssl http2;
    server_name minio.your_domain.com;
    error_log /data/wwwlogs/minio.your_domain.com.error.log error;
    access_log /data/wwwlogs/minio.your_domain.com.access.log combined buffer=1k;

    #https start
    ssl_certificate /usr/local/nginx/letsencrypt/xiebruce.top/fullchain.pem;
    ssl_certificate_key /usr/local/nginx/letsencrypt/xiebruce.top/private.pem;
    ssl_session_timeout 5m;
    ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;
    ssl_ciphers ECDHE-RSA-AES128-GCM-SHellA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
    ssl_prefer_server_ciphers on;
    add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
    #https end

    # 把请求转发到minio服务器
    location / {
        proxy_pass http://127.0.0.1:9199;
        proxy_set_header Host $host;
    }
}
nginx
重载nginx配置:
nginx -s reload
Bash
然后访问域名https://minio.your_domain.com就可以访问到后台了:
image
点击右下角的+号,点击中间那个Create bucket即可创建一个bucket(存储桶):
Xnip2019-09-26_10-30-00
创建成功就可以往里面上传图片或其它文件了。

设置公共可读

要想在markdown中引用图片,必须要把图片设置成能公共访问才行,而图片要公共引用,直接把bucket设置为公共可读即可。
编辑配置文件:
~/.mc/config.json
Bash
打开~/.mc/config.json内容是这样的:
{
    "version": "9",
    "hosts": {
        "gcs": {
            "url": "https://storage.googleapis.com",
            "accessKey": "YOUR-ACCESS-KEY-HERE",
            "secretKey": "YOUR-SECRET-KEY-HERE",
            "api": "S3v2",
            "lookup": "dns"
        },
        "local": {
            "url": "http://localhost:9000",
            "accessKey": "",
            "secretKey": "",
            "api": "S3v4",
            "lookup": "auto"
        },
        "play": {
            "url": "https://play.min.io",
            "accessKey": "Q3AM3UQ867SPQQA43P2F",
            "secretKey": "zuf+tfteSlswRu7BJ86wekitnifILbZam1KYY3TG",
            "api": "S3v4",
            "lookup": "auto"
        },
        "s3": {
            "url": "https://s3.amazonaws.com",
            "accessKey": "YOUR-ACCESS-KEY-HERE",
            "secretKey": "YOUR-SECRET-KEY-HERE",
            "api": "S3v4",
            "lookup": "dns"
        }
    }
}
JSON
把其中的local部分的url修改为前面设置的域名,同理accessKeysecretKey设置为前面/etc/default/minio的设置的值:
"local": {
    "url": "https://minio.your_domain.com",
    "accessKey": "CHAW*******I1EWP2",
    "secretKey": "diEvRU6eQez**********Dkkpo4srSh+p",
    "api": "S3v4",
    "lookup": "auto"
},
Bash
把bucket设置永久公共可读,其中local就是指使用前面~/.mc/config.json的“local”部分的配置,markdown为你自己创建的bucket的名称:
mc policy set public local/markdown
Bash
前面设置之后,图片默认就是可公共访问的,只不过要把url中的“minio/”去掉就行了:
Xnip2019-10-10_20-42-51
链接格式如下:
https://minio.your_domain.com/markdown/2019/09/29/6fb64fbbb0eb1e3c9cd3cdd50a5d3dd3.jpg
Bash

from http://archive.is/NFtcP#selection-443.0-2753.3

参考:http://luckypoem.blog124.fc2.com/blog-entry-659.html

dnsProxy和dnsAgent

最根本的解决方法就是加密DNS查询。目前有些DNS服务商提供了私有的加密DNS方式,不过不太通用,需要私有的客户端程序配合。实际上可以不用搞这么复杂,自己建立加密通道,传递DNS消息即可。

在这个网络中,有两个关键程序:dnsProxy和dnsAgent。

dnsProxy顾名思义就是个Proxy,本身并不负责DNS协议的解析,也不保存DNS的查询结果等信息,只是单纯地将DNS消息传递给真正的DNS服务器,并返回相应的结果即可。dnsProxy另一个功能是对外提供加密的数据连接,例如TLS、SSL加密等,甚至可以只是简单地对数据包进行自定义的异或运算即可。另外就是对外提供非标准连接接口,这点非常重要。DNS采用标准UDP53接口作为DNS服务器接口,网络上那些看不见的手,往往就是扫描并篡改53接口的数据包。这个小程序跑在境外(大家都懂的)的一台VPS设备上,推荐采用DigitalOcean,专业的云计算服务商,采用SSD硬盘,价格公道,我们一直用TA,如果你有兴趣的话,请点击这里自行了解细节。

dnsAgent是另一个小程序,主要负责建立与dnsProxy的加密连接,接收普通设备的DNS请求并将其传递给dnsProxy,同时返回DNS结果给普通计算设备。对于网内设备而言,dnsAgent就是个伪装的DNS服务器。同样,dnsAgent其实也不需要关心、也不需要解析DNS协议细节。在我的网络中,dnsAgent跑在一台常年吃灰的树莓派上(还是第一代的)。

实现这些仅仅需要一点UDP、TCP的网络知识,甚至不需要了解DNS协议的细节,无需对DNS数据包做修改。完成后可以愉快地打开很多以前打不开的网站。当然,有些网站始终是打不开的,这是另一个与DNS无关的话题了。

中国的网络封锁技术方案与网民的反网络封锁技术方案

目录

  1. GFW是什么
  2. 网络封锁的技术方案
    • 内容审查
    • 屏蔽IP
    • DNS劫持
  1. 反网络封锁的技术方案
    • 使用SSL加密对抗关键字审查
    • 给网站换IP避开IP屏蔽
    • 用tor来避开DNS干扰
    • 使用在线RSS阅读器来

GFW是什么

GFW是Great Fire Wall的缩写,是金盾工程。这个工程由若干个部分组成,实现不同功能。防火长城主要指中国政府监控和过滤互联网内容的软硬件系统,由服务器和路由器等设备,加上相关的应用程序所构成。

首先,需要强调的是,由于中国网络审查广泛,中国国内含有“不合适”内容的的网站,会受到政府直接的行政干预,被要求自我审查、自我监管,乃至关闭,故GFW的主要作用在于分析和过滤中国境内外网络的资讯互相访问。

GFW对网络内容的过滤和分析是双向的,GFW不仅针对国内读者访问中国境外的网站进行干扰,也干扰国外读者访问主机在中国大陆的网站,本文讨论GFW屏蔽国外网络上传播的内容的方法及相应的对策。

网络封锁的技术方案

GFW在网络上封锁的技术方案有:

  1. 内容审查
  2. 屏蔽IP
  3. DNS劫持

GFW如何屏蔽网络上传播的内容?网络上封锁的具体方式:

  1. 内容审查GFW的内容审查针对HTTP传输协议的默认端口的80端口,HTTP传播的内容是明文的内容,没有经过加密,GFW是一个IDS[Intrusion detection system (入侵检测系统)],GFW有一个敏感字名单,若在中国大陆访问境外的主机的HTTP的数据流里发现敏感字眼,就在两台主机间伪造一个"reset”信号,导致双方主机以为对方中止了请求。如用Firefox浏览器访问
    http://newsvote.bbc.co.uk/chinese/
    http://knol.google.com/k/-/-/3jhi1zdzvxj3f/2 就会出现以下画面:
  2. 屏蔽IP屏蔽IP是GFW通过路由器(router)来控制的,在通往国外的最后一个网关上加上一条伪造的路由规则,导致通往某些被屏蔽的网站的所有IP数据包无法到达。路由器的正常工作方式是学习别的路由器广播的路由规则,遇到符合已知的IP转发规则的数据包,则按已经规则发送,遇到未知规则IP的数据,则转发到上一级网关。GFW的路由器按黑名单(blacklist)来转发特定的IP数据包,则可屏蔽特定的网站的IP,此IP黑名单不是固定的,会更新。如访问 http://www.dw-world.de/chinese/ 出现以下画面:

  3. DNS劫持DNS劫持是针对某些网站的最严重的干扰。干扰的方式有两种:

    1. 一种是通过网络服务提供商(Internet Service Provider/ISP)提供的DNS服务器进行DNS欺骗,当人们访问某个网站时,需要要把域名转换为一个IP地址,DNS服务器负责将域名转换为IP地址,中国大陆的ISP接受通信管理局的屏蔽网站的指令后在DNS服务器里加入某些特定域名的虚假A记录,当使用此DNS服务器的网络用户访问此特定网站时,DNS服务便给出假的IP地址,导致访问网站失败,甚至返回ISP运营商提供的出错页面和广告页面。
    2. 另一种是GFW在DNS查询使用的UDP 53端口上根据黑名单进行过滤,遇到通往国外的使用UDP的53端口进行查询的DNS请求,就返回一个虚假的IP地址

例子:
在大陆访问 http://www.zuola.com/ 就可能出现“服务器响应时间过长”。
我家目前用的中国电信提供的网络接入:
Internet connection
Connection type:PPPoE
IP Address:220.168.9.112
Gateway address:220.168.8.1
DNS Server:222.246.129.80, 59.51.78.210
当我使用中国电信提供的DNS服务器进行查询时,出现以下画面:甚至我在中国大陆使用用国外的OPENNDS或其他DNS服务器进行查询,都会被GFW干扰而得到虚假的IP地址,
通过远程登录在美国的主机进行DNS查询后,此时的DNS查询是完全无GFW干扰的,可得到 www.zuola.com的真实IP地址是 75.119.214.237

GFW在OSI结构模型的两个层面进行审查和封锁,一种在传输层(Transport Layer)进行干扰,一种是在网络层(Network Layer)进行干扰:

  1. 在传输层(Transport Layer)进行干扰:
    1. DNS劫持  GFW在UDP 53端口上进行传输层完成干扰;
    2. 内容审查   GFW对默认端口TCP 80端口上进行内容过滤,在http传输协议上,对tcp 80端口上传输的内容进行内容审查,遇到关键字,GFW就在会话中插入“reset”信号,导致网页被重置。
  1. 屏蔽IP是GFW在网络层(Network Layer)上的封锁和干扰,是在IP路由协议上完成干扰。



GFW审查在OSI模型上的审查的位置:

 

反网络封锁的技术方案

GFW针对具体网站的方案有以下三种:

  1. GFW把域名为作敏感字来屏蔽
  2. GFW把域名所在的IP屏蔽
  3. GFW干扰域名DNS解析

相应对抗GFW,网站的主人有下面几个方法:

  1. 网站使用SSL加密对抗关键字审查;
  2. 给网站换IP避开IP屏蔽;
  3. 推荐大陆的网站访问者使用国外的DNS解析服务器,或推荐大陆的访问者使用tor来避开DNS干扰
  4. 推荐读者使用在线RSS阅读器来读取最新文章

相应对抗GFW有的具体方法

  1. 使用SSL加密对抗关键字审查HTTPS是基于SSl的HTTP协议,是安全超文本传输协议。当用户访问使用HTTPS的网站时,用户端的浏览器需要先获取网站的安全证书和来自认证的安全证书发行商的数字签名,此安全证书为服务器的公钥,服务器用私钥把网页内容加密进行传输,客户端浏览器以公钥解密即可得到网页内容。网络内容的传播过程中,内容是加密的,无法被GFW自动审查传输的内容,亦无法被GFW插入"reset"信号。

    1. 实例1:在2007年11月到2008年7月,https://www.zuola.com  曾用HTTPS成功避开GFW的审查,让中国大陆的网民能够直接访问此网站。
    2. 实例2:当人们无法访问http://knol.google.com/k/-/-/3jhi1zdzvxj3f/2时,改用 https://knol.google.com/k/-/-/3jhi1zdzvxj3f/2 就可以访问
  1. 给网站换IP避开IP屏蔽使用SSL加密可对抗GFW的内容审查,GFW如何对付HTTPS呢?
    GFW的工作人员遇到使用HTTPS的网站后,他们知道无法使用机器自动的过滤他们心目中的“敏感内容”和“有害内容”,于是直接屏蔽网站的IP,此时,通往此网站服务器的任何数据包都无法直接越过GFW到达目的地。此时只需要更改网站域名的A记录,换一个IP就可以避开屏蔽IP。此时就像猫和老鼠的游戏了,GFW只好跟在后面不断屏蔽IP,并且GFW的屏蔽IP的工作是人工执行的。无法通过机器自动执行。如果GFW能够自动执行屏蔽IP的操作,那被屏蔽IP的域名的拥有者就可以借用GFW的能力屏蔽任何境外网站了。
    1. 实例3:在2007年11月到2008年7月,https://www.zuola.com  曾用SSL加密+换IP 成功避开GFW的审查,让中国大陆的网民能继续能够直接访问此网站。
    2. 实例4:https://doubleaf.com 也使用SSL加密和换IP的手段让中国大陆的网民能直接访问
  1. 推荐大陆的网站访问者使用国外的DNS解析服务器,或推荐大陆的访问者使用tor来避开DNS干扰在2008年奥运期间,我发现GFW针对 www.zuola.com 使用了DNS劫持的方式一劳永逸的屏蔽方式,导致国内用户无法直接获得我的网站的正确IP,即使使用“无界”“自由门”“VPN”等突破封锁的工具,也会走错门。那就只能推荐读者《使用TOR+FoxyProxy插件突破GFW》了,TOR是一个分布式的、匿名的网络,Foxyproxy是一款代理服务器管理软件,可以让Firefox使用TOR来收发DNS请求:


     
    TOR的工作方式
    Tor 有助于降低简单的和高级的流量分析的风险,Tor 把你的流量分散到互联网上的多个地点,所以不存在单一的一点可以把你和你的目的地联系起来。这就好像用一条拐弯抹角的、难以辨认的路径甩掉跟踪你的人,然后定期擦掉你的脚印。在 Tor 网络上,来源和目的地不是用一条路径直接连接的,而是由一条通过数台中继的随机路径覆盖原始路径,数据包在这条路径上传输,因此,不存在任何单一一点上的观察者能够知道数据从哪里来、到哪里去。


    用 Tor 创建一条私有网络路径时,用户的软件或客户端通过网络上的中继递增地建立一条由若干加密连接组成的环路(circuit)。环路一次扩展一跳(hop),环路上的中继仅仅知道它从哪一个中继接收数据以及向哪一个中继发送数据。没有一台单独的中继会知道数据包的完整路径。客户端与环路上的每一跳都协商一组独立的密钥,这样可以保证数据通过任何一跳时都无法跟踪。


    一旦环路建立完成,多种类型的数据可以在上面进行交换,不同种类的应用程序也可以在 Tor 网络上部署。因为每一台中继最多只能知道环路中的一跳,窃听者或者被入侵的中继都无法通过流量分析把连接的来源和目的地联系起来。 Tor 仅作用于 TCP 数据流,任何支持 SOCKS 的应用程序都可以使用它。
    出于有效性,Tor 为大约在相同的十分钟内发起的连接请求分配同一环路。以后的请求被分配不同的环路,这样他人就不能把你早先的行为和新的行为联系起来。
  2. 推荐读者使用在线RSS阅读器来读取最新文章Really Simple Syndication(RSS)是一种严格XML的信息传递的格式规范,标准的XML格式文档可允许信息在一次发布后通过不同的程序阅读,易于分发和聚合(Sysndicat)。RSS是这种XML应用搭建了信息迅速传播的一个技术平台,网站的最新内容通过RSS Feed传播,能通过在线RSS阅读器自动推送文章到读者的阅读器,人们无需直接访问网站就能看到最新的内容,RSS能够让内容很容易的被分发,只需要知道RSS地址,网络上无数的在线RSS阅读器总能读取到RSS Feed中的内容。RSS是很容易生成并分布的,这是GFW无法拦截或需要大量资源才能够封锁的一种技术。
    实例:
    1. 实例5:我的网站自2007年4月重庆最牛钉子户报道后被屏蔽,但我的FEED地址 http://feed.zuola.com/ 的订阅数却一直在增长,Google Reader订阅用户数量从 700左右增加到2686。不过GFW仍然会干扰Google reader,使用https 的方式 https://www.google.com/reader/view/ 才能看到以下数据
    2. 实例6:《看不见的西藏》是一个藏族人的BLOG,虽然国内读者无法直接访问,但中国大陆的读者仍然能够通过订阅她的RSS FEED来看到她眼中的西藏,这个Feed是可用google reader订阅的 http://woeser.middle-way.net/feeds/posts/default




此文档的其他站点备份:

  1. http://zolaruler.spaces.live.com/blog/cns!D2AC7D299F493A68!241.entry
  2. https://docs.google.com/View?docid=dggh5mp6_0zzmm4fdn
  3. http://zhoushuguang.blogspot.com/2009/03/blog-post.html
  4. https://knol.google.com/k/-/-/3jhi1zdzvxj3f/14

参考文档:

Tor概述》:http://tor.zuo.la/overview.html.zh-cn

手把手教你使用TOR+FoxyProxy突破GFWhttps://knol.google.com/k/-/-/3jhi1zdzvxj3f/2

纠正网友一些对GFW的认识》: https://www.zuola.com/weblog/?p=1228

Zola教你玩:如何对抗GFW的域名劫持》: https://www.zuola.com/weblog/?p=1151

 

 from   中国的网络封锁技术方案与网民的反网络封锁技术方案

https://docs.google.com/document/d/1n79DOFLdUTSUtzASiN1TaxSF7SWuXqoZvwyM-SO6W7c/preview

NAT穿透和内网访问

利用minivtun实现点对点非公网NAT穿透,在学校轻松访问家里的路由器。需要一个中心化公网服务器(VPS)作为打洞实现内网访问。

  

一般这种情况用于

  • 家里路由器挂载离线下载
  • 家里的WEB网络摄像头监控
  • 远程修改某些路由设置
  • 远程控制路由器相关的“智能家居”
  • 远程访问家里的内网或一个网段

现在仅考虑以下拓朴图,本文的目的是想让路由C访问路由A,实现C远程控制A。其中A是非智能路由器,使用非Openwrt系统。A下面挂接一个Openwrt路由器B

前提是A和C能顺利访问该VPS,而且B工作正常。

 minivtun互访

这个minivtun是我常用的tun点对点隧道软件,工作原理与shadowvpn类似,可以当梯子使用。现有我移植的的minivtun-openwrt,可以自行编译安装在路由上面。

按照文档编译安装,服务端运行监听555端口

/usr/sbin/minivtun -l 0.0.0.0:555 -a 172.16.0.1/24 -e password -n mv0 -d

路由器B和C,同样使用minivtun实现与VPS对接,这里指定网络设备为mv001

# Router B: ip 172.16.0.3
/usr/sbin/minivtun -r [YOUR_VPS]:555 -a 172.16.0.3/24 -e password -n mv001 -d

# Router C: ip 172.16.0.55
/usr/sbin/minivtun -r [YOUR_VPS]:555 -a 172.16.0.55/24 -e password -n mv001 -d

使用Ping等工具测试路由B能否顺利访问VPS

ping 172.16.0.1

 Openwrt端口转发

以下三个步骤均在路由B操作

 新建接口

在network->interface标签下添加一个interface: 命名随意,这里命名为minivtun_intf,协议为DHCP Client,手动输入mv001这个物理接口进行绑定(因上面minivtun启动参数设定了mv001网络设备)

检查这个接口minivtun_intf是否获得正确的172.16.0.3/24地址,并且从数字变化过程中看到能有Tx/Rx流量通过。

 入站防火墙

切换到Network->Firewall->Gerneral,添加一个新的Zone,随意命名为minivtun,指定入站出站转发三个都accept,勾选masquerading和MSS clamping进行伪装路由器。Covered Network只需要勾选两个区域即可,其中必选的是minivtun_intf表示源,另一个是目的地根据需要,可以选WAN或者LAN,如果访问Openwrt局域网就指定LAN,如果要访问WAN(比如上一级路由)就指定WAN

因为我是利用B去访问上一级的A,因此我勾选了WAN

 端口转发

切换到Network->Firewall->Port Forward,新建一个转发规则

外部端口随意,(比如外部端口是444,那么在路由C使用minivtun访问172.16.0.3:444就触发端口转发条件)

项目 备注 我的值
名字 随意起名 minivtun_port_fwd
外部区域 入站防火墙名字 minivtun
外部端口 供外部访问端口 800
内部区域 目的端口区域 LAN
内部IP 目的地址 192.168.200.1
内部端口 目的端口 800

 测试方法

从路由器C浏览器地址栏输入http://172.16.0.3:800即可访问路由A的800端口

 公网访问家里内网

考虑以下拓朴,按照上文已经实现B-C互访(即ping成功),现在我的需求是,在C节点上实现访问A路由上的192.168.200.0/24网段(做视频监控等应用)

实现原理是:将A节点的路由表在VPS上面宣告一下,参考minivtun项目的github issue服务端访问客户端内网进行配置。

 添加节点A的路由表

服务端运行监听555端口,增加-v选项宣告路由表,192.168.200.0/24网段的默认网关是节点B,即172.16.0.3

/usr/sbin/minivtun -l 0.0.0.0:555 -a 172.16.0.1/24 -e password -n mv0 -d -v "192.168.200.0/24=172.16.0.3"

然后服务器端Linux系统的路由表增加默认路由,192.168.200.0/24走minivtun接口。

ip route add 192.168.200.0/24 dev mv0

服务器端测试一下能否ping到节点A,若成功就说明公网下使用minivtun可以实现访问192.168.200.0网段。

ping 192.168.200.1

 配合shadowsocks进行访问内网

假设服务器上已经有ss-server在运行。在shadowsocks-android上新建一个服务器配置,路由设置为自定义规则,自定义规则可以根据实际修改,满足规则才走ss转发,这样可以实现手机访问节点A内网

若电脑windows实现内网访问,个人猜测可使用ss的全局模式,或者配合SwitchyOmega等浏览器指定走socks5代理,我没有测试过。

fromhttp://web.archive.org/web/20190811172300/https://lixingcong.github.io/2016/10/03/openwrt-port-forward/