SSLH的透明模式如何工作?

Tal*_*Tal 5 networking routing iptables

我有一台服务器需要在端口 443 上接受 TCP 连接,确定连接是 OpenVPN 客户端还是 HTTPS 客户端,然后将其转发到我的 Web 服务器或 OpenVPN 服务器。

SSLH 是专门为此目的而设计的,并且看起来效果很好。唯一的问题是,虽然将其设置为非透明模式对我来说效果很好,但使用透明模式却给我带来了麻烦。

有人可以解释透明模式应该如何工作背后的理论吗?

SSLH指南说,为了透明地使用 SSLH,您需要:

  • 将 sslh.cfg 设置为transparent: true;
    • 我已经这样做了
  • sslh 需要扩展权限 (CAP_NET_ADMIN)
    • 我从 CentOS 7 的存储库安装了 sslh,它附带了用于 systemd 的 sslh.service。该服务文件包含该行CapabilityBoundingSet=... CAP_NET_ADMIN ...,所以我假设这已经由 SystemD 完成
  • 设置标记数据包的 iptables 规则以及某种本地路由
    • 这是我不太清楚的。这些是否在 SSLH 服务器上进行设置?或者他们是否在 OpenVPN 和 HTTPS 服务器上进行设置?

我在示例中了解到,iptables 被告知用 0x1 标记标记源端口为 22 或 4443 的任何数据包,创建一条规则以使任何标记为 0x1 的数据包使用路由表 100,并创建路由表 100设置某种执行某些操作的本地路由。

为什么这些 iptables 规则和路由是必要的?该路线实际上在做什么?我认为路由应该位于 Web 服务器和 OpenVPN 服务器上,并指向 SSLH ip,但这似乎对我也不起作用。

===

更新:我突然想到,这可能是一条指向本地主机的路由,因为在示例中,服务器都在同一台计算机上,并且它们希望来自实际服务器的回复数据包在离开之前通过 SSLH机器。听起来对吗?如果是这样,如果我的服务器位于不同的机器上,我该怎么办?在这些机器上设置流量标记和返回 SSLH 服务器的路由?

更新 2:我只是在与 SSLH 相同的机器上快速设置了 HTTPS 服务器,透明模式似乎确实按照 SSLH 文档示例中的方式工作。当它们位于不同的服务器上时,我需要它才能工作。

小智 5

在非透明模式下,客户端连接client_ip:client_portsslh端口 上的代理443。然后代理在端口 上打开与内部服务器的sslh连接。内部 Web 服务器将应答从到。最后代理将应答数据包的来源重写并发送给客户端。sslh_ip:sslh_port4443web_ip:4443proxy_ip:proxy_portsslhsshl_ip:443

在透明模式下,代理和内部服务器之间的连接的sslh数据包源设置为原始数据包client_ip:client_port。因此,内部 Web 服务器直接响应client_ip:client_port作为web_ip:4443源。但客户端等待数据包形成proxy_ip:443

要管理来自内部服务器的应答包的重写,这些包必须通过sslh守护程序进行路由。我认为守护进程在环回接口上寻找给客户端的应答包。sslh在文档中,仅规定了代理和 Web 内部服务器位于同一台计算机上的情况。

通过尝试和错误,我找到了以下解决方案:(在sslh代理上)

ip route add local default dev lo table 100
ip rule add fwmark 0x1 lookup 100
iptables -t mangle -N SSLH
iptables -t mangle -A SSLH -j MARK --set-mark 0x1
iptables -t mangle -A SSLH -j ACCEPT
Run Code Online (Sandbox Code Playgroud)

(从内部服务器捕获应答包)

iptables -t mangle -A PREROUTING -p tcp -s **web_ip** --sport 4443 -j SSLH
Run Code Online (Sandbox Code Playgroud)

...(其他服务的类似规则,例如 ssh、openvpn)...

仅当内部 Web 服务器的默认路由通过sshl代理服务器到达 Internet 时,此功能才有效。

  • 我能够通过在 SSLH 服务器上使用几乎完全相同的命令来实现此功能,但就我而言,内部 Web 服务器上的默认路由不会经过 sslh 服务器,因此我所做的是在其上运行此命令: `iptables -t mangle -N SSLH; iptables -t mangle -A 输出 -o eth0 -p tcp -m tcp --sport 4443 -j SSLH; iptables -t mangle -A SSLH -j MARK --设置标记 0x1; iptables -t mangle -A SSLH -j 接受;ip规则添加fwmark 0x1查找100;ip 路由通过 [SSLH_IP] 表 100 添加默认值。其中 [SSLH_IP] 是 sslh 服务器的 LAN IP。这看起来效果不错。 (2认同)