AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / server / 问题

问题[socat](server)

Martin Hope
dontspeak
Asked: 2023-07-17 18:00:41 +0800 CST

通过 kubectl 和 socat 进行 K8s 端口转发

  • 5

我的 k8s pod 正在连接到某个 https 目标。该目标无法从我的本地计算机访问,因此我想使用kubectl proxy+socat使该目标在我的本地计算机上可用以进行本地开发。

问题是我什至无法让 socat 工作,我很困惑为什么。

首先,我检查 pod 上与目标的连接:

curl -v -k https://target/rest/
Trying 54.136.137.42:443...
* TCP_NODELAY set

[...]

{"message":"key header missing"}

当不提供身份验证信息时,此消息是目标的默认响应,因此一切正常。

现在我使用 socat 和本地端口 1234:

socat tcp-listen:1234,reuseaddr,fork tcp:target:443

但是当我现在尝试卷曲目标时,我只是得到 404,就像 socat 从未启动一样。那应该有效吗?我是否错误地使用了socat?和TLS有关系吗?

HTTP:

curl -v -k http://localhost:1234/rest/
*   Trying ::1:1234...
* TCP_NODELAY set
* connect to ::1 port 1234 failed: Connection refused
*   Trying 127.0.0.1:1234...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 1234 (#0)
> GET /rest/ HTTP/1.1
> Host: localhost:1234
> User-Agent: curl/7.68.0
> Accept: */*
>
* Mark bundle as not supporting multiuse
< HTTP/1.1 404 Not Found
< Content-Type: text/plain; charset=utf-8
< X-Content-Type-Options: nosniff
< Date: Mon, 17 Jul 2023 07:49:05 GMT
< Content-Length: 19
< 404 page not found
* Connection #0 to host localhost left intact

HTTPS:

curl -v -k https://localhost:1234/rest/
*   Trying ::1:1234...
* TCP_NODELAY set
* connect to ::1 port 1234 failed: Connection refused
*   Trying 127.0.0.1:1234...
* TCP_NODELAY set
* Connected to localhost (127.0.0.1) port 1234 (#0)
* ALPN, offering h2
* ALPN, offering http/1.1
* successfully set certificate verify locations:
*   CAfile: /etc/ssl/certs/ca-certificates.crt
  CApath: /etc/ssl/certs
* TLSv1.3 (OUT), TLS handshake, Client hello (1):
* TLSv1.3 (IN), TLS handshake, Server hello (2):
* TLSv1.3 (IN), TLS handshake, Encrypted Extensions (8):
* TLSv1.3 (IN), TLS handshake, Certificate (11):
* TLSv1.3 (IN), TLS handshake, CERT verify (15):
* TLSv1.3 (IN), TLS handshake, Finished (20):
* TLSv1.3 (OUT), TLS change cipher, Change cipher spec (1):
* TLSv1.3 (OUT), TLS handshake, Finished (20):
* SSL connection using TLSv1.3 / TLS_AES_128_GCM_SHA256
* ALPN, server accepted to use h2
* Server certificate:
*  subject: C=DE; ST=NRW; L=Munich; O=AG; CN=digital-int.app.intra.net
*  start date: Dec  2 08:20:52 2021 GMT
*  expire date: Dec  2 08:20:52 2023 GMT
*  issuer: C=DE; O=AG; CN=Corp-Issuing-CA01-G2
*  SSL certificate verify ok.
* Using HTTP2, server supports multi-use
* Connection state changed (HTTP/2 confirmed)
* Copying HTTP/2 data in stream buffer to connection buffer after upgrade: len=0
* Using Stream ID: 1 (easy handle 0x5997a85d52f0)
> GET /rest/ HTTP/2
> Host: localhost:1234
> user-agent: curl/7.68.0
> accept: */*
>
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* Connection state changed (MAX_CONCURRENT_STREAMS == 250)!
< HTTP/2 404
< content-type: text/plain; charset=utf-8
< x-content-type-options: nosniff
< content-length: 19
< date: Mon, 17 Jul 2023 11:40:36 GMT
<
404 page not found
* Connection #0 to host localhost left intact
socat
  • 1 个回答
  • 27 Views
Martin Hope
creatldd1 creatldd1
Asked: 2022-12-05 00:02:48 +0800 CST

带有截断消息的 Socat udp 客户端/服务器

  • 5

使用 nodejs 我可以传输负载为 50000 个字符的 udp 数据包。但是我没有使用 socat(客户端和服务器上的 Linux ubuntu 20.04)这样做。

对于此测试,我一直在使用 vpn 将我的家庭主机连接到我的工作主机。我有点期待 socat 会丢失一些数据,但没有到那种程度!

在远程(工作)主机上,socat 服务器等待请求发回膨胀的 udp 响应 > 50000 字节。

cat <<EOF > sotest.sh 
#!/bin/bash
head -c 50000 < /dev/zero | tr '\0' 'q'
EOF
chmod +x sotest.sh
socat udp4-listen:13000,reuseaddr,fork EXEC:"./sotest.sh" # server
#client
printf "trigger" |socat -T 5 -,ignoreeof udp4:10.50.1.184:13000,sndbuf=64000,rcvbuf=64000 > t.t 

并检查消息大小wc -c t.t给我大约 8k 个字符而不是 50k。

如果我使用我的 nodejs udp 客户端/服务器,则服务器发送的 50k 字符消息将由 nodejs 客户端完整接收。客户端:https ://jsfiddle.net/xtcpL63a/ 服务器:https ://jsfiddle.net/851fc7bp/

我唯一的线索是 socat 的错误消息,只能在调试模式下看到

022/12/03 22:37:40 socat[1051733] N forked off child process 1051734
2022/12/03 22:37:40 socat[1051733] N forked off child process 1051734
2022/12/03 22:37:40 socat[1051733] I close(7)
2022/12/03 22:37:40 socat[1051733] I resolved and opened all sock addresses
2022/12/03 22:37:40 socat[1051733] N starting data transfer loop with FDs [5,5] and [6,6]
2022/12/03 22:37:40 socat[1051733] I transferred 73 bytes from 5 to 6
2022/12/03 22:37:40 socat[1051734] I just born: child process 1051734
2022/12/03 22:37:40 socat[1051734] I close(4)
2022/12/03 22:37:40 socat[1051734] I close(3)
2022/12/03 22:37:40 socat[1051734] I close(6)
2022/12/03 22:37:40 socat[1051734] I dup2(7, 0) -> 0
2022/12/03 22:37:40 socat[1051734] I dup2(7, 1) -> 1
2022/12/03 22:37:40 socat[1051734] I close(7)
2022/12/03 22:37:40 socat[1051734] N execvp'ing "./sotest.sh"
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 8192 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] I transferred 848 bytes from 6 to 5
2022/12/03 22:37:40 socat[1051733] E read(5, 0x5566b4417150, 8192): Connection refused
2022/12/03 22:37:40 socat[1051733] N exit(1)
2022/12/03 22:37:40 socat[1051733] I shutdown(5, 2)
2022/12/03 22:37:40 socat[1051733] I shutdown(6, 2)

这个问题在 Linux 方面不能与缓冲区相关,也不能与 mtu 相关。那么 socat 发生了什么?

解决方案:Tero Kilkanen 指出了这个问题。强制 socat 在客户端使用更大的缓冲区使我能够完整地接收消息;它解决了但并没有真正解释这种行为......

#client
printf "${MSG}" |socat -b100000 -T 5 -,ignoreeof udp4:10.50.1.184:13000,sndbuf=64000,rcvbuf=64000 > t.t 

在服务器端,它确保发送一个数据包;您可以在调试日志中看到行为差异:

socat -b100000 -d -d -d udp4-listen:13000,reuseaddr,fork EXEC:"./sotest.sh"
socat
  • 1 个回答
  • 30 Views
Martin Hope
hyogy
Asked: 2021-07-27 12:55:25 +0800 CST

Socat - 有可能吗?

  • 1

在使用 socat 进行端口转发时,有什么方法可以监听和执行命令(对于每个连接)?一个不工作的例子使它更清楚:

socat TCP-LISTEN:8080,reuseaddr, "exec:ls" fork tcp:localhost:80

linux port-forwarding socket socat
  • 1 个回答
  • 1476 Views
Martin Hope
Darragh
Asked: 2020-04-10 15:08:25 +0800 CST

如何捕获 UDP 流量,以便将其通过管道传输到 grep

  • 1

我正在尝试捕获作为 StatsD 指标发送的 UDP 流量(在端口 8125 上)。

我尝试过的最简单的方法是运行nc -ul 8125将指标打印到终端......但它们不是换行符分隔的。此外,将输出传送到 grep 不会显示任何内容。

我尝试的下一个方法是socat - udp-listen:8125与 netcat 给出类似的结果。

但是,当我将 -v flat和管道 stderr 传递给 stdout ( socat -v - udp-listen:8125 2> &1 | grep ...) 时,我会得到模糊的不错的结果,但还有很多额外的不需要的输出。

我也尝试过 tshark,tshark -l -f "port 8125" -i ln0 -E separator=, -Tfields -e data但这会将输出打印为十六进制......而不是 ascii。我可以传入 -x 标志,它并排打印十六进制和 ascii。不是我想要的,也不是很友好。我还尝试了许多其他 tshark 选项,但没有任何东西能够简单地打印 UDP 指标。

我已经看到了一些例子,其中有人做类似的事情正在增加输出,例如| while read output; do echo $output; done;但是,我没有用这种方法取得任何成功,而且我不是一个真正的 unix 人,所以我正在努力想出一个解决方案。

毕竟,这似乎并没有什么不寻常的任务,而且nc -ul 8125几乎就在那里......

为了提供更多上下文......执行发送的代码如下所示:

var udpClient = new UdpClient();
udpClient.Connect("127.1", 9999);
while (true)
{
    var bytes = Encoding.UTF8.GetBytes("hi");
    udpClient.Send(bytes, bytes.Length);
    Thread.Sleep(1000);
}

所需的输出看起来像

hi
hi
hi
...

而nc -ul 9999输出hihihihihi....

udp netcat tshark socat statsd
  • 1 个回答
  • 940 Views
Martin Hope
tudor -Reinstate Monica-
Asked: 2016-04-08 18:40:32 +0800 CST

socat CREATE 返回错误的文件描述符

  • 1

我正在尝试构建一个快速脚本来侦听一个 UDP 数据包,将其存储到文件中,然后退出。

socat来救援!

$ socat UDP-RECVFROM:9999 CREATE:/tmp/results_9999
2016/04/08 11:56:59 socat[1955] E read(6, 0x5220d3d0020, 8192): Bad file descriptor

嗯?

该文件包含收到的数据包:

$ cat /tmp/results_9999
SUCCESS on Port 9999

strace 似乎表明它试图读取它写入的文件:

recvfrom(5, "SUCCESS on Port 9999\n", 8192, 0, {sa_family=AF_INET, sin_port=htons(34032), sin_addr=inet_addr("192.168.56.102")}, [16]) = 10
recvfrom(3, 0x78ea087b3700, 519, 64, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(3, 0x78ea087b3d40, 519, 64, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
write(6, "SUCCESS on Port 9999\n", 10)             = 10
recvfrom(3, 0x78ea087b3d40, 519, 64, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
recvfrom(3, 0x78ea087b3840, 519, 64, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
read(6, 0xb675ac8f020, 8192)            = -1 EBADF (Bad file descriptor)
recvfrom(3, 0x78ea087b3840, 519, 64, 0, 0) = -1 EAGAIN (Resource temporarily unavailable)
open("/etc/localtime", O_RDONLY|O_NONBLOCK|O_CLOEXEC) = 7
fstat(7, {st_mode=S_IFREG|0644, st_size=2223, ...}) = 0
mmap(NULL, 2223, PROT_READ, MAP_SHARED, 7, 0) = 0x6c38b6779000
close(7)                                = 0
getpid()                                = 1954
writev(2, [{"", 0}, {"2016/04/08 11:56:41 socat[1954] "..., 84}], 22016/04/08 11:56:41 socat[1954] E read(6, 0xb675ac8f020, 8192): Bad file descriptor
) = 84
exit_group(1)                           = ?
+++ exited with 1 +++

为什么它需要读取文件,如果是这样,他们为什么要以只写方式打开文件?

有没有解决这个问题的开关还是一个错误?

socat
  • 1 个回答
  • 1329 Views
Martin Hope
RoyHB
Asked: 2012-12-04 02:41:25 +0800 CST

使用 socat 执行 php cli

  • 0

有多个客户端程序定期连接到我服务器上的一个端口并发送一行文本。

建立到端口的连接后,我需要启动一个处理数据的 PHP CLI 脚本。可能有许多远程脚本或多或少同时运行/连接,所以我认为最好让 socat 为每个连接分叉一个进程来运行脚本。

我已经让 socat 完成我需要的大部分工作,使用命令

socat tcp-l:myport,fork exec:mypath/socatTest.php

我可以读取 php://stdIn 上的输入。一切都很好。

问题是这个过程似乎没有 fork,所以如果第二个外部程序发送数据而另一个正在做同样的事情,它会得到一个连接被拒绝的错误。

我哪里出错了?

socat
  • 1 个回答
  • 1597 Views
Martin Hope
user274
Asked: 2012-07-09 04:25:01 +0800 CST

我如何使用 socat 作为代理服务器?

  • 7

我希望我的 .NET 应用程序使用代理,我知道该怎么做,但 .net 不支持 sock4a/sock5。我知道如何设置我的应用程序,但是,如何设置 socat 以在端口 1234 上作为 TCP 代理侦听并在 127.0.0.1:5678 使用 socks5 服务器?

它必须转发所有 TCP 连接。我之前幸运地使用了 privoxy,但它只支持 http 连接。

PS:我在windows上,但是命令应该和linux一样

socat
  • 1 个回答
  • 35738 Views
Martin Hope
djangofan
Asked: 2010-04-03 14:05:23 +0800 CST

是否可以使用 Netcat/Socat 创建 Web 浏览器代理隧道?

  • 1

关于 Netcat/Socat 实用程序。从手册页来看,似乎可以使用 netcat 创建一个安全代理,通过它我可以将我的网络浏览器指向一个代理服务器,这可以通过代理分叉/驱动我的网络流量。这可能吗?关于如何做到这一点的任何提示?Windows 上的 Socat 是可取的,但 linux 上的 netcat 还可以。

http://www.dest-unreach.org/socat/doc/socat.html

netcat socat
  • 1 个回答
  • 5424 Views

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve