Socat 子进程在客户端断开连接后不会终止

问题描述 投票:0回答:1

我正在使用

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

我尝试过的:

  1. 添加
    keepalive
    及其设置选项(基于这个问题):没有改进。
  2. -t
    -T
    参数:无改善。

观察:

  1. 当我让客户端正确结束会话时,socat 端的子进程正确关闭
  2. 默认情况下,客户端发送 EOF 十秒后,socat 会将其打印到日志中,但子进程仍然处于活动状态。
N inactivity timeout triggered
N exiting with status 0
  1. 这是建立 4 个连接后的 netstat 输出:
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

我创建了许多分叉连接,随着时间的推移,服务器创建了数百个挂起进程,这些进程分配数百兆字节的内存,直到服务器崩溃。

任何帮助或建议将不胜感激!

linux networking tcp socat
1个回答
0
投票

我还没有找到使用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 证书验证,这可能会导致严重的安全问题 - 网络上潜在的恶意行为者可以访问代理和目标服务器之间的通信。

© www.soinside.com 2019 - 2024. All rights reserved.