网络与安全面试题
网络与安全面试题
简介
网络和安全是 IT 基础设施的核心支柱。本篇涵盖 TCP/IP 协议栈、HTTP/HTTPS 原理、网络安全防护、防火墙配置等高频面试话题,帮助开发者建立扎实的网络知识和安全意识。
特点
面试题目
1. TCP 三次握手和四次挥手的原理是什么?
答: TCP 是面向连接的可靠传输协议,通过三次握手建立连接,四次挥手断开连接。
三次握手过程:
| 步骤 | 客户端 | 方向 | 服务端 | 状态变化 |
|---|---|---|---|---|
| 1 | 发送 SYN(seq=x) | -> | 服务端: LISTEN -> SYN_RCVD | |
| 2 | <- | 发送 SYN+ACK(seq=y,ack=x+1) | ||
| 3 | 发送 ACK(ack=y+1) | -> | 双方: ESTABLISHED |
四次挥手过程:
| 步骤 | 主动方 | 方向 | 被动方 | 说明 |
|---|---|---|---|---|
| 1 | 发送 FIN | -> | 主动方: FIN_WAIT_1 | |
| 2 | <- | 发送 ACK | 被动方: CLOSE_WAIT, 主动方: FIN_WAIT_2 | |
| 3 | <- | 发送 FIN | 被动方: LAST_ACK | |
| 4 | 发送 ACK | -> | 主动方: TIME_WAIT(2MSL) |
# 查看连接状态
netstat -an | grep ESTABLISHED
ss -s # 连接统计
# 查看 TCP 连接状态分布
netstat -an | awk '/^tcp/ {print $NF}' | sort | uniq -c | sort -rn
# 150 ESTABLISHED
# 20 TIME_WAIT
# 5 CLOSE_WAIT
# 调优 TIME_WAIT(高并发场景)
# /etc/sysctl.conf
# net.ipv4.tcp_tw_reuse = 1 # 允许重用 TIME_WAIT 连接
# net.ipv4.tcp_fin_timeout = 30 # 减小 FIN_WAIT_2 超时时间
# net.ipv4.tcp_max_tw_buckets = 5000 # TIME_WAIT 最大数量
# sysctl -p # 应用配置为什么三次握手不能是两次? 防止已失效的连接请求到达服务端。如果客户端发送的 SYN 因网络延迟迟到,服务端会建立无效连接等待。第三次握手确认客户端确实要建立连接。
为什么四次挥手不能是三次? 因为 TCP 是全双工的,被动方收到 FIN 后可能还有数据要发送,所以 ACK 和 FIN 分两步发送。如果被动方没有数据要发,可以合并为三次。
2. TCP 和 UDP 的区别是什么?
答:
| 维度 | TCP | UDP |
|---|---|---|
| 连接 | 面向连接(三次握手) | 无连接 |
| 可靠性 | 可靠传输(确认、重传、排序) | 不保证可靠 |
| 传输方式 | 字节流 | 数据报 |
| 速度 | 较慢(控制开销大) | 快(无控制开销) |
| 头部大小 | 20-60 字节 | 8 字节 |
| 适用场景 | 文件传输、Web、邮件 | 视频流、DNS、游戏 |
# TCP 应用场景端口
# HTTP: 80, HTTPS: 443, SSH: 22, MySQL: 3306, PostgreSQL: 5432
# UDP 应用场景端口
# DNS: 53, DHCP: 67/68, NTP: 123, SNMP: 161
# 使用 nc (netcat) 测试 TCP/UDP 连通性
# TCP 测试
nc -zv example.com 443
# UDP 测试
nc -zuv example.com 53
# TCP 拥塞控制算法
sysctl net.ipv4.tcp_congestion_control
# 常用算法:cubic(默认)、bbr(Google 提出,高带宽高延迟场景优秀)
# 启用 BBR:
# net.core.default_qdisc = fq
# net.ipv4.tcp_congestion_control = bbr3. HTTP/1.1、HTTP/2 和 HTTP/3 的区别是什么?
答: HTTP 协议不断演进,每个版本都解决了前一个版本的性能瓶颈。
| 特性 | HTTP/1.1 | HTTP/2 | HTTP/3 |
|---|---|---|---|
| 传输层 | TCP | TCP | QUIC(UDP) |
| 多路复用 | 不支持 | 支持 | 支持 |
| 头部压缩 | 不支持 | HPACK | QPACK |
| 服务端推送 | 不支持 | 支持 | 支持 |
| 队头阻塞 | HTTP 级别 | TCP 级别 | 无 |
| 连接建立 | 1 RTT | 1 RTT + TLS 1-2 RTT | 0-1 RTT |
| 流控制 | TCP 层 | HTTP 层 + TCP 层 | QUIC 层 |
# 查看 HTTP 协议版本
curl -I -s https://example.com | grep -i "HTTP\|alt-svc"
# HTTP/2 多路复用示意
# HTTP/1.1: 每个请求需要单独的 TCP 连接(或管线化,但有队头阻塞)
# GET /style.css -> Response
# GET /script.js -> Response (需要等待上一个完成)
# GET /image.png -> Response
# HTTP/2: 一个连接上并行传输多个请求/响应(帧 Frame)
# Stream 1: GET /style.css -----> Response
# Stream 3: GET /script.js -----> Response
# Stream 5: GET /image.png -----> Response
# 所有 Stream 在一个 TCP 连接上交错传输
# HTTP/3: 基于 QUIC 协议
# - 内建加密(TLS 1.3 集成在 QUIC 中)
# - 连接迁移(网络切换不断连,如 WiFi -> 4G)
# - 解决 TCP 队头阻塞(每个 Stream 独立)4. HTTPS 的工作原理是什么?TLS 握手过程是怎样的?
答: HTTPS = HTTP + TLS,通过 TLS 协议在 TCP 之上提供加密、身份验证和数据完整性。
TLS 1.3 握手过程(2-RTT,比 TLS 1.2 的 3-RTT 更快):
# TLS 1.3 握手流程
# 1. Client Hello
# 客户端 -> 服务端
# 支持的 TLS 版本、密码套件列表、Key Share(提前发送 DH 公钥)
# 2. Server Hello
# 服务端 -> 客户端
# 选定的密码套件、Key Share、证书、Certificate Verify
# 3. Finished
# 双方计算共享密钥,开始加密通信
# 查看证书信息
openssl s_client -connect example.com:443 -showcerts
openssl x509 -in cert.pem -text -noout # 查看证书详情
# 检查 HTTPS 配置安全性
# https://www.ssllabs.com/ssltest/
# 生成自签名证书(开发环境)
openssl req -x509 -newkey rsa:4096 -keyout key.pem -out cert.pem \
-days 365 -nodes -subj "/CN=localhost"
# 生成 CSR(证书签名请求,用于正式证书)
openssl req -newkey rsa:2048 -nodes -keyout domain.key \
-out domain.csr -subj "/CN=example.com"// ASP.NET Core 配置 HTTPS
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddHttpsRedirection(options =>
{
options.RedirectStatusCode = StatusCodes.Status308PermanentRedirect;
options.HttpsPort = 443;
});
// HSTS(HTTP 严格传输安全)
builder.Services.AddHsts(options =>
{
options.Preload = true;
options.IncludeSubDomains = true;
options.MaxAge = TimeSpan.FromDays(365);
});
// 在 Kestrel 上配置证书
builder.WebHost.ConfigureKestrel(options =>
{
options.Listen(IPAddress.Any, 443, listenOptions =>
{
listenOptions.UseHttps("cert.pfx", "password");
});
options.Listen(IPAddress.Any, 80);
});5. 常见的网络攻击有哪些?如何防御?
答: 网络安全威胁多种多样,需要分层防御。
| 攻击类型 | 原理 | 防御措施 |
|---|---|---|
| SQL 注入 | 恶意 SQL 拼接到查询中 | 参数化查询、ORM、WAF |
| XSS | 注入恶意脚本到网页 | 输入过滤、CSP、输出编码 |
| CSRF | 伪造用户请求 | CSRF Token、SameSite Cookie |
| DDoS | 大量请求耗尽资源 | CDN、流量清洗、限流 |
| 中间人攻击 | 拦截和篡改通信 | HTTPS、证书锁定 |
| 暴力破解 | 尝试所有可能的密码 | 速率限制、账户锁定、MFA |
// ASP.NET Core 安全配置
public static class SecurityConfiguration
{
public static void AddSecurity(this WebApplicationBuilder builder)
{
// 1. CORS 配置
builder.Services.AddCors(options =>
{
options.AddPolicy("Strict", policy =>
{
policy.WithOrigins("https://myapp.com")
.WithMethods("GET", "POST")
.AllowHeaders("Authorization", "Content-Type")
.AllowCredentials();
});
});
// 2. Cookie 安全配置
builder.Services.ConfigureApplicationCookie(options =>
{
options.Cookie.HttpOnly = true; // JS 无法访问
options.Cookie.SecurePolicy = CookieSecurePolicy.Always; // 仅 HTTPS
options.Cookie.SameSite = SameSiteMode.Strict; // 防 CSRF
options.ExpireTimeSpan = TimeSpan.FromHours(1);
options.SlidingExpiration = true;
});
// 3. 限流
builder.Services.AddRateLimiter(options =>
{
options.AddFixedWindowLimiter("api", opt =>
{
opt.PermitLimit = 100;
opt.Window = TimeSpan.FromMinutes(1);
});
options.AddSlidingWindowLimiter("login", opt =>
{
opt.PermitLimit = 5;
opt.Window = TimeSpan.FromMinutes(15);
opt.SegmentsPerWindow = 5;
});
});
// 4. 安全头
builder.Services.AddAntiforgery(); // CSRF 保护
}
public static void UseSecurity(this WebApplication app)
{
app.UseHsts();
app.UseHttpsRedirection();
app.UseCors("Strict");
app.UseRateLimiter();
// 自定义安全头中间件
app.Use(async (context, next) =>
{
context.Response.Headers.Append("X-Content-Type-Options", "nosniff");
context.Response.Headers.Append("X-Frame-Options", "DENY");
context.Response.Headers.Append("X-XSS-Protection", "1; mode=block");
context.Response.Headers.Append("Referrer-Policy", "strict-origin-when-cross-origin");
context.Response.Headers.Append("Content-Security-Policy",
"default-src 'self'; script-src 'self'; style-src 'self' 'unsafe-inline'");
await next();
});
}
}6. 防火墙的工作原理是什么?如何配置?
答: 防火墙通过预设规则控制网络流量的进出,分为包过滤、状态检测和应用层防火墙。
# iptables 基本配置(Linux 防火墙)
# 查看现有规则
iptables -L -n -v --line-numbers
# 默认策略:拒绝所有入站,允许所有出站
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许回环接口
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许 SSH(限制速率防暴力破解)
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --set --name ssh
iptables -A INPUT -p tcp --dport 22 -m state --state NEW \
-m recent --update --seconds 60 --hitcount 4 --name ssh -j DROP
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# 允许 HTTP/HTTPS
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
# 允许特定 IP 访问管理端口
iptables -A INPUT -s 10.0.0.0/24 -p tcp --dport 8080 -j ACCEPT
# 允许 ICMP(ping)
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
# 记录被拒绝的连接
iptables -A INPUT -j LOG --log-prefix "IPTables-Dropped: " --log-level 4
# 保存规则(持久化)
# Ubuntu: iptables-save > /etc/iptables/rules.v4
# CentOS: service iptables save
# ufw(Ubuntu 简化防火墙)
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw allow from 10.0.0.0/24 to any port 3306 # 仅内网访问 MySQL
ufw enable
ufw status verbose7-15. 更多网络与安全面试题简答
7. DNS 解析的过程是什么? 浏览器缓存 -> 系统 DNS 缓存 -> 路由器 DNS -> 本地 DNS 服务器 -> 根域名服务器 -> 顶级域名服务器 -> 权威域名服务器。递归查询(客户端到本地 DNS)+ 迭代查询(本地 DNS 到各级服务器)。
8. 什么是 CDN?工作原理是什么? CDN(内容分发网络)将内容缓存到全球各地的边缘节点,用户就近访问。DNS 解析时将域名指向最近的 CDN 节点,减少延迟和源站压力。
9. 什么是负载均衡?有哪些算法? 负载均衡将请求分发到多台服务器。算法包括:轮询(Round Robin)、加权轮询、最少连接、IP Hash、一致性 Hash。常用工具:Nginx、HAProxy、云厂商 LB。
10. 什么是 VPN?类型有哪些? VPN(虚拟专用网络)通过加密隧道在公共网络上建立安全连接。类型:远程访问 VPN(个人)、站点间 VPN(企业互联)、SSL VPN(浏览器访问)。常用协议:IPSec、OpenVPN、WireGuard。
11. Cookie、Session 和 Token 的区别? Cookie 存储在浏览器,每次请求自动携带;Session 存储在服务端,通过 Session ID 关联;Token(JWT)是无状态的,包含用户信息和签名。现代应用倾向于使用 Token。
12. 什么是 OWASP Top 10? OWASP Top 10 是 Web 应用最常见的安全风险列表,包括:注入、身份验证失败、敏感数据泄露、XML 外部实体、访问控制失效、安全配置错误、XSS、不安全的反序列化、使用含漏洞的组件、日志监控不足。
13. 什么是零信任安全? 零信任原则是"永不信任,始终验证"。不依赖网络边界,每次访问都进行身份验证和授权。核心概念:最小权限、微分段、持续验证。
14. 如何实现 API 安全? 使用 HTTPS、API Key / OAuth2 认证、速率限制、输入验证、请求签名、CORS 策略、JWT Token 过期和刷新机制。
15. 什么是 SSL/TLS 证书链? 证书链从终端证书 -> 中间证书 -> 根证书组成。浏览器验证证书时逐级验证签名直到受信任的根证书。配置服务器时需要包含完整的证书链。
深入网络安全实践
Nginx 反向代理与安全加固
# /etc/nginx/conf.d/security.conf
# 隐藏版本号
server_tokens off;
# SSL/TLS 安全配置
server {
listen 443 ssl http2;
server_name example.com;
# 证书配置
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
# 仅允许 TLS 1.2 和 1.3
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers 'ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384';
ssl_prefer_server_ciphers on;
# HSTS(强制 HTTPS)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" always;
# 安全响应头
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline'" always;
add_header Referrer-Policy "strict-origin-when-cross-origin" always;
# 基础限流(防止 DDoS 和暴力破解)
limit_req_zone $binary_remote_addr zone=general:10m rate=10r/s;
limit_req_zone $binary_remote_addr zone=login:10m rate=3r/m;
# 通用限流
location /api/ {
limit_req zone=general burst=20 nodelay;
proxy_pass http://backend;
}
# 登录接口严格限流
location /api/login {
limit_req zone=login burst=5 nodelay;
proxy_pass http://backend;
}
# 禁止访问隐藏文件和敏感路径
location ~ /\. {
deny all;
return 404;
}
location ~* ^/(wp-admin|phpmyadmin|\.env|\.git) {
deny all;
return 404;
}
}
# HTTP -> HTTPS 重定向
server {
listen 80;
server_name example.com;
return 301 https://$host$request_uri;
}JWT 安全实践详解
// JWT Token 安全配置与最佳实践
public static class JwtSecurityConfiguration
{
public static void AddJwtSecurity(this WebApplicationBuilder builder)
{
var jwtSettings = builder.Configuration.GetSection("Jwt");
var secretKey = jwtSettings["SecretKey"] ?? throw new InvalidOperationException("JWT SecretKey 未配置");
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = jwtSettings["Issuer"],
ValidAudience = jwtSettings["Audience"],
IssuerSigningKey = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(secretKey)),
ClockSkew = TimeSpan.FromSeconds(30), // 允许 30 秒时钟偏移
RequireExpirationTime = true,
RequireSignedTokens = true
};
// Token 事件处理
options.Events = new JwtBearerEvents
{
OnAuthenticationFailed = context =>
{
if (context.Exception is SecurityTokenExpiredException)
{
context.Response.Headers.Append("Token-Expired", "true");
}
return Task.CompletedTask;
},
OnForbidden = context =>
{
// 记录未授权访问
return Task.CompletedTask;
}
};
});
}
}
// Token 生成与刷新策略
public class TokenService
{
private readonly JwtSettings _settings;
public (string accessToken, string refreshToken, DateTime expiresAt) GenerateTokenPair(User user)
{
var claims = new[]
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id.ToString()),
new Claim(JwtRegisteredClaimNames.Email, user.Email),
new Claim(ClaimTypes.Role, user.Role),
new Claim(JwtRegisteredClaimNames.Jti, Guid.NewGuid().ToString()),
new Claim("tenant", user.TenantId)
};
var key = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(_settings.SecretKey));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var expiresAt = DateTime.UtcNow.AddMinutes(_settings.AccessTokenMinutes);
var accessToken = new JwtSecurityToken(
issuer: _settings.Issuer,
audience: _settings.Audience,
claims: claims,
expires: expiresAt,
signingCredentials: creds
);
// 刷新令牌使用更长过期时间和随机字符串
var refreshToken = Convert.ToBase64String(RandomNumberGenerator.GetBytes(64));
return (new JwtSecurityTokenHandler().WriteToken(accessToken), refreshToken, expiresAt);
}
}常见攻击的实战防御
// SQL 注入防御 — 始终使用参数化查询
public class SecureDataAccess
{
// 错误:字符串拼接(SQL 注入漏洞)
public User GetUserUnsafe(string username)
{
// NEVER DO THIS
// var sql = $"SELECT * FROM Users WHERE Username = '{username}'";
// 攻击者可以输入: ' OR '1'='1' --
}
// 正确:参数化查询
public async Task<User?> GetUserSafe(string username)
{
using var connection = new SqlConnection(_connectionString);
var sql = "SELECT * FROM Users WHERE Username = @Username";
return await connection.QueryFirstOrDefaultAsync<User>(sql, new { Username = username });
}
// 正确:使用 ORM(EF Core 自动参数化)
public async Task<User?> GetUserViaEF(string username)
{
return await _context.Users.FirstOrDefaultAsync(u => u.Username == username);
}
}
// XSS 防御 — 输出编码
public static class XssProtection
{
// 对用户输入进行 HTML 编码
public static string SanitizeHtml(string input)
{
return System.Web.HttpUtility.HtmlEncode(input);
}
// 使用白名单过滤(允许安全的 HTML 标签)
public static string SanitizeWithWhitelist(string input)
{
var sanitizer = new HtmlSanitizer();
sanitizer.AllowedTags.Add("b");
sanitizer.AllowedTags.Add("i");
sanitizer.AllowedTags.Add("p");
sanitizer.AllowedTags.Add("br");
sanitizer.AllowedTags.Add("ul");
sanitizer.AllowedTags.Add("li");
return sanitizer.Sanitize(input);
}
}
// CSRF 防御 — ASP.NET Core 内置 Antiforgery
public static class CsrfProtection
{
public static void AddCsrfProtection(this WebApplicationBuilder builder)
{
builder.Services.AddAntiforgery(options =>
{
options.HeaderName = "X-XSRF-TOKEN";
options.Cookie.Name = "XSRF-TOKEN";
options.Cookie.HttpOnly = false; // 允许 JS 读取
options.Cookie.SameSite = SameSiteMode.Strict;
options.Cookie.SecurePolicy = CookieSecurePolicy.Always;
});
}
}网络抓包与故障诊断
# 使用 tcpdump 抓包分析
# 抓取 HTTP 流量
tcpdump -i eth0 port 80 -w http_traffic.pcap
# 抓取特定 IP 的流量
tcpdump -i eth0 host 192.168.1.100 -w specific_ip.pcap
# 抓取 TCP SYN 包(连接建立)
tcpdump -i eth0 'tcp[tcpflags] & tcp-syn != 0'
# 实时查看 HTTP 请求头
tcpdump -i eth0 -A -s 0 'tcp port 80 and (((ip[2:2] - ((ip[0]&0xf)<<2)) - ((tcp[12]&0xf0)>>2)) != 0)'
# 使用 ss 查看网络连接详情
ss -tunlp # 所有 TCP/UDP 连接
ss -s # 连接统计
ss -ti # 带 TCP 信息的连接
# 网络延迟诊断
mtr --report example.com # 综合 traceroute 和 ping
traceroute -T -p 443 example.com # TCP 层 traceroute
# DNS 故障诊断
dig @8.8.8.8 example.com A # 指定 DNS 服务器查询
dig example.com +trace # 完整 DNS 解析路径
nslookup -type=MX example.com # 查询 MX 记录
# 检查 SSL 证书有效期
echo | openssl s_client -connect example.com:443 2>/dev/null | openssl x509 -noout -dates优点
缺点
总结
网络与安全面试需要展示对协议原理的深入理解和安全防护的实战能力。TCP/IP 和 HTTP 是基础,HTTPS/TLS 加密是重点,安全防护需要系统性思维。建议通过抓包分析(Wireshark)、搭建实验环境、配置 Web 服务器等方式加深理解,在面试中结合实际案例展示安全意识和技术能力。
这组题真正考什么
- 这类题真正想看的是你能否支撑稳定交付,而不是只会敲命令。
- 高频追问一般会落到回滚、审计、权限、监控和灾备。
- 如果答案里有完整链路,通常比零散命令更打动人。
60 秒答题模板
- 先说目标和场景。
- 再说关键流程和涉及的工具。
- 最后补失败恢复、监控和回滚方案。
容易失分的点
- 只讲部署成功,不讲失败恢复。
- 把测试环境经验直接当成生产最佳实践。
- 没有说明权限和审计控制。
刷题建议
- 把发布链路拆成代码、构建、制品、环境、监控五段来记。
- 练习时多说回滚、审计、权限和故障恢复,不要只讲部署成功路径。
- 每类工具都准备一个实际落地案例。
高频追问
- 如果发布失败或监控报警,你会如何快速止损?
- 这个工具或方案如何保证幂等、可观测和可回滚?
- 在多人协作和多环境下,最大的治理难点是什么?
复习重点
- 把每道题的关键词整理成自己的知识树,而不是只背原句。
- 对容易混淆的概念要做横向比较,例如机制差异、适用边界和性能代价。
- 复习时优先补“为什么”,其次才是“怎么用”和“记住什么术语”。
面试作答提醒
- 回答运维题时,优先交代目标、流程、风险和回滚。
- 不要把测试环境经验直接当成生产最佳实践。
- 提到自动化时,最好补一条审计或权限控制措施。
