首页
在线工具
统计
友链
Search
1
暴力破解忘记的zip,rar, pdf等文件密码
3,522 阅读
2
typecho添加打赏功能
1,923 阅读
3
摸鱼人日历
1,385 阅读
4
躲避校园网客户端的检测实现移动热点开启
1,380 阅读
5
创建自签名 ssl 证书
1,010 阅读
随笔杂记
Web建设
运维茶点
编程之路
网络配置指南
Huawei
网络安全
资源下载
生活中的点滴
登录
Search
标签搜索
HCNA
Python
Huawei
Linux
web
PC
Blog
windows
Network
Docker
HCNP
LOVE
Virus
MySQL
eNSP
Zabbix
DNS
typecho
k8s
HTTPS
TanHaX
累计撰写
79
篇文章
累计收到
76
条评论
首页
栏目
随笔杂记
Web建设
运维茶点
编程之路
网络配置指南
Huawei
网络安全
资源下载
生活中的点滴
页面
在线工具
统计
友链
搜索到
31
篇与
的结果
2024-02-20
优化 Python 批量备份交换机配置-重构部分功能
在游水的时候看到 @winty 大佬 被 @aa7088414 大佬重构的代码后 感觉可以再优化那么一丢丢。主要修改以下几点:代码结构整理:对原始代码进行了逻辑重构和优化,将部分重复代码提取成函数进行复用,简化代码结构。错误处理:在连接设备时添加了异常处理,并记录连接失败的设备信息。文件操作:使用了os.makedirs替换了os.path.join和os.makedirs组合,同时对异常进行了处理。数据读取:使用openpyxl库的iter_rows方法直接获取单元格值,避免了通过循环逐一获取单元格值的冗余操作。日志记录:使用logging库记录了操作日志,并对错误进行详细记录。代码细节:对变量和字典键值等进行了类型转换和判空处理。import json import logging import time from datetime import datetime import os import re from netmiko import ConnectHandler, exceptions from openpyxl import load_workbook # 取消以下注释开启调试模式 # logging.basicConfig(level=logging.DEBUG) # 读取excel内设备列表信息 def check_and_get_dev_list(filename, sheet_name): excel_information = [] wb = load_workbook(filename) sh = wb[sheet_name] # 获取最大行数 rows = list(sh.iter_rows(values_only=True)) sheet_header = [cell for cell in rows[0]] data = [dict(zip(sheet_header, row)) for row in rows[1:]] # 去除ip为空的数据 data = [i for i in data if i.get('ip') is not None] return data # 获取excel数据并整合成dev字典 def get_dev(): res = check_and_get_dev_list('./resource.xlsx', 'Sheet1') devices = [] for i in res: if i['protocol'] == 'telnet': i['type'] = i['type'] + '_telnet' dev = { 'device_type': str(i['type']), 'host': str(i['ip']), 'username': str(i['username']), 'password': str(i['password']), 'secret': str(i['enpassword']) if i['enpassword'] else None, 'port': str(i['port']), 'session_log': 'session.log' } devices.append(dev) return devices def get_cmds(): with open("./dis_cmds.conf", 'r', encoding='utf-8') as f: js = json.load(f) return js def devices_confbak(devices=None): if devices is None: devices = [] current_date = datetime.now().strftime("%Y-%m-%d") path = f'./conf_bak/{current_date}' try: os.makedirs(path, exist_ok=True) except OSError as e: logging.error(f"Failed to create directory: {path}, error: {e}") failed_ips = [] for dev in devices: try: with ConnectHandler(**dev) as conn: print('\n----------成功登录到:' + dev['host'] + '----------') if dev['secret'] and dev['secret'] != "None": try: conn.enable() except Exception as e: logging.error("enable登录失败: %s", e) pwd = f"{path}/{dev['host']}" os.makedirs(pwd, exist_ok=True) dis_cmds = get_cmds() for cmd_string_dict in dis_cmds: print(f"正在获取:{cmd_string_dict['name']}") time.sleep(0.1) output = None for dev_type, command in cmd_string_dict.items(): if dev['device_type'].startswith(dev_type): output = conn.send_command(command_string=command) if output is None: print(f"error:未找到设备类型为{dev['device_type']}的{cmd_string_dict['name']}预设命令,请检查并修改dis_cmds.conf文件") continue fname = f"{dev['host']}_{cmd_string_dict['name']}.txt" file_path = f"{pwd}/{fname}" with open(file_path, mode='w', encoding='utf8') as f: try: f.write(output) print(f"备份{fname}成功!") except PermissionError: print("*****-无写入权限,请将文件夹赋予读写权限-*****") except (exceptions.NetmikoAuthenticationException, exceptions.NetmikoTimeoutException, exceptions.ReadTimeout) as e: logging.error(f"连接设备{dev['host']}失败: {e}") failed_ips.append(dev['host']) except Exception as e: logging.error(f"发生了意料外的错误:{e}") failed_ips.append(dev['host']) if failed_ips: print("\n以下设备连接失败,请检查:") for ip in failed_ips: print(ip) return 0 def devices_autocheck(devices='', cmd=''): results = [] try: for device in devices: with ConnectHandler(**device) as conn: conn.enable() print('正在巡检:' + device['host'] + ' ...') result = [device['host'], device['device_type']] for item in cmd: if 'cisco_ios' in device['device_type']: output = conn.send_command(command_string=str(item['cisco'])) elif any(x in device['device_type'] for x in ['huawei', 'hp_comware']): conn.send_command(command_string='sys', expect_string=']') output = conn.send_command(command_string=str(item['huawei'])) result.append(output) results.append(result) except (exceptions.NetmikoAuthenticationException, exceptions.NetmikoTimeoutException, exceptions.ReadTimeout) as e: logging.error(f"连接设备{device['host']}失败: {e}") return results def get_mem(memstr, devtype=''): if 'cisco' in devtype: total_match = re.search(r'Processor Pool Total:\s+(\d+)', memstr) used_match = re.search(r'Used:\s+(\d+)', memstr) if total_match and used_match: total = int(total_match.group(1)) used = int(used_match.group(1)) percentage = used / total * 100 return f"{percentage:.0f}%" elif 'huawei' in devtype: match = re.search(r"Memory Using Percentage Is:\s*(\d+)%", memstr) if match: return match.group(1) + '%' return "No match found." def get_cpu(cpustr, devtype=''): if 'cisco' in devtype: match = re.search(r"CPU utilization for five seconds: (\d+)%", cpustr) if match: return match.group(1) + '%' elif 'huawei' in devtype: match = re.search(r"\b(\d+(\.\d+)?)%.*?\bMax", cpustr) if match: return match.group(1) + '%' return "No match found." if __name__ == '__main__': while True: print("\n##############################################\n") print("1:批量备份交换机信息与配置") print("2:批量巡检交换机设备") print("0:退出") option = input("请输入需要的操作编号:") if option == '1': dev = get_dev() devices_confbak(devices=dev) continue elif option == '2': cmds = [ {'cisco': 'show clock', 'huawei': 'display clock'}, {'cisco': 'show env power', 'huawei': 'display power'}, {'cisco': 'show env fan', 'huawei': 'display fan'}, {'cisco': 'show env temperature status', 'huawei': 'display environment'}, {'cisco': 'show processes cpu', 'huawei': 'display cpu-usage'}, {'cisco': 'show processes memory', 'huawei': 'display memory-usage'}, ] dev = get_dev() checkres = devices_autocheck(dev, cmds) for res in checkres: print('\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++') print(res[0] + '-巡检结果:') print('\n时钟:\n' + res[2]) print('电源:\n' + res[3]) print('风扇:\n' + res[4]) if 'Unrecognized command' in res[5]: print('温度:\n该设备不支持获取此数据!') else: print('温度:\n' + res[5]) print('CPU利用率:\n' + get_cpu(res[6], res[1])) print('内存利用率:\n' + get_mem(res[7], res[1])) print('\n+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++') continue elif option == '0': break else: print("请输入正确的编号!") 注:python 的版本为3.9以下是配套的文件dis_cmds.conf(修改时引号必须为英文双引号):[ {"name": "查看版本", "hp_comware": "display version", "huawei": "display version", "cisco_ios": "show version"}, {"name": "查看时间", "hp_comware": "display clock", "huawei": "display clock", "cisco_ios": "show clock"}, {"name": "查看序列号", "hp_comware": "display device ma", "huawei": "display device manufacture-info", "cisco_ios": "show inventory"}, {"name": "查看风扇", "hp_comware": "display fan", "huawei": "display fan", "cisco_ios": "show environment"}, {"name": "查看电源状态", "hp_comware": "display power", "huawei": "display power", "cisco_ios": "show environment power"}, {"name": "查看CPU利用率", "hp_comware": "display cpu-usage", "huawei": "display cpu-usage", "cisco_ios": "show processes cpu"}, {"name": "查看内存利用率", "hp_comware": "display memory", "huawei": "display memory-usage", "cisco_ios": "show processes memory"}, {"name": "查看VLAN配置", "hp_comware": "display vlan", "huawei": "display vlan", "cisco_ios": "show vlan"}, {"name": "查看二层接口状态", "hp_comware": "display interface brief", "huawei": "display interface brief", "cisco_ios": "show interfaces switchport"}, {"name": "查看三层接口IP", "hp_comware": "display ip interface brief", "huawei": "display ip interface brief", "cisco_ios": "show ip interface brief"}, {"name": "查看ACL控制列表", "hp_comware": "display acl", "huawei": "display acl all", "cisco_ios": "show access-lists"}, {"name": "查看路由表", "hp_comware": "display ip routing-table", "huawei": "display ip routing-table", "cisco_ios": "show ip route"}, {"name": "查看ARP表", "hp_comware": "display arp", "huawei": "display arp", "cisco_ios": "show arp"}, {"name": "查看MAC表", "hp_comware": "display mac-address", "huawei": "display mac-address", "cisco_ios": "show mac address-table"}, {"name": "查看日志", "hp_comware": "display logbuffer", "huawei": "display logbuffer", "cisco_ios": "show logging"}, {"name": "查看所有配置", "hp_comware": "display current-configuration", "huawei": "display current-configuration", "cisco_ios": "show running-config"} ]{cloud title="交换机批量备份_源码" type="lz" url="https://tanghan.lanzoul.com/ixtqL1ou6mla" password="ao5m"/}
2024年02月20日
119 阅读
0 评论
0 点赞
2024-02-19
解决 Debian 中的域名解析问题 - Temporary failure in name resolution
在新部署的镜像中更新软件源时遇到域名解析问题。1. 检查域名解析故障当遇到域名解析问题时,首先要确保网络连接正常工作。可以通过打开其他网页或使用其他网络工具来确认网络连接是否正常。2. 查看系统的 DNS 配置检查以下两个文件来查看系统的 DNS 配置:/etc/apt/sources.list 文件:检查 dns-nameservers 配置项,确保设置为可靠的、能够解析域名的 DNS 服务器地址。/etc/resolv.conf 文件:检查 nameserver 配置项,同样确保设置为可靠的 DNS 服务器地址。可以使用公共 DNS 服务器,如 Google DNS(8.8.8.8)或国内的公共 DNS(114.114.114.114)。3. 重启网络服务如果修改了 DNS 配置或者发现配置正确无误,但仍然无法解析域名,可以尝试重启网络服务。使用以下命令重启网络服务:systemctl restart networking通过执行以上步骤,您应该能够解决域名解析问题。如果问题仍然存在,可能需要进一步检查网络设置或尝试其他解决方法。
2024年02月19日
725 阅读
0 评论
1 点赞
2024-01-31
使用 Docker 快速搭建开发环境
1. 前期安装docker 这里就不写了,可以看往前写的文章!2. 安装开发环境这里可以根据需求来选择开发语言1. 安装C/C++开发环境sudo apt install build-essential这将安装编译C/C++程序所需的基本工具,包括gcc、g++等。2. 安装Java开发环境sudo apt install default-jdk这将安装默认的OpenJDK Java开发工具包。3. 安装Python开发环境sudo apt install python3 python3-pip这将安装Python 3及其包管理器pip。4. 安装Go语言开发环境sudo apt install golang-go这将安装Go语言的编译器和工具。3. 使用Docker部署开发环境C/C++环境:sudo docker run -it gccJava环境:sudo docker run -it openjdkPython环境:sudo docker run -it pythonGo语言环境:sudo docker run -it golang4. 在Docker容器中比如使用C语言开发:经过上述的搭建现在你可以在Docker容器中进行C语言开发了。你可以使用任何喜欢的文本编辑器编写C代码,例如Vim、Emacs或Nano。使用gcc编译器来编译和运行C代码,例如:gcc -o hello hello.c ./hello{lamp/}注:一般情况下 vim 是没有安装的,可以使用 Nano 来写1. 在Docker容器中安装Nano编辑器:在终端中运行以下命令以安装Nano编辑器:apt update apt install nano2. 使用Nano编辑器打开hello.c文件:运行以下命令以使用Nano编辑器打开hello.c文件:nano hello.c3. 在Nano编辑器中进行C代码编写:使用键盘导航键移动光标到正确位置,开始编写C代码。编写完毕后,按Ctrl + O保存文件,回车键ENTER确定,然后按Ctrl + X退出Nano编辑器。4. 编译和运行C代码:使用gcc编译器来编译和运行C代码,例如:gcc -o hello hello.c ./hello
2024年01月31日
139 阅读
0 评论
1 点赞
2024-01-12
Windows 7 IE 浏览器无法正常打开网页
在给客户部署项目的时候在 Windows 7 浏览器中无法正常打开网页。但又没有其他浏览器,只能硬质头皮去解决这个问题,试了网上大部分的方法后依然没有效果。一、问题原因经过深入测试,发现问题的根源在于 Windows 7 的 IE 浏览器不支持 TLS 1.2 协议。由于许多网站和服务使用 TLS 1.2 进行加密通信,因此,如果浏览器不支持该协议,就可能导致无法正常打开网页。二、解决方案为了解决这个问题,我们需要开启 IE 浏览器的 TLS 1.2 支持。以下是具体的操作步骤:打开 Windows 7 的 IE 浏览器。在菜单栏上选择“工具”->“Internet 选项”。在弹出的“Internet 选项”对话框中,选择“高级”选项卡。在“高级”选项卡中,找到“安全”部分,并勾选“使用 TLS 1.2”复选框点击“应用”按钮,然后点击“确定”按钮保存设置。重新启动 IE 浏览器,并尝试访问之前无法打开的网页。通过以上步骤,您应该能够成功打开所需要访问的网页了。
2024年01月12日
107 阅读
0 评论
2 点赞
2024-01-03
安全事件的处理以及建议
反病毒定义:病毒类型 + 平台 + 病毒(家族)名 + 病毒变种名 + 其他信息病毒名称前缀病毒类型TROJAN木马WORM蠕虫Adware广告软件Spyware间谍软件Backdoor后面程序JOKE玩笑程序RANSOM勒索软件Coinminer挖矿病毒PUA潜在有害应用安全事件处理流程:工作机制:病毒库 + 杀毒引擎1. 扫毒模块:扫描并检测含有恶意代码的为,对其识别。对于被文件型病毒感染的可执行文件进行修复组件扫描引擎-VSAPI & ATSE病毒码间谍软件病毒码网络病毒码2. 损害清楚服务(DCS):对于正在允许/已经加载的病毒进行清除。终止进程。脱钩 DLL 文件。删除文件。恢复被病毒修改过的注册表内容,起到修复系统的作用。可视为通用专杀工具。组件。损害清楚引擎(DCE)- TSC.EXE损害清除。损害清除模板(DCT)- TSC.PTN间谍软件清除病毒码 - TMADCE.PTN3. 反病毒常见问题:载体程序:如 pe 开头正常文件内嵌恶意代码,防病毒程序将恶意代码程序等清楚,修复文件。恶意代码:如 -o 的母体文件,则无法清除智能隔离为什么会出现无法隔离/删除的病毒:当病毒感染系统后:病毒进程已经被系统加载。病毒DLL文件已经嵌入到正在运行的系统进程中。Windows 自身的特性:对已经加载的文件无法进行改动操作,从而导致病毒扫描引擎对检测文件无法操作。已经加载的病毒不包含在损害清除模板(DCT)中。已知病毒处理流程:在可能的情况下,拔除网线。收集病毒日志。确认病毒名称、路径和文件名。搜索病毒知识库,查找病毒的解决方法。根据方案,手动清理系统中的病毒。若找不到方案或方案无效可收集样本与系统信息由厂商协助处理未知/可疑病毒处理流程象:在可能的情况下,拔除网线。使用 ATTK 工具收集系统关键信息提交给亚信安全。如有明显可以文件,压缩加密提交给反病毒厂商。反病毒厂商反馈病毒解决方案。其他事件:可执行文件恶意代码清除后,文件被破坏。提交感染前的文件和感染后的文件给厂商进行分析。宏病毒清除后打开异常或被隔离。搜集原始样本提交给厂商。网络异常,怀疑ARP攻击。通过抓包,将抓包信息提交给厂商。手动处理建议:在安全模式下操作终止所有可疑进程和不必要的进程关闭系统还原显示所有隐藏文件余晓敏判断可疑文件注:恶意程序容易植入系统目录下,并命名与系统默认文件名称非常相似的名称,以混淆用户的视听。解决方法:可通过文件创建时间,后缀,内容等判断可疑程度。常用工具:ATTK(病毒查杀工具:Anti-Threat ToolKit 反病毒工具集,系统信息收集工具)WireSharkRootkit Buster (MBR 问题的收集工具)Autoruns(显示自启动程序,允许禁用或删除)Process Explorer(Windows 系统和应用程序监视)病毒典型案例分析:1. Worm_downad(飞客蠕虫)1. 主要传播手段漏洞 MS08-067(复制自身特性传播)。攻击过程:病毒会随机生成 IP 地址,进行漏洞利用并发起攻击移动存储(利用播放功能自启动,并在共享传播自身副本进行扩大感染)2. 显性特征阻止访问安全网站安全配置失效暴力猜解密码解决方法:通过日志找到感染源优先在源头计算机安装补丁(建议所有计算机打算补丁以防传播病毒)修改域账号或计算机密码为强密码注:移动存储传播手段:攻击成功后会下载病毒并进行修改注册表来使得安全工具和安全配置失效、修改 host 文件在内网查找网络服务器或域控,通过字典暴力破解拆解管理员密码,常导致服务器被锁2. PE_SALITY1. 主要传播手段:漏洞 ms10-046移动存储网络共享电子邮件2. 主要特征:终止安全相关软件和服务(安全软件和防火墙 )禁用防火墙、任务管理器、注册表、防火墙等组织进入安全模式共享目录及子文件夹存在LNK和TMP文件存在恶意的 AUTORUN.INF注 :病毒自我保护特征:终止安全软件和防火墙将自己感染的程序添加到防火墙、白名单中防止网络通信被阻止进入管理器和注册表使得用户无法手动结束被感染的程序进程和注册表的项值,也无法进入安全模式创建病毒母体文件拷贝和自动执行该母体文件的 AUTORUN.INF 到所有驱动器中,当进入被感染的驱动器后会自动执行该病毒3. 勒索家族:两种类型:传统勒索病毒勒索病毒主要特征:文档被机密锁定弹出勒索信息传统勒索病毒:主要传入手段:社工邮件(订单、银行账单)带有宏病毒的 Word/Excel 附件特点:非常依赖人机交互勒索蠕虫主要传入手段:漏洞 MS17-010Internet 传入预防方法:增强安全意识防御(以OSCE为例)备份重要文档3-2-1规则:三个副本,两种不同格式保存,异地存储4. 挖矿病毒解决方法:使用ATTK 或者专杀工具预防方法:增强员工安全意识定期更新安全防护软件的组件启用浏览器安全防护功能善用任务管理器 & 资源监视器
2024年01月03日
212 阅读
0 评论
3 点赞
2023-08-12
更改本地用户文件夹名称
修改环境变量首先,右击“我的电脑”,选择“属性”。在属性窗口中,选择“高级”选项卡。在高级选项卡中,点击“环境变量”按钮。在用户变量下方,点击“新建”按钮。在弹出的对话框中,输入变量名为USERPROFILE,变量值为C:\Users\smile(这里的smile是您需要的新用户名文件夹)。再次点击“新建”按钮,输入变量名为HOMEPATH,变量值为C:\Users\smile。点击“确定”按钮保存修改。修改注册表按下Win+R键,打开运行窗口,输入regedit并回车,打开注册表编辑器。在注册表编辑器中,导航到HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\ProfileList\ <要修改的用户对应的SID>。找到你原来目录名字的项,通常可以在ProfileImagePath键中找到。将 ProfileImagePath 键的值修改为新的目录名。保存修改后的注册表。修改本地用户文件夹名称打开资源管理器,找到 C:\用户\旧用户名文件夹。将旧用户名修改为smile。重新登录电脑后,系统会自动将配置文件配置到新的文件夹中。注意事项修改配置文件后,原来的配置不会自动复制到新的文件夹中。如果需要保留原有配置,需要手动复制配置文件到新的文件夹中。在进行任何操作前,请确保备份重要的文件和注册表。修改注册表可能会对系统造成不可逆的损坏,所以请谨慎操作。
2023年08月12日
193 阅读
0 评论
3 点赞
2023-08-11
通过安全模式解决程序冲突造成卡顿和启动修复错误
今天遇到了一些令人困扰的电脑启动问题甚至还把电脑重置了,在日常的开机环节中发现系统进入桌面后出现严重的卡死问题,甚至任务管理器都调不出来。在经过再次重启后,发现要么进入桌面出现卡死或者重启时出现了"启动修复"的错误提示,无法修复电脑的问题。起初我以为是系统或者引导问题,于是通过尝试通过安全模式来解决这个问题。下面是我具体的操作流程。1. 进入安全模式的步骤:重启电脑,在黑屏的时候连续点击键盘上的F11键。进入"疑难解答"选项,然后选择"高级选项"。在"高级选项"中选择"启动设置",然后点击"重启",需要输入 BitLocker恢复密钥才能访问启动设置可以看下面的步骤来。在启动设置界面,按下F4键进入安全模式。注:如果在进入安全模式之前需要输入BitLocker恢复密钥才能访问启动设置,如果你忘记了恢复密钥,可以通过 登录到Microsoft帐户 查找恢复密钥。如果没有这个提示,可以跳过这一步继续进行操作,接着第四个步骤2. 在安全模式下解决问题:进入安全模式后,系统会加载最基本的驱动和关键服务。在这个模式下,我们可以先禁用启动项,排除第三方软件和驱动的影响。首先,在任务栏搜索图标处找到【任务管理器】并打开。在任务管理器中,点击左侧的【启动应用】选项卡。在启动应用界面中,查看上方第一行的【状态】列,将所有的应用都以右键方式进行禁用。3. 运行系统命令修复问题:返回开始菜单,打开【Windows工具】。在工具列表中找到【命令提示符】这个选项,右键以管理员身份运行。在命令提示符窗口中,输入命令 "sfc /scannow"(注意斜杠之前有一个空格),然后按回车键执行。等待命令完成修复后,然后重新启动电脑以退出安全模式。4. 如果以上操作仍然无效,还可以尝试以下方法:重启电脑时,在黑屏的时候连续点击键盘的F11键。在"疑难解答"中选择"高级选项"。找到"卸载更新"并点击。在"卸载质量更新"中选择需要卸载的更新。{lamp/}经过上面的操作虽然没有很好的解决我这个问题,但最后通过火绒官方指出:卡巴斯基和火绒出现了冲突现象,最后才把火绒卸载掉以彻底解决这个卡顿现象。
2023年08月11日
737 阅读
1 评论
3 点赞
2023-08-09
解决HTTPS握手过程中的隐私泄漏问题(ECH)
在现代网络环境中,虽然我们的大部分网络通信都被加密,但是在某些情况下,我们的访问信息可能会被间接暴露。这是因为,即使是HTTPS传输,也有可能发生隐私泄露。那么,我们如何保护自己的访问隐私呢?本文将为您介绍一种加强隐私保护的新方法:Encrypted ClientHello。HTTPS在深入讨论问题之前,我们先来了解一下HTTPS协议的基本概念。HTTPS实际上就是HTTP + SSL/TLS,通过SSL/TLS对HTTP协议传输的数据进行加密,确保数据在传输过程中的隐私性和完整性。虽然发生在‘客户端’和‘服务器’之间的数据交换是被加密的,但是在TLS建立连接的过程却并不一定是加密的。TLS握手的过程TLS握手是在建立HTTPS连接之前进行的一系列交互过程,它有三个目的:协商协议和加密套件:通信的两端确认接下来使用的TLS版本和加密套件。验证身份:为了防止中间人攻击,服务器会向客户端发送证书,证书包含服务器的公钥和证书授权中心(CA)签名的身份信息,客户端可以用这些信息来验证服务器的身份。生成会话密钥:生成用于加密后续数据传输的密钥。握手过程中,有一个隐私泄漏的风险,就是SNI(Server Name Indication,服务器名称指示)的信息泄漏。TLS握手过程是TLS协议为保护通讯隐私而建立私钥和公钥的步骤。握手过程中,客户端会向服务器发送一个叫做 “ClientHello” 的消息,其中包括客户端支持的TLS版本和加密算法、一串随机字节串以及SNI等一些服务器信息。但是,"ClientHello"消息中的SNI包含了访问的网站域名信息,而这个消息是明文传输的,所以如果被"中间人"监听,就会暴露你正在访问哪个网站。这样做的可能是你的ISP,公司,或者学校等,他们可以通过监视网络流量来获取这些信息。那么,面对这种情况,我们应该如何保护个人隐私呢?Encrypted ClientHello(ECH)的解决方案为了解决TLS握手中的隐私泄漏问题,TLS1.3引入了Encrypted ClientHello(ECH)的扩展机制。ECH可以用于加密Client Hello消息中的SNI等敏感信息。当用户访问一个启用ECH的服务器时,网管无法通过观察SNI来窥探域名信息。只有目标服务器才能解密ECH中的SNI,从而保护用户隐私。要启用ECH,需要满足以下两个条件:服务器支持TLS的ECH扩展。客户端支持ECH。解决方法:例如,可以使用 Cloudflare SNI测试页 或者 cloudflare 浏览体验安全检查 来检查ECH扩展的支持情况。- Google Chrome 中开启ECH支持:打开Chrome在地址栏输入并访问:chrome://flags/#encrypted-client-hello将“Encrypted Client Hello”选项置为“Enabled”启用ECH的支持。关闭浏览器并重新启动Chrome,使更改生效。- Mozilla Firefox:打开Firefox在地址栏输入并访问:about:config在警告页面上,点击 "接受风险并继续"。在搜索框中输入 "ech" 来筛选相关选项。右键点击 "network.http.enforce-framing.http-equivalent-eom" 选项,并选择 "Toggle" 将其设置为 "true"。关闭浏览器,并重新启动Firefox,使更改生效。参考资料:Encrypted ClientHello。
2023年08月09日
569 阅读
0 评论
5 点赞
2023-06-27
快速部署kubernetes
关闭防火墙systemctl stop firewalld && systemctl disable firewalld关闭所有节点的 SELinux ,将 SELinux 设置为 permissive 模式(相当于将其禁用)sudo setenforce 0 sudo sed -i 's/^SELINUX=enforcing$/SELINUX=permissive/' /etc/selinux/config设置主机名hostnamectl set-hostname master关闭 Swapswapoff -a && sysctl -w vm.swappiness=0永久关闭swap (推荐)sed -i '/swap/s/^\(.*\)$/#\1/g' /etc/fstab主机添加 hosts:cat >> /etc/hosts << EOF 10.0.0.24 master 10.0.0.25 node1 10.0.0.26 node2 EOF配置路由转发IPv4 并让 iptables 看到桥接流量cat <<EOF | sudo tee /etc/sysctl.d/k8s.conf net.bridge.bridge-nf-call-iptables = 1 net.bridge.bridge-nf-call-ip6tables = 1 net.ipv4.ip_forward = 1 EOF应用 sysctl 参数而不重新启动sudo sysctl --system使用部署工具来安装 Kubernetesk8s社区提供了3个部署工具,分别是kubeadm, kops和 Kubespray ,这里有详细的说明配置Kubernetes的阿里云yum源Debian / Ubuntuapt-get update && apt-get install -y apt-transport-https curl https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | apt-key add - cat <<EOF >/etc/apt/sources.list.d/kubernetes.list deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main EOF apt-get update apt-get install -y kubelet kubeadm kubectlCentOS / RHEL / Fedoracat <<EOF > /etc/yum.repos.d/kubernetes.repo [kubernetes] name=Kubernetes baseurl=https://mirrors.aliyun.com/kubernetes/yum/repos/kubernetes-el7-x86_64/ enabled=1 gpgcheck=1 repo_gpgcheck=1 gpgkey=https://mirrors.aliyun.com/kubernetes/yum/doc/yum-key.gpg https://mirrors.aliyun.com/kubernetes/yum/doc/rpm-package-key.gpg EOF setenforce 0这里指定版本#yum install -y kubelet kubeadm kubectl yum install -y kubelet-1.23.4 kubeadm-1.23.4 kubectl-1.23.4 systemctl enable kubelet && systemctl start kubelet * 由于官网未开放同步方式, 可能会有索引gpg检查失败的情况, 这时请用以下命令安装:yum install -y --nogpgcheck kubelet-1.23.4 kubeadm-1.23.4 kubectl-1.23.4k8s-master初始化主节点kubeadm init \ --apiserver-advertise-address=10.0.0.24 \ --image-repository registry.aliyuncs.com/google_containers \ --kubernetes-version v1.23.4 \ --service-cidr=10.96.0.0/12 \ --pod-network-cidr=10.244.0.0/16注(所有节点):vi /etc/docker/daemon.json"exec-opts": [ "native.cgroupdriver=systemd" ],重启dockersystemctl restart docker重置 kubeadm 安装的状态kubeadm reset在初始化 (9)在主节点上设置 Kubernetes 配置在主节点上配置kubectl工具并设置集群证书mkdir -p $HOME/.kube sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config sudo chown $(id -u):$(id -g) $HOME/.kube/config或者,如果你是 root 用户,则可以运行:export KUBECONFIG=/etc/kubernetes/admin.conf安装pod网络插件在两个工作节点上加入 Kubernetes 集群sudo kubeadm join 主节点IP:主节点端口 --token <hz1ri9.qca0lj1qii44l58c> --discovery-token-ca-cert-hash sha256:<hash>例如:sudo kubeadm join 10.0.0.24:6443 --token 37mtsv.c32oz3fgbkckoh11 --discovery-token-ca-cert-hash sha256:8da41125c132639053ca58018e57477453b51f8e344ec0a1d8709c8e432a4ada等待一段时间,直到 Kubernetes 集群所有的节点都处于 Ready 状态。可以使用以下命令查看节点的状态:sudo kubectl get nodes
2023年06月27日
188 阅读
0 评论
2 点赞
2023-05-17
MySQL备份
一、MySQL备份的类型, MySQL备份主要分为三种类型:1. 完整备份(Full Backup)备份MySQL的全部数据库和表,用于全量恢复。优点是简单,恢复速度快;缺点是备份文件较大,备份时间长。2. 差异备份(Differential Backup)备份数据库和表的变化数据,与完整备份一起使用,用于实现点恢复。优点是相对完整备份,备份文件较小,速度快;缺点是在多次差异备份后,恢复时间会变长。3. 增量备份(Incremental Backup)备份数据库和表的变化数据,用于实现近实时的备份与恢复。优点是备份文件最小,几乎无性能影响;缺点是恢复时间最长,需要依次应用多个增量备份文件。4. 完整恢复mysql < backup.sql5. 增量恢复mysqlbinlog gbichot2-bin.000007 gbichot2-bin.000008 | mysql二、MySQL备份工具常用的MySQL备份工具主要有:1. mysqldumpMySQL自带的逻辑备份工具,可以导出SQL语句或转储文件。优点是简单免费;缺点是备份时间长,不支持热备和动态恢复。2. MySQL Enterprise Backup (MEB)MySQL企业版提供的热备工具,可以实现完整备份、增量备份与恢复。优点是支持热备、恢复速度快;缺点是需要付费使用MySQL企业版。3. XtraBackupPercona提供的开源热备工具,功能与MEB类似。优点是开源免费;缺点是学习曲线较 steep。4. mysqlpumpMySQL8.0提供的新备份工具,替代mysqldump。优点是备份恢复速度快;缺点是只适用于MySQL8.0及以上版本。三、使用mysqldump进行逻辑备份备份全部数据库mysqldump -uroot -p123456 --all-databases > db_backup.sql备份指定数据库mysqldump -uroot -p123456 database_name > db_backup.sql 备份指定表mysqldump -uroot -p123456 database_name table1 table2 > table_backup.sql仅导出表结构mysqldump -uroot -p123456 -d database_name > db_structure.sql四、使用MEB进行物理备份完整备份meb make_full_backup 增量备份meb make_incremental_backup差异备份meb make_differential_backup 恢复备份meb copy_back 小笔记:如果要考虑主要的选择标准,可以参考如下:1. 数据一致性如果数据一致性是主要考量因素, --single-transaction 选项产生的备份文件更好,因为它可以保证备份数据的一致性。3. 主从切换如果备份文件需要用于主从切换, --master-data 选项产生的备份文件更适合,因为它包含了主从切换需要的二进制日志位置信息。4. 备份范围如果只需要备份某些关键数据库, --databases 选项可以产生针对性更强的备份文件。如果需要全部数据库的备份,--all-databases更合适。5. 性能影响如果要考虑备份对数据库性能的影响, 不使用 --single-transaction 选项的备份会更轻量一些。
2023年05月17日
336 阅读
0 评论
6 点赞
1
2
3
4