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-traditional
或netcat-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.bin
UDP 数据包:127.0.0.1
30000
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 单个侦听器(服务器)、单个发送器(客户端)
-l
在一个终端中,在本地环回接口 (IP127.0.0.1
)、端口上启动 TCP/IP 监听器 ( ) (“服务器”)30000
:nc -l 127.0.0.1 30000
在另一个终端中,启动交互式 TCP/IP 发送程序(“客户端”),向相同的 IP 和端口发送消息:
nc 127.0.0.1 30000
现在,输入
hey
,然后按 Enter 键。您将看到它在发送者的终端中回显,并在接收者的终端中接收并打印。您可以输入更多消息,每输入一条消息后按 Enter 键发送。这就像一个单向聊天程序。
UDP 单个侦听器(服务器),多个发送器(客户端)
- 在一个终端中,在本地环回接口(IP )、端口上启动 UDP (
-u
) 监听器 ( )(“服务器”) 。传递以使其能够通过在每次接收后再次监听来从多个发送方接收:-l
127.0.0.1
30000
-k
nc -luk 127.0.0.1 30000
- 在第二个终端中,启动交互式 UDP (
-u
) 发送器(“客户端”):nc -u 127.0.0.1 30000
- 在第三个终端中,启动另一个交互式 UDP (
-u
) 发送器(“客户端”):nc -u 127.0.0.1 30000
- 现在,您可以反复向上述任一发送方终端输入内容,监听器将打印出从任一发送方接收到的内容。
证明IP地址0
,或0.0.0.0
,是INADDR_ANY
,并且绑定到所有接口(所有接口主机IP地址):
奔跑ifconfig
去看看你所有的接口以及它们对应的 IP 地址。我有两个接口:
lo
,这是我的虚拟本地“环回”接口,其 IP 地址为127.0.0.1
,以及wlp0s20f3
,这是我的无线网卡,有 IP 地址192.168.0.67
。
我们将在以下命令中使用这些:
基本 TCP/IP 单个侦听器(服务器)绑定到INADDR_ANY
(所有接口),发送器(客户端)发送到 IP(主机)127.0.0.1
或192.168.0.67
在此示例中,我们将监听并绑定到INADDR_ANY
,并看到发送到我的任一有效接口主机 IP 地址(127.0.0.1
或192.168.0.67
,如图所示ifconfig
)的发送方可以成功连接到此监听器并向其发送消息。
-l
在一个终端中,在INADDR_ANY
(IP 地址0
) 和端口上启动 TCP/IP 监听器 ( )30000
:nc -l 0 30000
在第二个终端中,启动一个交互式 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
。现在使用 Ctrl + C 终止两个进程(注意:如果仅终止发送方,则会同时终止两个进程),然后在终端 1 中重新启动侦听器:
nc -l 0 30000
在第二个终端中,再次启动发送器,但这次将数据发送到外部无线界面在其主机 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
(所有接口)并向其发送信息的发送方仍可到达此监听方。
-l
在一个终端中,在接口主机 IP 地址127.0.0.1
端口上启动 TCP/IP 监听器( )30000
:nc -l 127.0.0.1 30000
在第二个终端中,启动一个交互式 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_ANY
127.0.0.1
请注意,如果我监听接口主机 IP 地址192.168.0.62
,也就是我的其他接口的主机 IP 地址,如图所示ifconfig
,由于某种原因,上述操作确实不是工作。我不知道为什么。也许是 中的一个错误netcat
。
再次强调,这里需要注意的是,尽管我们发送的是INADDR_ANY
(所有接口主机 IP 地址),但不是意味着我们可以同时拥有多个连接!它仍然单播,意思是:一对一关系。TCP/IP 发送方将连接到它能连接的第一个 TCP/IP 侦听器,并只向该连接点发送数据,保持该连接处于活动状态。UDP 将执行相同的操作,充当单播并一次发送到一个 UDP 侦听器,但与 TCP/IP 不同的是,它不会连接,也不会保持任何连接处于活动状态。它只是触发并忘记数据,然后继续前进。
我不知道如何解决哪个如果多个接收器同时监听同一个接口主机 IP 地址和端口,接收器将获取数据。
也可以看看
- 有关更多信息以及如何
filename.bin
从 C 语言中的打包文件生成二进制数据包struct
,请参阅此处的问答:当我尝试在嵌入式 Linux 板上使用 netcat 发送 UDP 数据包时出现“连接被拒绝”。 - 另请参阅我的git 和 Linux cmds、帮助、提示和技巧 - Gabriel.txt在我的笔记文档中eRCaGuy_dotfilesrepo。在其中搜索
netcat
、nc
和socat
。