通过 HTTP/HTTPS 代理转发本地生成的安全 Websocket 流量 (wss) 以到达互联网

通过 HTTP/HTTPS 代理转发本地生成的安全 Websocket 流量 (wss) 以到达互联网

我有一个 python webex_bot 应用程序(https://github.com/fbradyirl/webex_bot) 使用 websockets 进行 webex 云通信。问题是托管机器人的服务器无法直接访问互联网,您需要使用代理服务器 (10.13.140.88:3128)。

WSS 客户端 -> HTTP/HTTPS 代理 -> Internet(WSS 服务器)

经过调查,该机器人不接受任何与代理相关的参数,需要寻找任何替代方案。

第一次解决尝试:使用 iptables 转发本地代理生成的流量:

sudo nano /etc/sysctl.conf
Uncomented: net.ipv4.ip_forward=1
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination 10.13.140.88:3128
sudo iptables -t nat -A OUTPUT -p tcp --dport 443 -j DNAT --to-destination 10.13.140.88:3128

但在尝试运行机器人后,发现了 SSL 错误:

2023-08-13 13:51:40  [INFO]  [webex_websocket_client.webex_bot.websockets.webex_websocket_client._connect_and_listen]:160 Opening websocket connection to wss://mercury-connection-partition0-a.wbx2.com/v1/apps/wx2/registrations/78f90e01-df70-405f-89c9-a8fe3a1bdad8/messages
2023-08-13 13:51:40  [ERROR]  [webex_websocket_client.webex_bot.websockets.webex_websocket_client.run]:175 runException: [SSL: WRONG_VERSION_NUMBER] wrong version number (_ssl.c:1007)

研究完这个问题后,我想我能够找到失败的原因:

“您不能直接使用 iptables 执行此操作,因为在第 3/4 层执行“重定向”将不允许进行 SSL 协商,因为客户端的浏览器仍将使用纯 HTTP。

您需要做的是使用 HTTP 302(或其他 300 级别)响应代码将用户重定向到您网站的 HTTPS 版本。”

第二次解决尝试:使用 nginx 转发本地代理生成的流量:

尝试了以下配置,但没有成功:

#ocation ~ /ws.* {
    proxy_http_version 1.1;
    proxy_set_header Accept-Encoding "";
    proxy_set_header X-Real-IP 10.13.140.88;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For 10.13.140.88:3128;
    proxy_set_header XFORWARDEDPROTO https;
    proxy_set_header X-NginX-Proxy true;
    proxy_buffers 8 32k;
    proxy_buffer_size 64k;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "Upgrade";
    proxy_read_timeout 86400;
    proxy_pass http://10.13.140.88:3128;
}

第三次解决尝试:使用 haproxy 转发本地代理生成的流量:

似乎需要对 HTTPS 流量执行第 7 层重定向(302)以允许 SSL 协商,经过研究,似乎 haproxy 有能力执行此 L7(应用程序层)转发:https://www.haproxy.com/blog/redirect-http-to-https-with-haproxy

frontend local_ssl
        bind *:443 ssl crt /home/admin/apps/webex-bot/server.pem
        mode http
        tcp-request inspect-delay 5s
        tcp-request content accept if { req_ssl_hello_type 1 }
        use_backend redirect_https_proxy if { req_ssl_sni -i 10.13.140.88:3128 }

backend redirect_https_proxy
        mode http
        server proxy_server 10.13.140.88:3128

但也没有成功,这表明在流程级别出现了错误:

haproxy -f /etc/haproxy/haproxy.cfg -c
[WARNING]  (10715) : Proxy 'local_ssl': L6 sample fetches ignored on HTTP proxies (declared at /etc/haproxy/haproxy.cfg:41).
[WARNING]  (10715) : Proxy 'local_ssl': L6 sample fetches ignored on HTTP proxies (declared at /etc/haproxy/haproxy.cfg:40).
Warnings were found.
Configuration file is valid

服务运行失败的情况:

sudo systemctl status haproxy
× haproxy.service - HAProxy Load Balancer
     Loaded: loaded (/lib/systemd/system/haproxy.service; enabled; vendor preset: enabled)
     Active: failed (Result: exit-code) since Sun 2023-08-13 14:18:36 CST; 1h 11min ago
       Docs: man:haproxy(1)
             file:/usr/share/doc/haproxy/configuration.txt.gz
    Process: 10243 ExecStartPre=/usr/sbin/haproxy -Ws -f $CONFIG -c -q $EXTRAOPTS (code=exited, status=0/SUCCESS)
    Process: 10245 ExecStart=/usr/sbin/haproxy -Ws -f $CONFIG -p $PIDFILE $EXTRAOPTS (code=exited, status=1/FAILURE)
   Main PID: 10245 (code=exited, status=1/FAILURE)
        CPU: 122ms

重定向是否可行?有解决这个问题的办法吗?

相关内容