光纤通信网络安全

目前,光纤窃听的方法主要包括光纤弯曲法、V 型槽切口法、散射法、光束分离法、渐近耦合法等

1、直接切断光缆,接入光耦合器,(光分束器),使目标信号分为两个完全相同的信号

2、光纤弯曲在5至10MM可正确导光,用夹式耦合器不破坏光纤就可,

3、V 型槽切口法是通过一个接近纤心的V 型槽导出光纤信号进行窃听的方法。它要求V 型槽的切面与光纤信号传输方向之间的夹角大于完全反射的临界角。当达到这个条件后,在保护层中传输的部分信号和在V 型槽切面发生迭加效应的信号发生完全反射,导致信号通过光纤边界泄露。

  由于这种窃听方法导致的信号衰减很小,因此很难被发现。V 型槽切口法需要精确的切割和切面抛光设备,窃听部署需要持续较长时间,因此,光纤保护层的切割和抛光过程将面临被发现的危险。

4、散射法是采用光纤Bragg 光栅技术实现的一种隐蔽窃听方法,它采用一个紫外光激态激光器产生紫外光的迭加并影响目标光纤信号,通过在目标光纤纤心形成的Bragg 光栅反射出的一部分光信号实现对目标光纤的隐蔽窃听,是目前最先进的光纤窃听技术,常规的网络检测和监控手段都很难识别这种窃听行为。散射法不需要对光纤进行弯曲、切割或抛光,但是它需要更精密的窃听设备并且部署非常困难,比如产生有效的外部干扰干涉光束,并在目标光纤纤心产生光栅耀斑都需要精密的控制技术,而对于光栅耀斑反射出的光信号的检测也需要精密的检测技术。

5、渐近耦合法,渐近耦合法首先抛光光纤的保护层,使窃听光纤纤心尽可能贴近目标光纤纤心,通过减少保护层的反射引出部分信号到窃听光纤里面,由于光纤纤心非常细,实施这种方法非常困难,又由于光纤的保护层被抛光将产生1~2 dB 的光纤损耗,因此很难实现隐蔽的窃听。

  以上几种窃听光纤信号的方法都可以通过一些技术手段得到光纤信号,特别是光纤弯曲法、V 型槽切口法,能够实现隐蔽窃听,又由于实施相关窃听相对容易一些,因此具有较高的实战应用价值。

如何检测是否有窃听:

用光测试仪测试光衰,用光时域反射仪来看光纤中的断点,变形等。

光时域反射仪(OTDR)

  OTDR 的原理是通过精确地发射各种波长的有规律的光脉冲并测量反射光信号返回的时间和反射光信号的强度来分析光纤信道情况。通过跟踪反射光信号的时间和强度,OTDR 能够确定光环路的完整路径。另外,OTDR还可以识别光纤断路的距离。通过测试和保存OTDR 的参数,终端用户可以监控光路的变化并识别任何可能的光路入侵。由于OTDR( 包括偏振OTDR) 能够识别不连续的损耗,可以检测双折射、压力和其他由窃听引起的光信号变形等,因此,具有检测光纤断裂、弯曲、异常损耗和各种窃听等异常情况的能力。

另外可以从技术上防止光纤被窃听而造成的敏感信息泄露。比如加密,目前,比较实用的光纤信号保护手段主要有无规律载波光纤通信技术、基于混沌保密的光纤通信方式和光纤信道加密技术等。使用这些技术,可以在一定程度上增强光纤信号的保密性,这种信息保护方式对于业余窃听爱好者来说可能是一筹莫展,但是它对具有超强计算和分析能力的专业窃听机构并不能提供完全的保密性。

阿里云打开mysql远程连接

先进阿里云控制台,安全组规则打开请允许入方向的3306端口TCP连接

然后再进操作系统

解决mysql不能使用IP链接的问题

1) 修改%xampp%\mysql\bin\my.ini文件,搜索

bind-address=“127.0.0.1”

改成

bind-address=“0.0.0.0”

2) 修改%xampp%\phpMyAdmin\config.inc.php文件,搜索:

/* Authentication type and info */

$cfg[‘Servers’][$i][‘auth_type’] =‘config’;

$cfg[‘Servers’][$i][‘user’] =‘root’;

$cfg[‘Servers’][$i][‘password’] =”;

$cfg[‘Servers’][$i][‘extension’] =‘mysql’;

$cfg[‘Servers’][$i][‘AllowNoPassword’] = true;

改成:

/* Authentication type and info */

$cfg[‘Servers’][$i][‘auth_type’] =‘cookie’;

$cfg[‘Servers’][$i][‘user’] =‘root’;

$cfg[‘Servers’][$i][‘password’] =‘root’;

$cfg[‘Servers’][$i][‘extension’] =‘mysql’;

$cfg[‘Servers’][$i][‘AllowNoPassword’] = true;

3) 启动mysql、apache,登录phpMyAdmin。在“权限”部分添加一个root@%用户,内容参照 root@localhost 的设置;两者的区别就是主机字段,一个写%,一个写localhost;

xampp下mysql开启远端连接

1、进入phpmyadmin管理界面首页,点击“权限”后,再“添加新用户”,用户名:root(随意),主机:%(必须是%),对应的密码可以设置可以不设置,即可开通远程连接;2、或者用工具Navicat链接到本地数据,点击“管理用户”,后添加用户,同上操作即可开通远端连接。

腾讯文档多人协作

要多人共同同时操作一个表或者文档时,可以用腾讯文档,石墨文档等,如下面说下腾讯文档

进腾讯文档后,可新建在线文档,在线EXCEL表,在线PPT,在线信息收集表,在线思维图等,创建人有所有权,

如创建在线表格后,可以通过右上解的分享等功能,或者其它人可扫微信等来得到查看和编辑权限,

有编辑权限后就可以一起操作表格了,如可以进行筛选等表格常用操作,可以用数据验证来设置单元格的格式为下位选框,复选框,日期等,

可以套用模板,用插件等

总体比较好用,别人在编辑一个单元格时也会有标示,以免两个人同时编辑一个单元格,但偶尔会出现别人编辑完,你这边还没显示的情况,

下载评论多的抖音视频和相关的评论

抖音有些评论相当的精彩,所以这次用python加fiddler来下载评论多的视频和相应的评论

刚开始打算用fiddler来抓抖音手机APP的包,按如下配置:

1、fiddler只能抓http/https协议的包,默认只能抓http协议包

如果要抓https协议包,需要如下配置:

Tools-Options-HTTPS-依次勾选全部

2、Actions里面-Trust Root Certificate-确定 来trust信用证书

3、Connections,设置端口号,fiddler默认8888

如果是手机用数据线连电脑就要把里面的 允许远程电脑连接也点上

4、如果是模拟器里装抖音或者手机装抖音并通过WIFI连接网络来抓包就在模拟器或者手机里设置网络代理为装fiddler的电脑IP

5、在手机上打开装fiddler的电脑的IP:8888,下载证书安装

按网上这个步骤来会导致抖音上不了网,按分析有可能是抖音应用证书问题,用了SSL Pinning主要就是来防止中间人攻击的,安卓应用会在HTTPS建立时对服务端返回的证书作校验,如果不一致则无法建立连接,我们用到的抓包工具fiddler或burpsuite实际上就是在起一个中间人的作用。具体可以参考https://zhuanlan.zhihu.com/p/511136064,以后再按这个来试下,今天还是按抖音网页版来抓包分析吧,

此段代码放到fiddler中的script的response中

 if (m_Hide304s && oSession.responseCode == 304) {
      oSession["ui-hide"] = "true";
    }
    
    if (oSession.uriContains("https://aweme.snssdk.com/aweme/v1/general/search/single/")){
      var strBody=oSession.GetResponseBodyAsString();
      var sps = oSession.PathAndQuery.slice(-58,);
      //FiddlerObject.alert(sps)
      var timestamp=new Date().getTime();
      var filename = "D:\抖音评论资料" + "/" + sps + timestamp + ".json";
      var curDate = new Date(); 
      var sw : System.IO.StreamWriter; 
      if (System.IO.File.Exists(filename)){ 
        sw = System.IO.File.AppendText(filename); 
        sw.Write(strBody); 
      } 
      else{ 
        sw = System.IO.File.CreateText(filename); 
        sw.Write(strBody); 
      } 
      sw.Close(); 
      sw.Dispose(); 

替换掉上面的网址和保存地址,这样网页版刷抖音时会把评论的JSON文件下载下来,视频信息JSON也同理操作

下载后用python分析JSON数据,把评论数大于36000的视频下载,并把相应的评论,视频信息插入数据库,相关代码见pycharm代码库

后面将把视频和评论在网站上展示出来。

NAT类型

下载并运行《NatTypeTester》,因工具原地址已失效,将STUN server栏中的地址修改成“stun.voipbuster.com”或者stun.qq.com,点击“GET”即可测试类型。

1. Full Cone NAT:NAT1将来自同一个内部元组X的的所有请求转换为同一个外部元组Y,无论这些请求属于同一个应用程序还是多个应用程序。此外,当X-Y转换关系建立后,任何外部主机都可以随时使用Y中的地址和端口作为目标地址和端口,向内部主机发送UDP消息。因为对外部请求的来源没有限制,所以这个方法足够简单,但是不那么安全。(任何外部主机/端口都可以与前一个内部节点映射到的外部元组通信)


2.Restricted Cone NAT:它是Full Cone的受限版本:来自同一个内部元组X的的所有请求都被NAT转换为同一个外部元组Y,与Full
Cone相同,但不同的是只有当内部主机已经向外部主机发送了消息(假设其IP地址为Z)时,
外部主机可以以Y中的信息作为目标地址和端口向内部主机发送UDP请求消息,这意味着NAT设备只转发(转换目标地址/端口)那些来自当前已知外部主机的UDP消息,从而保证了外部请求源的安全性。
(IP相同,端口任意,可以与前一个内部节点映射到的外部Tuple通信)

Port Restricted Cone NAT(NAT3

端口受限锥型NAT,相比NAT2,NAT3 又增加了端口限制,也就是说IP、端口都会受限。


Symmetric NAT(NAT4

对称型NAT,具有端口受限锥型的受限特性,内部地址每一次请求一个特定的外部地址,都可能会绑定到一个新的端口号。也就是请求不同的外部地址映射的端口号是可能不同的。这种类型基本上就告别 P2P 了。


由上面可以看出从NAT1到NAT4限制越来越多,为了各种需求,我们希望提升NAT类型。提升NAT类型的好处有,浏览网页、观看视频、游戏等更顺畅,下载速度更稳定快速,尤其是对喜欢玩游戏的用户,提升NAT类型后更容易进入游戏房间连线等。

IPv6

IPv6地址表示

  我们知道,IPv4地址长度为32位(4个字节)。书写IPv4的地址是用一个字节来代表一个无符号十进制整数,四个字节写成由3个点分开的四个十进制数,例如:

  10.1.123.56

  对于128位的IPv6地址,定义相似的表示方法是必要的。 考虑到IPv6地址的长度是原来的四倍,RFC1884规定的标准语法建议把IPv6地址的128位(16个字节)写成8个16位的无符号整数,每个整数用四个十六进制位表示,这些数之间用冒号(:)分开,例如:

  3ffe:3201:1401:1:280:c8ff:fe4d:db39

  从上面的例子我们看到了手工管理IPv6地址的难度,也看到了DHCP和DNS的必要性。为了进一步简化IPv6的地址表示,可以用0来表示0000,用1来表示0001,用20来表示0020, 用300来表示0300,只要保证数值不便,就可以将前面的0省略。比如:

  1080:0000:0000:0000:0008:0800:200C:417A

  0000:0000:0000:0000:0000:0000:0A00:0001

  可以简写为:

  1080:0:0:0:8:800:200C:417A

  0:0:0:0:0:0:A00:1

  另外,还规定可以用符号::表示一系列的0。那么上面的地址又可以简化为:

  1080::0:8:800:200C:417A

  A00:1

和IPv4一样,IPv6也分公网和内网,开头只要不是F开头,都是公网IP。

国内三大运营商的IPv6地址分配情况分别是:

电信为240e开头的(240e::/20);移动为2409开头的(2409:8000::/20);联通为2408开头的(2408:8000::/20)。 如果外网获取到的是fe80开头的地址,是不能拿来上网的。

fe80::/10,做内网地址,本地链路地址,用于单一链路,适用于自动配置、邻机发现等,路由器不转发以fe80开头的地址,私网地址是fd00::/8,这相当于IPv4的10.0.0.0/8、172.16.0.0/12、192.168.0.0/16

  IPv6地址的前缀(FP, Format Prefix)的表示和IPv4地址前缀在CIDR中的表示方法类似。比如 0020:0250:f002::/48表示一个前缀为48位的网络地址空间。

IPv6:前缀ID+接口ID/前缀长度,如2001:0000:0000:0000:0011:0000:0000:0010/64

IPv6的数字太多,多到地球上每粒沙子都能分配一个,这么多的ip怎么来划分一块一块的呢、如何区分呢?所以就有了前缀这个概念。

IPv6的前缀就是把IPv6的地址,转换为二进制,从左向右的个数。

例如:fe80::/10

这个/10就是fe80的前缀,我们把fe80转换为二进制,就是:1111 1110 1000 0000,我们从左向右数,十位二进制分别为1111 1110 10,这十位是不能动的,就意味着,前缀是不能动的,固定的,只有后面的118位是可以变动的。那么这个二进制后面就可以写为: 1111 1110 1011 1111 11111 11111 1111 1111………….

综上,fe80::/10的ip范围就是:fe80::—-febf:ffff:ffff:ffff:ffff:ffff:ffff:ffff

比如电信给我家里分配的地址为:240e:fc:b841:700::/56 ,其实就是240e:00fc:b841:0700::,前面不能变动,后面的都属于我,想一想,这得有多少个IPv6,多的数不完。

运营商提供的IPv6线路主要分为支持前缀授权和不支持前缀授权两种,支持前缀授权就是把一整个网段直接给你自己去用,可在路由器设置中开启前缀授权功能,在外部网络/WAN配置里面,连接类型选择Native DHCP即可,有些路由器会是自动获取这个选项,需要注意的是获取到外网IPv6的IP后,可能还需要手动开启内网的DHCP v6用于给该路由器下联的设备分配IP,无特殊需求用默认的stateless即可,设置好路由器的相关参数后,终端(电脑、手机等)勾选IPv6协议,并开启自动获取IPv6地址和DNS服务器即可,

对于不支持前缀授权的运营商线路,无法由路由器给终端分配IPv6地址,终端IPv6地址统一由运营商进行分配,因此需要路由器支持IPV6桥模式,打开桥模式,再把wan和lan的V6功能禁用就可以了

设置好后打开浏览器输入www.test-ipv6.com,就可以看到线路是否支持IPv6了。

::1/128,即0:0:0:0:0:0:0:1,回环地址,就是IPv4中的localhost(127.0.0.1)

RFC1884中指出了三种类型的IPv6地址,他们分别占用不同的地址空间:

  单点传送:这种类型的地址是单个接口的地址。发送到一个单点传送地址的信息包只会送到地址为这个地址的接口。

  任意点传送:这种类型的地址是一组接口的地址,发送到一个任意点传送地址的信息包只会发送到这组地址中的一个(根据路由距离的远近来选择)

  多点传送:这种类型的地址是一组接口的地址,发送到一个多点传送地址的信息包会发送到属于这个组的全部接口。 和IPv4不同的是,IPv6中出现了任意点传送地址,并以多点传送地址代替了IPv4中的广播地址。

  

IPV6地址在线ping

Emoji表情插入Mysql时表字符集要转改成 utf8mb4

问题描述:

  插入Mysql时失败了,python代码报如下异常:

  pymysql.err.InternalError: (1366, “Incorrect string value: ‘\\xF0\\x9D\\x90\\xBF;……

原因分析:

  UTF-8编码有可能是两个、三个、四个字节。Emoji表情是4个字节,而Mysql的utf8编码最多3个字节,所以数据插不进去。

解决方案:

  修改Mysql表的字符集和Pymysql连接库时的字符集。

  1、修改Mysql表的字符集

    说明:将已经建好的表字符集转改成 utf8mb4,排序规则改为 utf8mb4_bin

    命令:alter table TABLE_NAME convert to character set utf8mb4 collate utf8mb4_bin; (将TABLE_NAME替换成你的表名)

    注意:排序规则不是 utf8mb4_general_ci,而是utf8mb4_bin,不要想当然

  2、修改数据库连接的字符集        

    conn = pymysql.connect(host=’localhost’, user=’root’, password=’root’, port=3306, db=’cncb’, charset=’utf8mb4′)

安全访问服务边缘 (SASE),SD-WAN

远距离组网一般的解决方案是向ISP购买服务、申请专网、专线,通过对方协助来完成对私有WAN的搭建,

SD-WAN,Software Defined Wide Area Network,即软件定义广域网,是将SDN技术应用到广域网场景中所形成的一种服务,这种服务用于连接广阔地理范围的企业网络、数据中心、互联网应用及云服务。这种服务的典型特征是将网络控制能力通过软件方式‘云化’,支持应用可感知的网络能力开放。

SD-WAN的具体原理与云计算有点相像,将控制机制进行分离,并使网络硬件虚拟化,具有灵活、可靠等优势。

在实际运用方面,SD-WAN不仅可在物理硬件上实现,在软件上也能轻松实现。也就是说,基于SD-WAN的应用不受底层硬件和协议的约束,对公网IP没有要求,甚至可基于Internet之类的公共网络搭建私有WAN。得益于软件层面的特殊性,用户可以对网络进行控制,提升数据传输安全性。

由于SD-WAN对底层硬件的虚拟化,可使流量具备较高的可见性,并将数据进行针对性分流,期间通过多手段进行加速。

SD-WAN优势总结:

1、无需公网IP支持多种连接类型,可利用Internet或4G、5G网络搭建私有WAN,

2、拥有线路选择能力,能够实现负载均衡或分流

3、具备简单、快速的部署过程及管理界面

4、能够支持防火墙、流量控制、虚拟私人网络等服务和应用

SASE将 SD-WAN和网络安全解决方案(FWaaS、CASB、SWG 和ZTNA)融合到统一的云原生服务中。

相比传统VPN的用户名密码的安全接入方案,SASE更强调最小化的安全控制策略,即除了用户认证之外,还对用户所使用的设备、所在的网络环境进行安全认证,解决了传统VPN方案的固有安全隐患。SASE平台上的所有通信都是加密的。

gevent部署python网站

上篇我们用flask部署了一个很简单的网站,但是在开发环境下,不稳定,我们可以用gevent再来部署一个

可以先在命令行pip install gevent装好,然后

from flask import Flask
from gevent import pywsgi
app = Flask(name)

@app.route(‘/’)
def hello_world():
return ‘hello world’

server = pywsgi.WSGIServer((‘0.0.0.0’,12345),app)
server.serve_forever()

if name == ‘main‘:
app.run()

运行后会发现什么信息都没显示,但是用IP:12345正常访问!不知道这算不算是用wsgi 服务启动了!

另外会发现读取 .flaskenv 的值是读取不了,代码如下:

import os

mysql_config = {
‘DIALECT’ : os.getenv(‘MYSQL_DIALECT’),
‘DRIVER’ : os.getenv(‘MYSQL_DRIVER’),
‘USERNAME’ : os.getenv(‘MYSQL_USERNAME’),
‘PASSWORD’ : os.getenv(‘MYSQL_PASSWORD’),
‘HOST’ : os.getenv(‘MYSQL_HOST’),
‘PORT’ : os.getenv(‘MYSQL_PORT’),
‘DATABASE’ : os.getenv(‘MYSQL_DATABASE’)
}
需要加上以下代码才能读取

from dotenv import load_dotenv
load_dotenv(dotenv_path=’.flaskenv’,override=True)

python用flask搭建一个简单网站

我们可以使用Python语言快速实现一个网站或Web服务。本文参考自Flask官方文档,大部分代码引用自官方文档。

首先我们来安装Flask。最简单的办法就是使用pip,当你装好了python后,直接在命令行下输入。

pip install flask

然后打开一个文件,输入下面的内容并保存为app.py,然后在命令行下换到文件所在目录,再(python app.py)运行该文件。然后浏览器访问IP:5000,我们应当可以看到浏览器上输出了hello world。

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'hello world'

if __name__ == '__main__':
    app.run(host='0.0.0.0',port=5000)

路径变量

如果希望获取/article/1这样的路径参数,就需要使用路径变量。路径变量的语法是/path/<converter:varname>。在路径变量前还可以使用可选的转换器,有以下几种转换器。

转换器作用
string默认选项,接受除了斜杠之外的字符串
int接受整数
float接受浮点数
path和string类似,不过可以接受带斜杠的字符串
any匹配任何一种转换器
uuid接受UUID字符串

下面是Flask官方的例子。

@app.route('/user/<username>')
def show_user_profile(username):
    # show the user profile for that user
    return 'User %s' % username

@app.route('/post/<int:post_id>')
def show_post(post_id):
    # show the post with the given id, the id is an integer
    return 'Post %d' % post_id

构造URL

通过构建URL的方式直接在代码中拼URL的原因有两点:
1.将来如果修改了URL,但没有修改该URL对应的函数名,就不用到处去替换URL了。
2. url_for()函数会转义一些特殊字符和unicode字符串,这些事情url_for会自动的帮助我们搞定。

在Web程序中常常需要获取某个页面的URL,在Flask中需要使用url_for('方法名')来构造对应方法的URL。下面是Flask官方的例子。

>>> from flask import Flask, url_for
>>> app = Flask(__name__)
>>> @app.route('/')
... def index(): pass
...
>>> @app.route('/login')
... def login(): pass
...
>>> @app.route('/user/<username>')
... def profile(username): pass
...
>>> with app.test_request_context():
...  print url_for('index')
...  print url_for('login')
...  print url_for('login', next='/')
...  print url_for('profile', username='John Doe')
...
/
/login
/login?next=/
/user/John%20Doe

HTTP方法

如果需要处理具体的HTTP方法,在Flask中也很容易,使用route装饰器的methods参数设置即可。

get和post 请求区别:
get是将请求写在url里的。
而post是写在form表单中的。

在route的methods中,写好post方法,否则默认是get,一旦请求方式是post会报错。

from flask import request

@app.route('/login', methods=['GET', 'POST'])
def login():
    if request.method == 'POST':
        do_the_login()
    else:
        show_the_login_form()

静态文件

Web程序中常常需要处理静态文件,在Flask中需要使用url_for函数并指定static端点名和文件名。在下面的例子中,实际的文件应放在static/文件夹下。

url_for('static', filename='style.css')

模板生成

Flask默认使用Jinja2作为模板,Flask会自动配置Jinja 模板,所以我们不需要其他配置了。默认情况下,模板文件需要放在templates文件夹下。

使用 Jinja 模板,只需要在python文件中使用render_template函数并传入模板文件名和参数名即可。

from flask import render_template

@app.route('/hello/')
@app.route('/hello/<name>')
def hello(name=None):
    return render_template('hello.html', name=name)

相应的templates文件夹里的HTML模板文件如下。用两个大括号写变量,用大括号加百分号写语句,访问时输入IP:端口/hello/就可以访问

<!doctype html>
<title>Hello from Flask</title>
{% if name %}
  <h1>Hello {{ name }}!</h1>
{% else %}
  <h1>Hello, World!</h1>
{% endif %}