Linux 实例与 Windows 实例 - AWS 私有子网通过 NAT 路由流量中的不同行为

Linux 实例与 Windows 实例 - AWS 私有子网通过 NAT 路由流量中的不同行为

我正在 EC2 实例中试验 NAT 网关与 Squid 代理(它们都位于同一个公共子网中)。为了测试连通性,我使用私有子网访问互联网(一次使用 Linux 实例,然后再次使用 Windows 实例)。实际切换(squid 与 NAT)是在路由表条目中完成的。

换句话说,我测试了以下 4 种组合:

  1. Linux实例+NAT网关
  2. Linux 实例 + Squid 代理
  3. Windows 实例 + NAT 网关
  4. Windows 实例 + Squid 代理

我发现两个实例的行为有所不同。Windows 似乎很“粘”,无法识别路由已更改。当我将路由从 Squid 更改为 NAT 时,我可以看到 curl 命令在 Linux 实例中开始工作,但浏览器访问在 Windows 实例中不起作用。

以下是步骤顺序。实际设置列于此之后。

步骤顺序

  1. 使用 Ssl peek-and-splice 功能设置 squid,以允许某些网站并阻止其他网站
  2. 更新路由表,以便流量从私有子网流出 > squid eni
  3. 在 Linux 中尝试 curl。响应显示 Squid 存在。
  4. 在 Windows 中打开浏览器并转到 URL。响应显示 Squid 已存在。
  5. 更新路由表,以便流量从私有子网流向 nat 网关
  6. 在 Linux 中尝试 curl。响应表明我们可以访问互联网。
  7. 在 Windows 中打开浏览器并转到 URL。响应仍然显示 Squid 存在

VPC 详细信息(仅精简到相关子网)

  1. 公共子网既有 NAT 网关,也有运行 squid 的 EC2 实例

  2. 安全组已设置为允许 HTTP 和 HTTPS 流量入站以及所有流量出站

  3. 每个子网都有自己的路由表关联

  4. 公有子网中的 0.0.0.0/0 指向互联网网关

  5. 私有子网中的 0.0.0.0/0 指向以下资源之一:

    i. 到 NAT 网关

    ii. 运行 squid 的 EC2 实例的 ENI

当它指向 Squid 时显示的屏幕截图:指向 squid 实例 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

实例详细信息

  1. Linux:私有子网中的 Amazon Linux EC2 实例。无公共 IP。已启用私有 IP DNS。
  2. Windows:通过私有子网中的 AWS WorkSpaces 设置 Windows 10。安全组尚未更改,并且由 WorkSpaces 进行配置。

当比较 Linux curl 与 Windows 浏览器时,配置错误的 Squid 代理显示不同:

  1. 对于 Linux curl,OpenSSL SSL_connect: SSL_ERROR_SYSCALL无论我尝试访问被阻止的 URL 还是允许的 URL,我总是会得到一个 。
  2. 对于 Windows 浏览器,PR_END_OF_FILE_ERROR如果 URL 不在允许列表中,我会收到一个。如果在允许列表中,则访问不会出现问题。

我如何理解这里发生的事情?当路由表发生变化时,Windows 实例是否也应该将流量路由到 NAT 网关?

相关内容