一个人的角落,也许并没人会看到这里~~ 祝福你,工作顺心,学习快乐~

网络应用

群晖利用公网服务器ip中转流量与内网无缝切换

最近想起nas的公网访问一直是个问题。中转网络一直不通畅,如果走公网转nas又会过度暴露而被自动扫描攻击,导致硬盘频繁唤醒。

这里实现一套方案,利用公网服务器的ip进行流量转发,并且添加一道简单的防火墙来过滤网络扫描。可以在回家以后自行将流量切换到内网。

在使用公网ip转发的时候,流量和带宽受公网服务器上限所限制。在家中互联场景,本地路由器可以通过拦截公网ip流量,自动转发到nas。免去内外网ip来回切换的问题。

graph TD User1(["User1/Phone/PC"]) -->|Access from local NetWork| B{Router} NAS["NAS lisening:5000(http)/5001(https)"] <-->|In local NetWork| B{Router} Internet{Internet} <--> PubServer[PubServer onPort:80/443/5001] Internet <--> B{Router} User2(["User2/DS File/Photo"]) --> |Access to PubServer:5001| PubServer

主要有以下几个部分实现:

在nas上,将本地端口5000映射到公网ip上,通过 ssh -R 转发。

在计划任务中添加一个bash脚本,建立公网服务器的ssh连接用于端口转发,并设置为开机启动。内容如下:

#!/bin/bash

while true; do
sleep 1
echo "Start Port Forward 5000 @ " `date`
ssh -R 5000:127.0.0.1:5000 yourAccount@YourServer.com -C -q -N -o ServerAliveInterval=60 -o ServerAliveCountMax=10
echo "End of Port Forward 5000 @ " `date`
done;

该脚本启动后会将公网服务器所有来自5000端口的流量转发到nas本身。

5000端口为nas的http服务的连接端口,5001端口为nas的https服务的连接端口。

接下来在公网服务器上配置nginx来实现http流量转发并且配置https端口为5001,通过白名单机制将流量转发到nas。

server {
    server_name yourServerName;
    location / {

#       set $pass_url http://127.0.0.1:8000; # for enter password.
#       if ( $http_user_agent ~ 'Synology-' ) { 
#          // we can also use UA to imp more filters.
           set $pass_url http://127.0.0.1:5000;
#       }
        proxy_pass $pass_url;
        proxy_set_header Host $host:80;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        include <your_list_path>/nas_allow_list.conf;
        deny all;
    }

    location /log {  // 
        set $pass_url http://127.0.0.1:8000; # for enter password
        proxy_pass $pass_url;
        proxy_set_header Host $host:80;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }

    listen 443 ssl; # managed by Certbot
    listen 5001 ssl; # managed by Certbot
    <the ssh certs config >
}

在上述conf中/log访问点的流量反代到白名单配置程序,可以用于动态更新 nas_allow_list.conf白名单。

一个简单的基于白名单配置程序:

from werkzeug.wrappers import Request, Response
import subprocess

@Request.application
def application(request):
    auth_html = '''<body style="margin: 0;"><div style="margin: auto ; width: 100%; height:100%; border: 2px solid green; padding: 50px 0; text-align: center; "><form  method="POST">
            <input type="password" name="psw" style="line-height: 25px;" value="" required placehold="Enter Text..." />
            <input type="submit" style="width: 90px;height: 30px;" value="Submit" />
        </form></div>'''
    if request.method != "POST":
        return Response(auth_html, content_type="text/html")

    data = request.get_data(cache=False,parse_form_data=True)

    input = request.form.get("psw", None)
    if input != "<Your Pass Word>":
        return Response(auth_html[:-6] + "<red>N/a</red></div>", content_type="text/html")

    iplist = ",".join(request.access_route)
    if request.remote_addr == "127.0.0.1": // the traffic is came from nginx.
        record_addr = request.access_route
    else:
        record_addr = [request.remote_addr]
    for ipaddr in record_addr:
        ipaddr = ''.join(i for i in ipaddr if i in '0123456789.')
        # also we can use firewall to filter te trific
        #cmd = ["firewall-cmd","--zone=sszone","--add-source="+ipaddr+"/32"]
        cmd = ["bash","-c", "echo 'allow "+ipaddr+";'>> <your_list_path>/nas_allow_list.conf"]
        subprocess.check_call(cmd)
        cmd = ["nginx", "-s", "reload"]
        subprocess.check_call(cmd)

    return Response("<h1>You are grand to access, IP<" + iplist + "> has record.<h1>")

if __name__ == "__main__":
    from werkzeug.serving import run_simple
    run_simple("0.0.0.0", 8000, application, threaded=True)

在路由器配置iptables , 将内网client到公网服务器的流量直接转发到local nas:

iptables -t nat -A PREROUTING -d <yourPubServerIP> -p tcp --dport 5001 -j DNAT --to-destination <yourLocalNasIP>:5001

图片伪造技术 - 使用exiftool对图片描述信息进行增删查改

通常,一张图片本身包含其所应该包括的图像像素内容以外,还包含了很多其它描述该图片元信息,比如图片大小,图片拍摄设备,拍摄时间,焦距,地理位置等,若经过中间处理,还可能包含剪辑软件名称,版本号,版权等信息。

图片在互联网上转发的过程中,也可能经过服务器的有陨/无损压缩,格式转换,大小裁剪,水印添加。根据服务器所使用的不同处理程序也有可能对元数据进行增删改等操作。

因此简单通过分析图片的元数据可以获得除本身所能代表的信息以外,还可能可以初步确定图片是否直接来自于手机或相机拍摄,是否经过修改之类。

exIftool是一个功能强大的命令行执行工具,exiftool.org,支持对大量常见的图片格式进行操作。具体信息见其官方网站说明。

一张经过ps处理的图片文件头如下:

1_raw_meta_info_ps_processed

一款小型哺乳动物仓笼体温监测与活动检测的装置以及部署方案

本方案使用物联网技术,通过高精度嵌入式红外摄像头,持续采集仓笼内热源信号,以及动物运动状态,使用嵌入式MCU对感知数据进行前端采集与简单分析,通过Wifi网络上传到数据中心,可形成数据汇总,采集时间跨度短可几周,长则跨年。装置。可按照需求,定制化按时按天按月或按年,生成可视化温度变化曲线,成本低廉,可供学术研究参考,或生物实验佐证使用。

单套设备仅需人民币300~500左右,约合美元60~80,成本低廉。对于单个仓笼,可同时部署多套设备,多套设备数据融合处理,以达到最佳采样角度,确保检测无死角。

方案包含完整装置采购清单,设备运行程序以及设备程序烧录指导,设备联网方法,现场部署指导等一系列指导文档,以及售后指导服务。

方案主体框架如下:

system_flow

一些国内用户的使用范例:

example_all

view_2

example_view

类似竞品论文参考:

https://journals.plos.org/plosbiology/article?id=10.1371/journal.pbio.3000406 http://journals.plos.org/plosbiology/article/asset?unique&id=info:doi/10.1371/journal.pbio.3000406.s014

合作洽谈可联系:iziy#mypre.cn / c834606877#163.com

在Padavan上实现支持RTSP网络摄像头的录像机功能

基于mt7621处理器的路由器通常都具有一个可扩展的USB接口,可以转接U盘,硬盘或者USB网卡之类。

既是路由器也是一个小型网络存储器,可省去额外配置一个nas,相比nas功能比较少,但也具有一定的可配置性。

这里简单介绍如何在运行类openwrt系统的路由器上实现网络录像机(NVR)的功能。

如今网络上的云摄像头已经卖到100元上下了,有萤石云摄像头,360摄像头,小米摄像头,TP-Link等,但这类型的摄像头都需要额外购买云存储服务才存储回放录像,显然这部分附加服务不具有性价比。

按照专物专用的原则,一台群晖也可以解决,但毕竟要多出一个东西。因此在路由器上实现类似NVR功能是最经济的做法。

很多云摄像头的商品描述页面,并不会直接写明支持RTSP传输,但会写支持NVR功能。

据我了解,TPLink全系均支持NVR功能,莹石云摄像机官方未显式支持但C2C/C3C/C6C等几个型号存在RTSP协议。

下面开始正文。

多站共存的Nginx配置下使用腾讯云CDN加速Discourse出现乱码的问题

上文讲述了在国内环境下加速Discourse的部署过程。

Discourse官方并不建议在同一主机上部署多个站点,但也提供了方案:Running other websites on the same machine as Discourse

按照官方的提供方案部署,通常可以正常将Discourse运行在standlone模式下,再通过Nginx反代访问。https的实现通过certbot也可以简单完成。

以下是nginx配置exsample:

记一例简单web业务性能瓶颈的改造过程

web项目通常由于需求紧,任务重,在上线初期,通常不会考虑太多架构性以及可靠性的问题。因此在业务稳定增长的过程中,大多都存在一个持续优化的过程。

这里记录一下前段时间,因某业务需要,对其持续优化的过程。

业务包括两个数据部分,一个负责实时数据上报的client,一个是负责数据接收以及实时数据展示的web系统。

优化目标有两个,一个是保证实时数据从收集到展示的延迟尽可能短,另一个是提高业务的可扩展性,保证业务的吞吐量不被一台服务器瓶颈所限制。

主要的操作包括静态资源加速,数据上报通道优化,服务器分布差异导致的延迟问题等。

web服务原始架构:

Client为安装在客户终端设备中的一个程序,浏览器为客户的其它带屏终端。Web Server为部署的服务器。

登录:

Client ==(认证信息)==> Web Server ==(返回服务URL)==> Client显示

授权通过后,Client开始收集数据并上传,客户通过Client显示的URL,在浏览器中加载完素材后,便有如下数据流。

在国内环境下安装Discourse

Discourse的版本升级与维护都是基于github来完成的,而Discourse本身又是基于ruby编写。

使用包括腾讯云的CVM、轻量服务器以及阿里云的ECS都存在国外网站访问慢的问题,主要是为了扶持国内git仓库做的限流操作。

在clone托管在github上的discourse时,可以通过将clone链接替换github.com为github.com.cnpmjs.org来加速对github的访问,比如:

git clone https://github.com/discourse/discourse_docker.git 替换为 git clone https://github.com.cnpmjs.org/discourse/discourse_docker.git

除此之外,在运行./discourse-setup时,安装程序同样会在docker中安装一些额外的的项目,

比如:gem update,同样需要添加ruby的镜像。

可以通过修改配置文件来添加ruby镜像地址,主要涉及到的文件有

Ros PPPoe 拨号上网 单口 Nat 转发 + IP伪装

工作室网路由于使用二楼机房供教学使用的网络,一直受到与教学时段同步的限制,临近周末‘思诚杯’比赛,可能需要网络,所以改用PPPoe 拨号上网,
原使用Ros + 无线路由做交换
原端口,被保安室 借用 需沟通,

起先,想到PPPoe拨号 设置Ros 路由器,设置拨号一时可能解决不了,直接用 无线路由 做转发,
发现性能瓶颈明显,原来20m的带宽减少到了2m不到,估改用Ros 做 转发

将保安室网线 网络中心网口 Ros 全接 无线路由器 交换口上

禁用无线路由器DHCP服务,将其完全做为一个 交换设备
Ros 设置 PPPoe Client 增加默认路由 和用户Dns

设置 DHCP Server 增加一个DHCP池 设置好 Ros IP 网关为网关IP 172.16.0.0 网段


设置 Nat ip伪装
Ip Firewall nat
增加一条 chain:srcnat 基于源 的Nat action:masquerade

 

通过无线设备上网可自动获取到 IP和Ros网关

可以上QQ,百度,但发现 其它大部分网页无法正常访问,
DNS无异常
此现象与电子楼机房故障一样, 认为可能学校 网络中心,对包过滤做了手脚,
后想来,无线路由器并无此问题,难道无线路由器,对Nat 数据包做加密处理?

于情于理,网络中心既然学号帐号都开放了,应该没理由会做Nat过滤,Nat伪装之后的包应该是没法检测出来的,问题还是出在Ros本地
于是在Ros ip firewall filter 发现一条规则,只能接收数据量 及 速度 太少,却又有走动,原因 可能在此,将其禁用,


果不其然,网络访问正常。
于此,无线路由器瓶颈去除,网络恢复原有20M水平。