我有一个 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
重定向是否可行?有解决这个问题的办法吗?