如何配置 netcat(或其他一些常用的 Linux 实用程序)来监听辅助 IP 地址上的特定端口?

如何配置 netcat(或其他一些常用的 Linux 实用程序)来监听辅助 IP 地址上的特定端口?

CentOS 5.9

为了测试目的,我希望我的 CentOS 服务器监听辅助虚拟 IP(eth0:0)。我对此很熟悉,nc -l -p <port>但它只监听主 IP。有没有办法为监听器指定一个特定的 IP?

如果没有,CentOS 5.9 中是否有其他“库存”实用程序可以做到这一点?

答案1

语法取决于netcat包。

netcat-openbsd:

# General form
nc -l ip port 
# Example
nc -l 192.168.2.1 3000

netcat-传统:

# General form
nc -l -p port -s ip
# Example
nc -l -p 3000 -s 192.168.2.1

在脚本中区分它们的一个简单方法(至少在 bash 中)是:

if ldd $(type -P nc) | grep -q libbsd; then
    nc -l 192.168.2.1 3000
else
    nc -l -p 3000 -s 192.168.2.1
fi

您还可以运行此单行程序来手动检查:

if ldd $(type -P nc) | grep -q libbsd; then echo "netcat-openbsd"; else echo "netcat-traditional"; fi

示例输出将是netcat-traditionalnetcat-openbsd

答案2

为了完整起见,这个命令也应该起作用:

nc -l -p port -s ip

# Example
nc -l -p 3000 -s 192.168.2.1

它适用于nc6版本 1.0 和netcat(GNU Netcat)0.7.1。

来自@Hauke Laging 的命令不适用于nc6(在 Debian 中使用)。

答案3

常规 netcat ( nc) 使用说明,包括设置接收时绑定的 IP 地址或发送时发送到的 IP 地址

这句单行代码(修改自@Hauke Laging 的答案),表明我有netcat-openbsd在 Ubuntu 22.04 上输入:

if ldd $(type -P nc) | grep -q libbsd; then echo "netcat-openbsd"; else echo "netcat-traditional"; fi

我的输出是:

netcat-openbsd

另一种类型,按照 Hauke 的说法,是netcat-传统

查看的最底部man nc,我还可以看到我有 BSD 类型:

BSD March 31, 2021 BSD

在此版本netcat(也可调用为nc)中,以下是在监听和发送时指定 IP 地址的各种方法。

请注意,在所有示例中,您可以将“IP”或“IP 地址”简称为“主机”,无论它是发送还是接收。这样,每个连接的进程都是一个“主机”。

使用常规 netcat 监听命令netcat-openbsd

要监听,请-l在所有命令中使用。请注意,该-s参数指定来源IP 地址,并且此命令样式适用于聆听仅有的。

# -------
# TCP
# - withOUT `-u`
# -------

# General form 1 (netcat-openbsd only)
# - see Hauke's answer: https://serverfault.com/a/512337/357116
nc -l <ip> <port>
# example
nc -l 127.0.0.1 30000

# General form 2 (netcat-traditional-style)
# - see @schlicht's answer: https://serverfault.com/a/765633/357116
nc -l -s <ip> -p <port>
# example
nc -l -s 127.0.0.1 -p 30000

# -------
# UDP
# - just add `-u` to all commands above
# -------

# General form 1 (netcat-openbsd only)
# - see Hauke's answer: https://serverfault.com/a/512337/357116
nc -lu <ip> <port>
# example
nc -lu 127.0.0.1 30000

# General form 2 (netcat-traditional-style)
# - see @schlicht's answer: https://serverfault.com/a/765633/357116
nc -lu -s <ip> -p <port>
# example
nc -lu -s 127.0.0.1 -p 30000

绑定并倾听INADDR_ANY,表示“任何接口主机 IP 地址”,你可以使用 IP 地址0,如下所示:

nc -l 0 30000
# OR
nc -l -s 0 -p 30000

或者更好的是,直接省略要绑定和监听的 IP 地址INADDR_ANY,如下所示:

nc -l 30000
# OR
nc -l -p 30000

常规 netcat 使用以下方式发送命令netcat-openbsd

-l要发送,只需从所有命令中删除。请注意,-s参数指定来源IP 地址,并且此命令样式适用于聆听仅有的。

# -------
# TCP
# - withOUT `-u`
# -------

# General form (netcat-openbsd only)
# - see Hauke's answer: https://serverfault.com/a/512337/357116
nc <ip> <port>
# example
nc 127.0.0.1 30000

# -------
# UDP
# - just add `-u` to all commands above
# -------

# General form (netcat-openbsd only)
# - see Hauke's answer: https://serverfault.com/a/512337/357116
nc -u <ip> <port>
# example
nc -u 127.0.0.1 30000

发送特定的二进制文件,< filename.bin最后使用。

示例:在 IP 地址(进程间通信 (IPC) 环回接口)端口上发送filename.binUDP 数据包:127.0.0.130000

nc -u 127.0.0.1 30000 < filename.bin

请注意,filename.bin此示例中包含一个二进制、打包的 C 结构数据消息,其中包含一些变量,就像您正在编写一个 C 程序以将结构作为 UDP 数据包发送一样。看看它是如何在 C 中生成的,在我的答案底部

发送至INADDR_ANY,意思是“任何接口上的任何 IP 地址”,你可以使用 IP 地址0,像这样:

nc 0 30000

交互式示例

基本 TCP/IP 单个侦听器(服务器)、单个发送器(客户端)

  1. -l在一个终端中,在本地环回接口 (IP 127.0.0.1)、端口上启动 TCP/IP 监听器 ( ) (“服务器”) 30000

    nc -l 127.0.0.1 30000
    
  2. 在另一个终端中,启动交互式 TCP/IP 发送程序(“客户端”),向相同的 IP 和端口发送消息:

    nc 127.0.0.1 30000
    

    现在,输入hey,然后按 Enter 键。您将看到它在发送者的终端中回显,并在接收者的终端中接收并打印。您可以输入更多消息,每输入一条消息后按 Enter 键发送。这就像一个单向聊天程序。

UDP 单个侦听器(服务器),多个发送器(客户端)

  1. 在一个终端中,在本地环回接口(IP )、端口上启动 UDP ( -u) 监听器 ( )(“服务器”) 。传递以使其能够通过在每次接收后再次监听来从多个发送方接收: -l127.0.0.130000-k
    nc -luk 127.0.0.1 30000
    
  2. 在第二个终端中,启动交互式 UDP ( -u) 发送器(“客户端”):
    nc -u 127.0.0.1 30000
    
  3. 在第三个终端中,启动另一个交互式 UDP ( -u) 发送器(“客户端”):
    nc -u 127.0.0.1 30000
    
  4. 现在,您可以反复向上述任一发送方终端输入内容,监听器将打印出从任一发送方接收到的内容。

证明IP地址0,或0.0.0.0,是INADDR_ANY,并且绑定到所有接口(所有接口主机IP地址):

奔跑ifconfig去看看你所有的接口以及它们对应的 IP 地址。我有两个接口:

  1. lo,这是我的虚拟本地“环回”接口,其 IP 地址为127.0.0.1,以及
  2. wlp0s20f3,这是我的无线网卡,有 IP 地址192.168.0.67

我们将在以下命令中使用这些:

基本 TCP/IP 单个侦听器(服务器)绑定到INADDR_ANY(所有接口),发送器(客户端)发送到 IP(主机)127.0.0.1192.168.0.67

在此示例中,我们将监听并绑定到INADDR_ANY,并看到发送到我的任一有效接口主机 IP 地址(127.0.0.1192.168.0.67,如图所示ifconfig)的发送方可以成功连接到此监听器并向其发送消息。

  1. -l在一个终端中,在INADDR_ANY(IP 地址0) 和端口上启动 TCP/IP 监听器 ( ) 30000

    nc -l 0 30000
    
  2. 在第二个终端中,启动一个交互式 TCP/IP 发送程序(“客户端”)到您的本地环回 IP 地址127.0.0.1和端口30000

    nc 127.0.0.1 30000
    

    现在输入hello,然后按 Enter。成功了!即使发送方将数据发送到 IP 地址 ,侦听器也会收到数据127.0.0.1。这是因为侦听器已绑定到INADDR_ANY,这意味着它正在侦听所有接口,以及该接口的每个相应 IP 地址,如 所示ifconfig

  3. 现在使用 Ctrl + C 终止两个进程(注意:如果仅终止发送方,则会同时终止两个进程),然后在终端 1 中重新启动侦听器:

    nc -l 0 30000
    
  4. 在第二个终端中,再次启动发送器,但这次将数据发送到外部无线界面在其主机 IP 地址处192.168.0.67,如上所示ifconfig

    nc 192.168.0.67 30000
    

    输入一个单词并按下 Enter,接收器将再次接收它,因为它正在监听全部活动接口,如 所示ifconfig,因为它绑定到主机 IP 地址,根据惯例,0这与 相同0.0.0.0, 代表。INADDR_ANY

这里需要注意的是,尽管我们将上面的监听器绑定到INADDR_ANY(所有接口),但不是意味着它可以同时有多个连接!它仍然单播,意思是:一对一关系。只是它绑定到所有接口并在所有接口上进行监听,因此客户端可以通过我的两个接口主机 IP 地址中的任意一个连接到此服务器监听器(如 所示)ifconfig,而不是仅通过我必须指定的单个接口主机 IP 地址,在 所示的任何可用接口主机 IP 地址之间进行选择ifconfig

基本 TCP/IP 单个侦听器(服务器)绑定到接口主机 IP 地址127.0.0.1,发送器(客户端)发送到INADDR_ANY(所有接口)

在此示例中,我们将执行上一个示例的反向操作。我们将绑定到特定接口主机 IP 地址并监听该地址,并显示连接到INADDR_ANY(所有接口)并向其发送信息的发送方仍可到达此监听方。

  1. -l在一个终端中,在接口主机 IP 地址127.0.0.1端口上启动 TCP/IP 监听器( ) 30000

    nc -l 127.0.0.1 30000
    
  2. 在第二个终端中,启动一个交互式 TCP/IP 发送程序(“客户端”)到INADDR_ANY(所有接口,以接口主机 IP 地址0或表示0.0.0.0)和端口30000

    nc 0 30000
    # Or
    nc 0.0.0.0 30000
    

    现在输入,然后按 Enter。成功了!即使发送方发送到(所有接口)而不是接口主机 IP 地址 ,hello侦听器也会收到数据。INADDR_ANY127.0.0.1

请注意,如果我监听接口主机 IP 地址192.168.0.62,也就是我的其他接口的主机 IP 地址,如图所示ifconfig,由于某种原因,上述操作确实不是工作。我不知道为什么。也许是 中的一个错误netcat

再次强调,这里需要注意的是,尽管我们发送的是INADDR_ANY(所有接口主机 IP 地址),但不是意味着我们可以同时拥有多个连接!它仍然单播,意思是:一对一关系。TCP/IP 发送方将连接到它能连接的第一个 TCP/IP 侦听器,并只向该连接点发送数据,保持该连接处于活动状态。UDP 将执行相同的操作,充当单播并一次发送到一个 UDP 侦听器,但与 TCP/IP 不同的是,它不会连接,也不会保持任何连接处于活动状态。它只是触发并忘记数据,然后继续前进。

我不知道如何解决哪个如果多个接收器同时监听同一个接口主机 IP 地址和端口,接收器将获取数据。

也可以看看

  1. 有关更多信息以及如何filename.bin从 C 语言中的打包文件生成二进制数据包struct,请参阅此处的问答:当我尝试在嵌入式 Linux 板上使用 netcat 发送 UDP 数据包时出现“连接被拒绝”
  2. 另请参阅我的git 和 Linux cmds、帮助、提示和技巧 - Gabriel.txt在我的笔记文档中eRCaGuy_dotfilesrepo。在其中搜索netcatncsocat

相关内容