首页 文章 精选 留言 我的

精选列表

搜索[双足行走],共9123篇文章
优秀的个人博客,低调大师

SmsForwarder (短信转发器) v2.3.0 双 12 狂欢版

短信转发器——监控Android手机短信、来电、APP通知,并根据指定规则转发到其他手机:钉钉机器人、企业微信群机器人、飞书机器人、企业微信应用消息、邮箱、bark、webhook、Telegram机器人、Server酱、PushPlus、手机短信等。 本次更新内容: 新增:Telegram通过socks5/HTTP代理转发 优化:关于软件页面下打开开机启动,将尝试跳转到系统自启动设置界面 优化:限制只能安装只内部卡,避免自启动失败(待验证) 修复:转发到其他手机,多个手机号用分号分隔无效的bug 优化:日志增加一个中间状态 & 记录接口请求重试日志 优化:电池状态监听(剩余电量预警上下限,电池状态改变) 新增:转发规则上支持配置正则替换内容(用法:详见开源仓库Wiki) 优化:升级XUpdate组件版本 优化:同一卡槽同一秒的重复未接来电广播不再重复处理(部分机型会收到两条广播?) 修复:多个企业微信应用 access_token 并存问题

优秀的个人博客,低调大师

微服务网关白名单设计 | 水木双

场景 我们的微服务网关(go 编写)需要增加具体的内网系统接入白名单认证,白名单有 IP 地址、系统名称两种数据,内网的系统部署方式各式各样, 微服务、单机、多机负载均衡、k8s、docker 原生等等,数据总数约 40W 个。我们的目的是需要验证 IP 是否在我们的白名单列表中即可,存在则可访问服务,不存在则拒绝访问。 解决方案 方案 1 IP 白名单列表不适合放在数据库,数据库查询有耗时,选择放在 nosql 上,最终我们选择了 redis。数据结构的选择, redis 支持 string、list、hash、set、zset,把白名单实体(IP 或者应用名)当做一个 key,实际的数据我们可以不储存,我们只要寻找是否存在 key 来判断是否存在白名单就可以了,所以具体用什么数据类型不重要,直接用 string 就好,所以总结一下方案 1,白名单实体做 redis 的 key,用判断 redis 的 key 是否 exists 去验证白名单。 优点: 用 key exists 的方式判断白名单实体是否存在比较快速,性能好 缺点: 每次验证都要连接 redis,并发量大的时候,比较耗资源 方案 2 把所有的白名单实体,包括 IP、应用名以 string 的数据结构全部储存在 redis 的一个 key,每次验证白名单时,都从 key 获取 value,然后判断应用名、IP 地址是否存在 string(strings.Contain 之类的判断)中,以此来验证是否可授权访问服务 优点:几乎没有 缺点: 每次验证都要连接 redis,而且要在超大字符串中判断某实体(字符串格式)是否存在,性能低 直接 pass 方案 3 在方案 1 的基础上,每次网关启动的时候,先装载 redis 数据,然后将 redis 的 key 转为原生的 map(原生数据结构效率高,不依赖于任何第三方数据结构实现),每次服务请求,判断来源是否存在 map 的 key 中,以此来验证白名单。 白名单初始化规则: 每次网关启动时,即从 redis 读取数据,转为原生 map 白名更新规则: 网关提供更新已经装载了的白名单数据接口,当加入白名单时,数据写到 redis 之后,即调用网关接口,更新装载在每个网关服务内存里的白名单数据 具体技术细节 map 在并行读写时的处理 map 支持并行同时读,但是不支持并行读写。分析下我们的场景,我们的白名单数据 map 是读多写少,90% 的场景都是在读,网关在进行黑白名单验证的时候,会同时对 map 进行读写,为避免出现读写冲突锁错误,我们需要用 sync.map 来线程安全处理 map 数据。这里还有一个第三方的 concurrent_map 方案,经测试和 sync.map 性能几乎差不多,因为我们又是读多写少的场景,所以这里用原生的 sync.map 即可。 map 的设计优化 因为我们的白名单实体只是作为 map 的 key,所以对于 map 的 value 来说,我们用空结构体来定义 struct{} 来定义,go 的空结构体是可寻址的,是不用占内存空间的,节省内存资源。 巨大 map 获取 key 时的性能问题(约 40W 个 key) 通过预设容量来提高巨大 map 的查询时间,尽量减少 rehash,以空间换时间。 whilteList := make(map[int]struct{}, 400000) if v, ok := whiteList[key]; ok { } else { } 参考 https://blog.csdn.net/weixin_43194921/article/details/104526477 https://leokongwq.github.io/2016/10/15/golang-performance-optimize-map.html

优秀的个人博客,低调大师

H3C校园双出口配置案例,可跟做!

关于H3C的路由器、交换机基础理论知识,可以参看博文:H3C产品简介及基础配置命令 1.案例拓补 该拓扑图中的校园网内部分为两个网段:一个为学生校舍网段(192.168.2.0),主要访问电信提供的internet服务器;另外一个网段为校园办公和教学用网段(192.168.3.0),主要访问教育网。校园网出口路由器连接了电信提供的internet20m光纤,同时也连接了教育网的20m光纤(由于H3C的模拟器无法模拟出PC和server,所以只好使用路由器来代替了)。 本次案例使用的模拟器是H3C Cloud Lab,网盘链接:链接:https://pan.baidu.com/s/1MK-nw5MpkroXvhf-kFgG3w 提取码:xfup 2.案例需求 (1)路由器配置要求:当其中任意一条外部光纤中断时,另一条光纤可备份其下属的网段访问internet服务或教育网资源。(2)Nat配置要求:出口路由器的两个出口都能同时使用校园内网的私有网段做nat后访问外部资源。教育网出口接口处还配置了nat server,使内部的教学网段的某个ip服务器对教育网提供telnet访问服务。(3)策略路由配置要求:校园网内的教学用网段192.168.3.0/24主要通过教育网访问外部资源,而校舍网段192.168.2.0/24主要通过电信出口访问Internet资源。当教育专网的光纤故障时,校舍网段可以通过电信出口访问相关教育网资源,当电信的光纤线路故障时,校舍网段可以通过专网出口访问相关资源。 3.案例实施 (1)基本配置 PC1的配置: Automatic configuration is running, press CTRL_D to break. //每个设备开机时,都需使用组合键Ctrl+D才可进行配置 [PC1]int g0/0 [PC1-GigabitEthernet0/0]ip add 192.168.2.100 255.255.255.0 [PC1-GigabitEthernet0/0]undo shutdown [PC1-GigabitEthernet0/0]quit [PC1]ip route-static 0.0.0.0 0.0.0.0 192.168.2.1 //配置默认路由(网关) PC2的配置: [PC2]int g0/0 [PC2-GigabitEthernet0/0]ip add 192.168.3.100 255.255.255.0 [PC2-GigabitEthernet0/0]undo shutdown [PC2-GigabitEthernet0/0]quit [PC2]ip route-static 0.0.0.0 0.0.0.0 192.168.3.1 server的配置: [server]int g0/0 [server-GigabitEthernet0/0]ip add 192.168.3.250 255.255.255.0 [server-GigabitEthernet0/0]undo shutdown [server-GigabitEthernet0/0]quit [server]ip route-static 0.0.0.0 0.0.0.0 192.168.3.1 SW1的配置: [sw1]vlan 2 [sw1-vlan2]vlan 3 //创建vlan2、vlan3 [sw1-vlan3]quit [sw1]int vlan 1 [sw1-Vlan-interface1]ip add 192.168.1.2 255.255.255.0 [sw1-Vlan-interface1]undo shutdown [sw1-Vlan-interface1]int vlan 2 [sw1-Vlan-interface2]ip add 192.168.2.1 255.255.255.0 [sw1-Vlan-interface2]undo shutdown [sw1-Vlan-interface2]int vlan 3 [sw1-Vlan-interface3]ip add 192.168.3.1 255.255.255.0 [sw1-Vlan-interface3]undo shutdown [sw1-Vlan-interface3]int g1/0/6 [sw1-GigabitEthernet1/0/6]port access vlan 2 [sw1-GigabitEthernet1/0/6]int g1/0/7 [sw1-GigabitEthernet1/0/7]port access vlan 3 [sw1-GigabitEthernet1/0/7]int g1/0/8 [sw1-GigabitEthernet1/0/8]port access vlan 3 //将接口加入指定vlan中 R1的配置: [R1]int g0/0 [R1-GigabitEthernet0/0]ip add 202.202.202.2 255.255.255.252 [R1-GigabitEthernet0/0]undo shutdown [R1-GigabitEthernet0/0]int g0/1 [R1-GigabitEthernet0/1]ip add 200.200.200.2 29 //子网掩码也支持数值 [R1-GigabitEthernet0/1]undo shutdown [R1-GigabitEthernet0/1]int g0/2 [R1-GigabitEthernet0/2]port link-mode bridge //将接口改为bridge类型 //所有接口默认属于vlan1,所以相当于G0/2的接口IP已经是vlan 1的IP地址了 [R1-GigabitEthernet0/2]int vlan 1 [R1-Vlan-interface1]ip add 192.168.1.1 24 [R1-Vlan-interface1]undo shutdown R2的配置: [R2]int g0/0 [R2-GigabitEthernet0/0]ip add 202.202.202.1 30 [R2-GigabitEthernet0/0]undo shutdown [R2-GigabitEthernet0/0]int g0/1 [R2-GigabitEthernet0/1]ip add 222.222.222.1 30 [R2-GigabitEthernet0/1]undo shutdown [R2-GigabitEthernet0/1]int loop 0 [R2-LoopBack0]ip add 202.202.0.1 32 R3的配置: [R3]int g0/0 [R3-GigabitEthernet0/0]ip add 222.222.222.2 30 [R3-GigabitEthernet0/0]undo shutdown [R3-GigabitEthernet0/0]int g0/1 [R3-GigabitEthernet0/1]ip add 200.200.200.1 29 [R3-GigabitEthernet0/1]undo shutdown [R3-GigabitEthernet0/1]int g0/2 [R3-GigabitEthernet0/2]ip add 202.1.1.1 24 [R3-GigabitEthernet0/2]undo shutdown PC3的配置: [pc3]int g0/0 [pc3-GigabitEthernet0/0]ip add 202.1.1.2 24 [pc3-GigabitEthernet0/0]undo shutdown [pc3-GigabitEthernet0/0]quit [pc3]ip route-static 0.0.0.0 0.0.0.0 202.1.1.1 (2)路由配置 sw1配置默认路由: [sw1]ip route-static 0.0.0.0 0.0.0.0 192.168.1.1 //配置一条默认路由指向R1 R1配置静态路由和ospf: [R1]ip route-static 192.168.3.0 255.255.255.0 192.168.1.2 [R1]ip route-static 192.168.2.0 255.255.255.0 192.168.1.2 [R1]ospf 1 [R1-ospf-1]area 0 [R1-ospf-1-area-0.0.0.0]net 0.0.0.0 255.255.255.255 R2配置ospf: [R2]ospf 1 [R2-ospf-1]area 0 [R2-ospf-1-area-0.0.0.0]net 0.0.0.0 255.255.255.255 R3配置ospf: [R3]ospf 1 [R3-ospf-1]area 0 [R3-ospf-1-area-0.0.0.0]net 0.0.0.0 255.255.255.255 (3)配置NAT R1的配置NAT: [R1]acl basic 2001 //创建ACL,编号为2001 [R1-acl-ipv4-basic-2001]rule 0 permit source 192.168.2.0 0.0.0.255 [R1-acl-ipv4-basic-2001]rule 5 permit source 192.168.3.0 0.0.0.255 [R1-acl-ipv4-basic-2001]rule 10 deny [R1-acl-ipv4-basic-2001]int g0/0 [R1-GigabitEthernet0/0]port link-mode route [R1-GigabitEthernet0/0]description link_to_tel [R1-GigabitEthernet0/0]nat outbound 2001 [R1-GigabitEthernet0/0]int g0/1 [R1-GigabitEthernet0/1]port link-mode route [R1-GigabitEthernet0/1]description link_to_end [R1-GigabitEthernet0/1]nat outbound 2001 //将ACL应用到两个出接口上,匹配到ACL2001的,都进行nat转换 验证PC1是否能够ping通R2路由器上的loopback接口地址: 验证PC1是否能够ping通PC3: 在R1路由器查看NAT转换表: [R1]display nat session verbose Slot 0: Initiator: Source IP/port: 192.168.2.100/44032 //源地址是192.168.2.100 Destination IP/port: 202.202.0.1/2048 //目标地址是202.202.0.1 DS-Lite tunnel peer: - instance/VLAN ID/VLL ID: -/-/- Protocol: ICMP(1) Inbound interface: Vlan-interface1 Responder: Source IP/port: 202.202.0.1/3 //202.202.0.1的返回流量 Destination IP/port: 202.202.202.2/0 //200.200.200.2接口进入内网 DS-Lite tunnel peer: - instance/VLAN ID/VLL ID: -/-/- Protocol: ICMP(1) Inbound interface: GigabitEthernet0/0 State: ICMP_REPLY Application: OTHER Start time: 2019-10-29 07:48:16 TTL: 28s Initiator->Responder: 0 packets 0 bytes Responder->Initiator: 0 packets 0 bytes Initiator: Source IP/port: 192.168.2.100/43776 //源地址是192.168.2.100 Destination IP/port: 202.1.1.2/2048 //目标地址是200.1.1.2 DS-Lite tunnel peer: - instance/VLAN ID/VLL ID: -/-/- Protocol: ICMP(1) Inbound interface: Vlan-interface1 Responder: Source IP/port: 202.1.1.2/3 //202.1.1.2的返回流量 Destination IP/port: 200.200.200.2/0 //200.200.200.2接口进入内网 DS-Lite tunnel peer: - instance/VLAN ID/VLL ID: -/-/- Protocol: ICMP(1) Inbound interface: GigabitEthernet0/1 State: ICMP_REPLY Application: OTHER Start time: 2019-10-29 07:47:47 TTL: 0s Initiator->Responder: 0 packets 0 bytes Responder->Initiator: 0 packets 0 bytes Total sessions found: 2 (4)配置策略路由 R1配置策略路由: [R1]acl advanced 3001 //定义扩展ACL,编号为3001 [R1-acl-ipv4-adv-3001]rule 0 permit ip source 192.168.3.0 0.0.0.255 [R1-acl-ipv4-adv-3001]quit [R1]policy-based-route al permit node 10 //配置策略路由 [R1-pbr-al-10]if-match acl 3001 //如果匹配acl 3001 [R1-pbr-al-10]apply next-hop 200.200.200.1 //下一跳指向200.200.200.1 [R1-pbr-al-10]quit [R1]policy-based-route al permit node 20 //空节点,放行其他流量 [R1-pbr-al-20]quit [R1]int Vlan-interface 1 [R1-Vlan-interface1]ip policy-based-route al //在此接口下应用路由策略,因为需要做策略路由的数据包都是从这个接口下转发过来的 测试pc1pingpc3,并查看nat转换表 [R1]display nat session verbose Slot 0: Initiator: Source IP/port: 192.168.2.100/45824 Destination IP/port: 202.1.1.2/2048 DS-Lite tunnel peer: - instance/VLAN ID/VLL ID: -/-/- Protocol: ICMP(1) Inbound interface: Vlan-interface1 Responder: Source IP/port: 202.1.1.2/4 Destination IP/port: 200.200.200.2/0 //注意看这里 DS-Lite tunnel peer: - instance/VLAN ID/VLL ID: -/-/- Protocol: ICMP(1) Inbound interface: GigabitEthernet0/1 State: ICMP_REPLY Application: OTHER Start time: 2019-10-29 08:01:58 TTL: 27s Initiator->Responder: 0 packets 0 bytes Responder->Initiator: 0 packets 0 bytes Total sessions found: 1 测试pc2pingpc3,并查看nat转换表 [R1]display nat session verbose Slot 0: Initiator: Source IP/port: 192.168.3.100/43008 Destination IP/port: 202.1.1.2/2048 DS-Lite tunnel peer: - instance/VLAN ID/VLL ID: -/-/- Protocol: ICMP(1) Inbound interface: Vlan-interface1 Responder: Source IP/port: 202.1.1.2/6 Destination IP/port: 200.200.200.2/0 DS-Lite tunnel peer: - instance/VLAN ID/VLL ID: -/-/- Protocol: ICMP(1) Inbound interface: GigabitEthernet0/1 State: ICMP_REPLY Application: OTHER Start time: 2019-10-29 08:04:55 TTL: 27s Initiator->Responder: 0 packets 0 bytes Responder->Initiator: 0 packets 0 bytes Total sessions found: 1 可以看到策略路由已经生效了,并且现在关闭R1路由器的G0/0和G0/1中的任何一个接口,都不会影响内网与外网的通信,可自行测试。 (5)配置NAT server映射 R1配置NAT server: [R1]int g0/1 [R1-GigabitEthernet0/1]nat server protocol tcp global 200.200.200.2 23 inside 192.168.3.250 23 //配置NAT映射,将内部的服务器192.168.3.250的23端口映射到全局地址200.200.200.2的23端口上 server开启Telnet: [server]telnet server enable //默认就是开启,可以省略 [server]local-user admin //创建本地用户admin New local user added. [server-luser-manage-admin]password simple benet //配置明文密码“benet” [server-luser-manage-admin]service-type telnet //指定服务类型为telnet [server-luser-manage-admin]authorization-attribute user-role level-3 //指定命令级别为3 [server-luser-manage-admin]quit [server]user-interface vty 0 4 //进入vty线路 [server-line-vty0-4]authentication-mode scheme //配置用户的认证方式 [server-line-vty0-4]protocol inbound telnet //支持telnet [server-line-vty0-4]quit PC3开始测试telnet server: <pc3>Telnet 200.200.200.2 //注意是在用户视图下 //测试使用server映射出的外部地址(也就是路由器的接口地址) Trying 200.200.200.2 ... Press CTRL+K to abort Connected to 200.200.200.2 ... ****************************************************************************** * Copyright (c) 2004-2014 Hangzhou H3C Tech. Co., Ltd. All rights reserved. * * Without the owner's prior written consent, * * no decompiling or reverse-engineering shall be allowed. * ****************************************************************************** login: admin Password: <server> //登录成功 ———————— 本文至此结束,感谢阅读 ————————

资源下载

更多资源
腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

Sublime Text

Sublime Text

Sublime Text具有漂亮的用户界面和强大的功能,例如代码缩略图,Python的插件,代码段等。还可自定义键绑定,菜单和工具栏。Sublime Text 的主要功能包括:拼写检查,书签,完整的 Python API , Goto 功能,即时项目切换,多选择,多窗口等等。Sublime Text 是一个跨平台的编辑器,同时支持Windows、Linux、Mac OS X等操作系统。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册