我正在使用
socat
通过 SSL 将流量从本地端口转发到远程服务器。我的命令如下:
socat -d -d TCP-LISTEN:1234,fork,reuseaddr OPENSSL:192.168.1.2:1234,verify=0
但是,我遇到了一个问题,即由
socat
创建的子进程即使在客户端断开连接后也不会终止。当我关闭客户端连接(使用 nc localhost 1234
建立连接,然后按 ctrl-C)时,我在 socat
调试日志中看到以下内容:
2024/07/06 22:37:12 socat[146196] N listening on AF=10 [0000:0000:0000:0000:0000:0000:0000:0000]:1234
2024/07/06 22:37:14 socat[146196] N accepting connection from AF=10 [0000:0000:0000:0000:0000:ffff:7f00:0001]:41648 on AF=10 [0000:0000:0000:0000:0000:ffff:7f00:0001]:1234
2024/07/06 22:37:14 socat[146196] N forked off child process 146210
2024/07/06 22:37:14 socat[146196] N listening on AF=10 [0000:0000:0000:0000:0000:0000:0000:0000]:1234
尽管如此,子进程仍保持活动状态。这是悬挂过程的
pgrep -a socat
输出:
146196 socat -d -d TCP-LISTEN:1234,fork,reuseaddr OPENSSL:192.168.1.2:1234,verify=0
146210 socat -d -d TCP-LISTEN:1234,fork,reuseaddr OPENSSL:192.168.1.2:1234,verify=0
keepalive
及其设置选项(基于这个问题):没有改进。-t
和 -T
参数:无改善。N inactivity timeout triggered
N exiting with status 0
tcp 0 1 10.0.0.21:37192 192.168.1.2:1234 SYN_SENT 217732/socat
tcp 0 1 10.0.0.21:44948 192.168.1.2:1234 SYN_SENT 217655/socat
tcp 0 1 10.0.0.21:44934 192.168.1.2:1234 SYN_SENT 217645/socat
tcp 0 1 10.0.0.21:44920 192.168.1.2:1234 SYN_SENT 217630/socat
tcp6 0 0 :::1234 :::* LISTEN 217531/socat
我创建了许多分叉连接,随着时间的推移,服务器创建了数百个挂起进程,这些进程分配数百兆字节的内存,直到服务器崩溃。
任何帮助或建议将不胜感激!
我还没有找到使用socat的解决方案。但我使用 nginx ssl 代理实现了相同的目标。这是我的 Docker 设置:
docker-compose.yaml:
version: '3'
services:
nginx:
image: nginx:latest
ports:
- "1234:1234"
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
nginx.conf:
events { }
http {
server {
listen 1234;
location / {
proxy_pass https://destionation-on-lan:1234;
proxy_ssl_verify off;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
}
注意! 请小心使用此配置,我禁用了 SSL 证书验证,这可能会导致严重的安全问题 - 网络上潜在的恶意行为者可以访问代理和目标服务器之间的通信。