![Linux 实例与 Windows 实例 - AWS 私有子网通过 NAT 路由流量中的不同行为](https://linux22.com/image/781341/Linux%20%E5%AE%9E%E4%BE%8B%E4%B8%8E%20Windows%20%E5%AE%9E%E4%BE%8B%20-%20AWS%20%E7%A7%81%E6%9C%89%E5%AD%90%E7%BD%91%E9%80%9A%E8%BF%87%20NAT%20%E8%B7%AF%E7%94%B1%E6%B5%81%E9%87%8F%E4%B8%AD%E7%9A%84%E4%B8%8D%E5%90%8C%E8%A1%8C%E4%B8%BA.png)
我正在 EC2 实例中试验 NAT 网关与 Squid 代理(它们都位于同一个公共子网中)。为了测试连通性,我使用私有子网访问互联网(一次使用 Linux 实例,然后再次使用 Windows 实例)。实际切换(squid 与 NAT)是在路由表条目中完成的。
换句话说,我测试了以下 4 种组合:
- Linux实例+NAT网关
- Linux 实例 + Squid 代理
- Windows 实例 + NAT 网关
- Windows 实例 + Squid 代理
我发现两个实例的行为有所不同。Windows 似乎很“粘”,无法识别路由已更改。当我将路由从 Squid 更改为 NAT 时,我可以看到 curl 命令在 Linux 实例中开始工作,但浏览器访问在 Windows 实例中不起作用。
以下是步骤顺序。实际设置列于此之后。
步骤顺序
- 使用 Ssl peek-and-splice 功能设置 squid,以允许某些网站并阻止其他网站
- 更新路由表,以便流量从私有子网流出 > squid eni
- 在 Linux 中尝试 curl。响应显示 Squid 存在。
- 在 Windows 中打开浏览器并转到 URL。响应显示 Squid 已存在。
- 更新路由表,以便流量从私有子网流向 nat 网关
- 在 Linux 中尝试 curl。响应表明我们可以访问互联网。
- 在 Windows 中打开浏览器并转到 URL。响应仍然显示 Squid 存在。
VPC 详细信息(仅精简到相关子网)
公共子网既有 NAT 网关,也有运行 squid 的 EC2 实例
安全组已设置为允许 HTTP 和 HTTPS 流量入站以及所有流量出站
每个子网都有自己的路由表关联
公有子网中的 0.0.0.0/0 指向互联网网关
私有子网中的 0.0.0.0/0 指向以下资源之一:
i. 到 NAT 网关
ii. 运行 squid 的 EC2 实例的 ENI
Squid 代理设置详细信息
我尝试将 squid 作为透明代理运行,但出了点问题。我收到错误curl: (35) OpenSSL SSL_connect: SSL_ERROR_SYSCALL
。尽管如此,它显示 squid 正在运行并拦截流量。
会议:
visible_hostname squid
cache deny all
# Log format and rotation
logformat squid %ts.%03tu %6tr %>a %Ss/%03>Hs %<st %rm %ru %ssl::>sni %Sh/%<a %mt
logfile_rotate 10
debug_options rotate=10
# Handle HTTP requests
http_port 3128
http_port 3129 intercept
# Handle HTTPS requests
https_port 3130 cert=/etc/squid/ssl/squid.pem ssl-bump intercept
acl SSL_port port 443
http_access allow SSL_port
acl step1 at_step SslBump1
acl step2 at_step SslBump2
acl step3 at_step SslBump3
ssl_bump peek step1 all
# Deny requests to proxy instance metadata
acl instance_metadata dst 169.254.169.254
http_access deny instance_metadata
# Filter HTTP requests based on the allowlist
acl allowed_http_sites dstdomain "/etc/squid/allowlist.txt"
http_access allow allowed_http_sites
# Filter HTTPS requests based on the allowlist
acl allowed_https_sites ssl::server_name "/etc/squid/allowlist.txt"
ssl_bump peek step2 allowed_https_sites
ssl_bump splice step3 allowed_https_sites
ssl_bump terminate step2 all
http_access deny all
iptables:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3129
iptables -t nat -A PREROUTING -p tcp --dport 443 -j REDIRECT --to-port 3130
实例详细信息
- Linux:私有子网中的 Amazon Linux EC2 实例。无公共 IP。已启用私有 IP DNS。
- Windows:通过私有子网中的 AWS WorkSpaces 设置 Windows 10。安全组尚未更改,并且由 WorkSpaces 进行配置。
当比较 Linux curl 与 Windows 浏览器时,配置错误的 Squid 代理显示不同:
- 对于 Linux curl,
OpenSSL SSL_connect: SSL_ERROR_SYSCALL
无论我尝试访问被阻止的 URL 还是允许的 URL,我总是会得到一个 。 - 对于 Windows 浏览器,
PR_END_OF_FILE_ERROR
如果 URL 不在允许列表中,我会收到一个。如果在允许列表中,则访问不会出现问题。
我如何理解这里发生的事情?当路由表发生变化时,Windows 实例是否也应该将流量路由到 NAT 网关?