侦听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数据包到该端口。但是这个过程并没有得到消息。
我只是不知道断开连接的位置。我错过了什么?
在此先感谢您的任何见解!
大概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前端。
仍然对我的头撞 - 尝试绑定node.js直接处理eth0的IP地址。同样的结果。还写了一个小型python脚本来侦听UDP数据包,发现它具有与节点相同的行为--tcpdump表示数据包正在通过,但进程没有得到它们。 –
我可能应该发布这一个到serverfault而不是stackoverflow。向系统管理员朋友询问我错过了什么。他提醒我,尽管AWS拥有自己的过滤器,但iptables/netfilter仍然在使用中。 tcpdump的intecepts和日志之前iptables做它的过滤。一些iptables更新和eveything很棒。 –