测试UDP端口连接


37

我正在尝试测试是否可以通过UDP到达远程服务器上的特定端口(我都可以访问这两个端口)。

两台服务器都面向互联网。我正在使用netcat监听某个端口。

然后,我使用nmap来检查该端口,以查看其是否打开,但似乎没有打开。

iptables已关闭。

有什么建议为什么可以这样?我最终将要建立一个VPN隧道,但是由于我是隧道的新手,所以我想确保在前进之前先在UDP 1194端口上建立连接。


我已经回答了“测试UDP端口连接”问题。但是我建议专注于更具体的“确保OpenVPN接收我的UDP数据包”部分-通过查看OpenVPN日志可以轻松实现。
Luke404

Answers:


46

没有所谓的“开放” UDP端口,至少在大多数人习惯的意义上(这是在回答诸如“确定,我已经接受您的连接”之类的东西)。UDP是无会话的,因此“端口”(读取:操作系统IP堆栈中的UDP协议)将永远不会自行响应“成功”。

UDP端口只有两种状态:侦听或不侦听。通常将其翻译为“已通过进程在其上打开套接字”或“未打开任何套接字”。后一种情况应易于检测,因为系统应使用代码= 3(端口不可达)的ICMP目标不可达数据包进行响应。不幸的是,许多防火墙可能会丢弃这些数据包,因此,如果您没有收到任何信息,则无法确定端口是否处于此状态。而且,请不要忘记ICMP也是无会话的,并且也不会进行重传:Port Unreachable数据包很可能在网络上的某个地方丢失。

处于“侦听”状态的UDP端口可能根本不响应(正在侦听它的进程只是接收到数据包,并且不传输任何内容),或者它可以将某些内容发回(如果该进程确实在接收时起作用,并且如果它通过以下方式起作用)通过UDP响应原始发件人IP:端口)。再说一遍,如果您什么都还不回来,就永远无法确定状态。

您说您可以控制接收主机:这使您能够构造自己的协议来检查UDP端口的可达性:只需在接收主机上放置一个进程,该进程将侦听给定的UDP端口并进行响应(或将其发送给您)电子邮件,或者只是发疯了,unlink()主机文件系统上的所有内容……都会引起您的注意。


认为我现在已经了解了。因此,具有侦听udp端口的服务器上的netstat永远不会显示远程主机...只有tcpdump应该显示远程请求吗?
锁定

netstat和tcpdump都可以转储您上的数据,后者以更易读的形式。查阅他们的手册页以获取详细信息。
Luke404

56

要测试udp端口是否响应,请使用netcat

手册页中的示例:

nc -v -u -z -w 3 example.host 20-30
    Send UDP packets to ports 20-30 of example.host, and report which ones
    did not respond with an ICMP packet after three seconds.

当然,如果防火墙正在运行DROP(通常是处理面向Internet的网关时的情况),则不会收到ICMP响应。


1
这个回应给了我一个假阳性,相比之下,Sasha的回答恰恰体现了我的期望。
德克萨斯州布罗尼厄斯'17

@德克萨斯州bronius如果你有机会到其他服务器,它可能会更好做萨沙的方式
motobói

27
  1. 两者都在客户端ans服务器上安装nc :( yum install nc用于centos)
  2. 在服务器上监听UDP端口: nc -ul 6111
  3. 在客户端上 nc -u <server> 6111
  4. 在客户端上键入任何内容,然后按Enter键-您应该在服务器上看到此文本

注意:nc -ul服务器上运行命令时,它将在第一个连接进入时才进行连接。正如我发现的那样,您无法在服务器ping通它的服务器之间进行切换而不会停止并重新启动nc -ul。实际上,如果您^ C停止了客户端(nc -u ...),那么您也必须先重新启动服务器侦听器才能重新启动客户端。


1
我喜欢这个聪明的答案,因为它使我对UDP如何“发送并忘记”了自己的理解(和误解!),并且所有确认只能从正确的配置中获得。太多因素。该响应给出了一个非常简单,确定的调用和响应,该调用和响应要么起作用,要么不起作用,更改配置,清除并重复。
德克萨斯州布罗尼厄斯'17

10

使用nmap测试开放的UDP端口充满了风险-没有三路握手来表明开放性。除非侦听进程对nmap发送的内容做出响应,否则nmap无法区分未响应的开放端口和已过滤的端口。

更简单的方法是在一端使用netcat侦听,然后在另一端使用netcat发送数据包,然后查看它们到达另一端。只需确定这两种方式即可。您还tcpdump可以查看数据包到达所需位置。


我明白了。那么nmap到底如何知道一个开放端口?它是否将数据发送到该端口,并且如果收到响应,就被认为是开放的?我将结合使用tcpdump和netcat。感谢您的合理解释。
锁定



1

可以使用netcat(nc)或进行此操作iperf,前提是您有另一台计算机可以在网络外部进行测试。我的选择是nmap从您环境之外的系统进行UDP扫描。您的nmap命令行是什么?混合中是否有任何硬件防火墙或其他设备?


1

我的想法很简单。如果UDP服务器未返回预期的数据,则假设它已关闭,我只是停止收集dgram:

LINE: while(1)
{
    my $line;
    my $flags;

    local $SIG{ALRM} = sub {die "exceeded timeout for recv"};
    alarm 5;
    eval {
        $socket->recv($line,2024,$flags);
    };

    unless($line =~ /\{.*\}/){
        if($verbose){
            print STDERR "Invalid or empty dgram:\n",'"', $line, '"',"\n";
        }

        last LINE;
    }
}
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.