侦听UDP的Node.js服务器。 Tcpdump表示数据包正在通过,但节点不会收到它们

问题描述:

与合作伙伴集成。我们的服务器有一个宁静的界面,但是他们的产品发出一串UDP数据包。由于我们仍在进行原型设计,因此我不希望对API服务器repo进行任何提交以适应更改。相反,我写了一个小的node.js服务器来侦听他们的UDP数据包,做一些转换,然后把它们放到我们宁静的服务器上。侦听UDP的Node.js服务器。 Tcpdump表示数据包正在通过,但节点不会收到它们

我被卡住了,因为node.js进程正在侦听端口17270,但没有收到我的任何示例UDP数据包。

节点服务器

const dgram = require('dgram'); 
const server = dgram.createSocket('udp4'); 

server.on('error', function(err) { 
    console.log('server error:\n' + err.stack); 
}); 

server.on('message', function(msg, rinfo) { 
    console.log('Server got UDP packet: ' + msg + ' from ' + rinfo.address + ':' + rinfo.port + ''); 
    doBusinessLogic(msg); 
}); 

server.on('listening', function() { 
    var address = server.address(); 
    console.log('Server listening for UDP ' + address.address + ':' + address.port + ''); 
}); 

function main() { 
    server.bind(17270); 
} 
main(); 

当我使用netcat的从我的本地机器发送一个UDP包,

echo -n "udp content" | nc -vv4u -w1 ec2.instance 17270 

我什么也看不到与服务器发生。

我可以在本地运行我的node.js服务器,它响应发送到127.0.0.1的UDP数据包。 我也可以ssh进入ec2实例,并将netcat的UDP包发送到127.0.0.1。这也产生了预期的反应。

所以这个问题一定是网络化,我想。

当我在EC2实例运行netstat,我可以看到,节点正在侦听端口17270.

# netstat -plun 
Active Internet connections (only servers) 
Proto Recv-Q Send-Q Local Address    Foreign Address    State  PID/Program name 
udp  0  0 0.0.0.0:17270    0.0.0.0:*        21308/node 

我想这可能是AWS的安全设置,但是当我在EC2实例上运行tcpdump和然后从我的本地机器触发netcat,我可以看到ec2实例上收到了流量。

# tcpdump -vv -i any udp 
15:09:52.276786 IP (tos 0x8, ttl 38, id 1756, offset 0, flags [none], proto UDP (17), length 29) 
    my.local.machine.60924 > ec2.instance.17270: [udp sum ok] UDP, length 1 
15:09:52.276852 IP (tos 0x8, ttl 38, id 48463, offset 0, flags [none], proto UDP (17), length 29) 
    my.local.machine.60924 > ec2.instance.17270: [udp sum ok] UDP, length 1 
15:09:52.276863 IP (tos 0x8, ttl 38, id 31296, offset 0, flags [none], proto UDP (17), length 29) 
    my.local.machine.60924 > ec2.instance.17270: [udp sum ok] UDP, length 1 
15:09:52.278461 IP (tos 0x8, ttl 38, id 50202, offset 0, flags [none], proto UDP (17), length 29) 
    my.local.machine.60924 > ec2.instance.17270: [udp sum ok] UDP, length 1 
15:09:52.289575 IP (tos 0x8, ttl 38, id 49316, offset 0, flags [none], proto UDP (17), length 149) 
    my.local.machine.60924 > ec2.instance.17270: [udp sum ok] UDP, length 121 

只是可以肯定,我尝试暂时关闭端口17270在AWS控制台。如果我这样做,这些数据包将被丢弃,我不会看到来自tcpdump的任何信息。所以我重新开放了这个港口。

我有一个正在监听端口的进程。我明确发送UDP数据包到该端口。但是这个过程并没有得到消息。

我只是不知道断开连接的位置。我错过了什么?

在此先感谢您的任何见解!

+0

仍然对我的头撞 - 尝试绑定node.js直接处理eth0的IP地址。同样的结果。还写了一个小型python脚本来侦听UDP数据包,发现它具有与节点相同的行为--tcpdump表示数据包正在通过,但进程没有得到它们。 –

+0

我可能应该发布这一个到serverfault而不是*。向系统管理员朋友询问我错过了什么。他提醒我,尽管AWS拥有自己的过滤器,但iptables/netfilter仍然在使用中。 tcpdump的intecepts和日志之前iptables做它的过滤。一些iptables更新和eveything很棒。 –

大概iptables在猜测。数据包与iptables分开,它与iptables分开(tcpdump用来查看传入流量),所以可以通过tcpdump查看它们,只有让iptables在离开内核之前将它们放到应用程序中。在'iptables -nvL'的输出中查找相关输入链上的默认丢弃/拒绝策略或专门丢弃UDP流量的规则。

至于修复它,如果是这样的话,这取决于你正在使用哪个发行版。在过去,你只希望使用iptables命令,像这样的东西(但有关链名称,而不是输入):

的iptables -A INPUT -p UDP --dport 17270 -j ACCEPT

...但是如果你使用的是Ubuntu,他们希望你使用他们的ufw工具 这个,如果它是CentOS/RHEL 7,你可能会处理firewalld和它的防火墙cmd前端。