Tal*_*Tal 5 networking routing iptables
我有一台服务器需要在端口 443 上接受 TCP 连接,确定连接是 OpenVPN 客户端还是 HTTPS 客户端,然后将其转发到我的 Web 服务器或 OpenVPN 服务器。
SSLH 是专门为此目的而设计的,并且看起来效果很好。唯一的问题是,虽然将其设置为非透明模式对我来说效果很好,但使用透明模式却给我带来了麻烦。
有人可以解释透明模式应该如何工作背后的理论吗?
SSLH指南说,为了透明地使用 SSLH,您需要:
transparent: true;
CapabilityBoundingSet=... CAP_NET_ADMIN ...
,所以我假设这已经由 SystemD 完成我在示例中了解到,iptables 被告知用 0x1 标记标记源端口为 22 或 4443 的任何数据包,创建一条规则以使任何标记为 0x1 的数据包使用路由表 100,并创建路由表 100设置某种执行某些操作的本地路由。
为什么这些 iptables 规则和路由是必要的?该路线实际上在做什么?我认为路由应该位于 Web 服务器和 OpenVPN 服务器上,并指向 SSLH ip,但这似乎对我也不起作用。
===
更新:我突然想到,这可能是一条指向本地主机的路由,因为在示例中,服务器都在同一台计算机上,并且它们希望来自实际服务器的回复数据包在离开之前通过 SSLH机器。听起来对吗?如果是这样,如果我的服务器位于不同的机器上,我该怎么办?在这些机器上设置流量标记和返回 SSLH 服务器的路由?
更新 2:我只是在与 SSLH 相同的机器上快速设置了 HTTPS 服务器,透明模式似乎确实按照 SSLH 文档示例中的方式工作。当它们位于不同的服务器上时,我需要它才能工作。
小智 5
在非透明模式下,客户端连接client_ip:client_port
到sslh
端口 上的代理443
。然后代理在端口 上打开与内部服务器的sslh
连接。内部 Web 服务器将应答从到。最后代理将应答数据包的来源重写并发送给客户端。sslh_ip:sslh_port
4443
web_ip:4443
proxy_ip:proxy_port
sslh
sshl_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 时,此功能才有效。