网络基础回顾:DNS、IP封锁与HTTP/S协议关键点

网络基础回顾:DNS、IP封锁与HTTP/S协议关键点


昨天有个读者在后台问我:"为什么改了Hosts文件还是打不开ZLibrary?明明Ping得通啊。" 这个问题让我想起刚入行时踩过的坑------你以为网络通了,其实只是你以为。今天我们就从这个问题切入,把DNS、IP封锁和HTTP/S这几个基础但容易误解的概念拆开揉碎了讲清楚。


一、DNS:你以为的"域名解析"可能只是缓存把戏

很多人以为改了Hosts文件就万事大吉,其实Hosts只是本地DNS解析的第一站。系统在查Hosts之后,还可能走DNS缓存、本地DNS服务器、公共DNS(比如8.8.8.8)这一整套流程。我遇到过最诡异的情况是:Hosts改对了,但浏览器死活不认,最后发现是DNS-over-HTTPS(DoH)在作祟------现代浏览器默认开启DoH时,会绕过系统的DNS解析机制。

bash 复制代码
# 查看本地DNS缓存(Windows)
ipconfig /displaydns
# 清空它,有时候缓存比想象中顽固
ipconfig /flushdns

踩坑提醒 :别以为Hosts是万能的,浏览器插件、VPN客户端、甚至某些安全软件都可能劫持DNS请求。调试时最好先用nslookupdig验证真实解析结果:

bash 复制代码
nslookup z-lib.is 8.8.8.8
# 如果返回的IP不是你Hosts里写的,说明请求被劫持了

二、IP封锁:TCP握手背后的沉默杀戮

"Ping得通但网页打不开"------这是典型的IP封锁场景。Ping走的是ICMP协议,而网页访问走的是TCP协议。运营商或防火墙可以只封TCP端口而放过ICMP,让你产生"网络是通的"错觉。

python 复制代码
# 简单测试TCP端口是否可达(Python示例)
import socket
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.settimeout(3)
try:
    # 测试443端口,这里经常是封锁重点
    sock.connect(("目标IP", 443))
    print("TCP握手成功")
except Exception as e:
    print(f"连接被掐了: {e}")
finally:
    sock.close()

更隐蔽的封锁是TCP RST攻击 :你的SYN包能出去,对方也回了SYN-ACK,但中途被防火墙伪造RST包强行中断握手。抓包看Wireshark会看到一串"TCP Spurious Retransmission"警告,这时候就得考虑用隧道或加密混淆把TCP流量藏起来。


三、HTTP/S协议:中间人就在你身边

即使DNS和IP层都通了,应用层还有一道关卡:HTTPS拦截。有些防火墙会做SSL中间人检测,通过证书指纹或SNI(Server Name Indication)识别并阻断敏感网站。

bash 复制代码
# 用curl测试HTTPS连接,注意--resolve参数绕过DNS
curl -v --resolve z-lib.is:443:真实IP https://z-lib.is
# 如果卡在SSL握手,可能是SNI被盯上了

关键点 :SNI是TLS握手时明文发送的域名信息,防火墙看一眼就知道你要访问什么网站。应对方案有两种:一是用ESNI(Encrypted SNI) ,但普及度不高;二是把流量套在WebSocket或HTTP/2 Stream里,伪装成普通网站流量。

不过要注意,别随便在代码里关证书验证(verify=False那种写法),除非你清楚自己在做什么------中间人攻击真不是闹着玩的。


四、实战调试心法

  1. 分层排查 :从底层往上层撸。先ping,再telnet IP 端口测TCP,然后curl -I看HTTP响应头,最后上浏览器。很多问题在第二步就现原形了。

  2. 善用本地代理工具 :Charles、Fiddler这类工具能帮你看到HTTPS解密后的流量(需安装信任证书),有时候封锁规则就藏在HTTP头部的X-Blocked-By字段里。

  3. 不要相信单一检测手段:Ping通不代表TCP通,TCP通不代表TLS握手成功,TLS通了还可能遇到HTTP 451状态码(法律原因不可访问)。多维度验证才靠谱。


写在最后

网络封锁的本质是一场不对称战争:防守方占据协议栈的每个层级,进攻方则要在夹缝里找生机。我的经验是,越底层的绕过越稳定,但实现越复杂;越高层的方案越灵活,但也越容易失效。调试时保持耐心,一次只动一个变量,记住那句老话:"它能在curl里工作吗?如果能,那就不是网络问题,是你的代码问题。"

下次我们聊具体的技术方案:如何用域名前置、SNI伪装和隧道技术,让请求"看起来像别的请求"。保持好奇,保持折腾。


专栏预告:003、隧道技术入门:SSH、Cloudflare Tunnel与反向代理实战

相关推荐
赖134小0747姐2935电2 小时前
罗德与施瓦茨ZN-Z135经济型网络分析仪校准套件26.5G
网络·功能测试·科技·5g
大数据新鸟2 小时前
协议值TCP
服务器·网络·tcp/ip
架构师老Y2 小时前
012、缓存架构设计:Redis高级应用与优化
redis·python·架构
Thomas.Sir2 小时前
AI 医疗之重症监护预警系统(ICU-EWS)从理论到实战【时序深度学习与多模态融合】
人工智能·python·深度学习·ai·多模态
不吃鱼的猫7482 小时前
【音视频流媒体进阶:从网络到 WebRTC】第01篇-Socket 编程基础:TCP 与 UDP 的选择
网络·音视频·webrtc
gogogo出发喽2 小时前
flask vue
python
zhaoshuzhaoshu2 小时前
设计模式之结构型设计模式详解
python·设计模式
“愿你如星辰如月”2 小时前
从零构建高性能 Reactor 服务器:
linux·服务器·c++·websocket·tcp/ip
斯班奇的好朋友阿法法2 小时前
Django 3.2 项目:从 Hello World 开始(完整功能版)
python·django