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
    • 最新
    • 标签
主页 / unix / 问题 / 420570
Accepted
berndbausch
berndbausch
Asked: 2018-01-30 19:08:39 +0800 CST2018-01-30 19:08:39 +0800 CST 2018-01-30 19:08:39 +0800 CST

尽管进程正在侦听,但 UDP 端口无法访问

  • 772

我正在尝试通过 UDP 端口 6666 进行通信(目标是为 netconsole 设置一个侦听器,但这在这里并不重要)。

在听力方面,nc -luv 6666. 在发送方,nc -uv LISTENER_IP 6666. 我可以发送和接收,生活是美好的。

现在我让监听器运行,但杀死发送者并启动另一个发送者。它立即终止。网络跟踪显示接收服务器发送了一个ICMP Port Unreachable。但是,听众仍然在听:

$ sudo ss -nlup|grep 6666
UNCONN     0      0           :::6666                    :::*                   users:(("nc",pid=3417,fd=3))

我杀死接收器并运行一个新的。在我杀死发件人之前,一切都像以前一样工作。

发送者和接收者是同一网络上的物理机器。物理机和在其上运行的 VM 之间的相同测试会产生相同的结果。

如何解释这种行为?

netcat udp
  • 1 1 个回答
  • 6163 Views

1 个回答

  • Voted
  1. Best Answer
    ErikF
    2018-01-30T21:17:06+08:002018-01-30T21:17:06+08:00

    由于 UDP“连接”的工作方式,这是预期的行为。这在nc6(1)手册页socat(“UDP”)中进行了讨论,但也适用于nc:

    netcat6 中的 UDP 支持在连接和侦听模式下都非常有效。在侦听模式下使用 UDP 时,netcat6 接受来自与指定的可选地址和/或端口(如果已指定)匹配的任何源的 UDP 数据包。但是,一旦收到第一个数据包,netcat6 以后将只接收来自该客户端的数据包。这是通过将 UDP 套接字置于“已连接”状态来完成的(参见 udp(4) 和 connect(2))。来自其他来源的数据包被内核丢弃,并发送 ICMP 不可达响应。

    当使用 UDP 连接到远程主机时,nc6 将报告连接已打开,无论远程服务器是否正在侦听。这是因为 UDP 是无连接协议,因此实际上不需要建立连接。但是,在发送第一个数据包后,服务器可能会回复一个 ICMP 不可达响应,导致 nc6 退出并显示“连接被拒绝”错误消息。

    当您从发送方连接时,会选择一个随机的 UDP 源端口。接收器然后绑定到该特定host:port对,并且从那时起将不会监听任何其他连接。要解决这个问题,您需要强制发送方始终使用相同的端口。我用于socat这个例子是因为它更容易做到:

    听众:

    # socat -d -d UDP-LISTEN:6666 stdout
    2018/01/29 22:02:02 socat[20969] N listening on UDP AF=2 0.0.0.0:6666
    2018/01/29 22:02:07 socat[20969] N accepting UDP connection from AF=2 10.100.0.5:39000
    2018/01/29 22:02:07 socat[20969] N using stdout for reading and writing
    2018/01/29 22:02:07 socat[20969] N starting data transfer loop with FDs [5,5] and [1,1]
    hello
    bye
    hello1
    bye1
    

    发件人:

    # socat -d -d stdin UDP:listener-host:6666
    2018/01/29 22:01:56 socat[8237] N using stdin for reading and writing
    2018/01/29 22:01:56 socat[8237] N opening connection to AF=2 10.100.0.3:6666
    2018/01/29 22:01:56 socat[8237] N successfully connected from local address AF=2 10.100.0.5:39000
    2018/01/29 22:01:56 socat[8237] N starting data transfer loop with FDs [0,0] and [5,5]
    hello
    bye
    2018/01/29 22:02:10 socat[8237] N socket 1 (fd 0) is at EOF    
    2018/01/29 22:02:10 socat[8237] N exiting with status 0
    

     

    # socat -d -d stdin UDP:listener-host:6666
    2018/01/29 22:02:13 socat[8238] N using stdin for reading and writing
    2018/01/29 22:02:13 socat[8238] N opening connection to AF=2 10.100.0.3:6666
    2018/01/29 22:02:13 socat[8238] N successfully connected from local address AF=2 10.100.0.5:57125
    2018/01/29 22:02:13 socat[8238] N starting data transfer loop with FDs [0,0] and [5,5]
    hello
    2018/01/29 22:02:16 socat[8238] E read(5, 0x5619f9b09330, 8192): Connection refused
    2018/01/29 22:02:16 socat[8238] N exit(1)
    

     

    # socat -d -d stdin UDP:listener-host:6666,sourceport=39000
    2018/01/29 22:05:17 socat[8280] N using stdin for reading and writing
    2018/01/29 22:05:17 socat[8280] N opening connection to AF=2 10.100.0.3:6666
    2018/01/29 22:05:17 socat[8280] N successfully connected from local address AF=2 10.100.0.5:39000
    2018/01/29 22:05:17 socat[8280] N starting data transfer loop with FDs [0,0] and [5,5]
    hello1
    bye1
    2018/01/29 22:05:23 socat[8280] N socket 1 (fd 0) is at EOF
    2018/01/29 22:05:24 socat[8280] N exiting with status 0
    

    如您所见,发送方的源端口发生了变化,但如果我强制它重用相同的端口,它就可以工作。

    • 3

相关问题

  • GNU Netcat 命令是否与 netcat-openbsd 或 netcat-traditional 相同?

Sidebar

Stats

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

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve