【问题标题】:How can I drop outbound UDP packets without affecting the sender?如何在不影响发件人的情况下丢弃出站 UDP 数据包?
【发布时间】:2014-10-01 17:04:15
【问题描述】:

我试图抑制出站 UDP 数据包,但不让这些数据包的生产者知道。 我的想法是使用 iptables 像这样丢弃数据包:

iptables -A OUTPUT -p udp -d 127.0.0.1 -j DROP

问题在于发送应用程序从 sendto() 获得 -1 作为返回值,而不是发送的字节数,然后将其作为错误处理。我需要发送应用程序不知道它的输出正在被丢弃。有没有办法做到这一点?

【问题讨论】:

    标签: linux networking iptables


    【解决方案1】:

    如果您知道 UDP 流量的目的地是哪个端口,您可以将它们重定向到 localhost 上的另一个端口,而不是丢弃它们。这样你就可以提供一个监听接收器,它除了接收数据包之外什么都不做。由于数据包现在已交付,尽管不是它们最初的目的地,sendto() 不会返回 -1,而是返回字节数。

    一个 sink 的例子是这样的:

    #!/usr/bin/perl
    
    use IO::Socket::INET;
    
    # flush after every write
    $| = 1;
    
    my $sock;
    my $data;
    
    $socket = new IO::Socket::INET ( LocalPort => '55555', Proto => 'udp',);
    while(1) { $socket->recv($data,1024); }
    $socket->close();
    
    # end of file.
    

    上面的内容将永远幸福地位于端口 55555 上,并且对接收到的数据不做任何事情。接下来的事情是将数据包重定向到指定的端口,将任何发往任何主机的 555 端口改为本地端口 55555:

    iptables -t nat -A OUTPUT -p udp --dport 555 -j DNAT --to-destination 127.0.0.1:55555
    

    使用适当的源/目标地址规范限制上述规则,以防您不想将所有流量重定向到端口 555 的所有目标。

    【讨论】:

    • 谢谢。我尝试通过重写 NAT 表中的目标 IP 来做类似的事情,但它不适用于我的情况,因为它不会影响发送方现有的 UDP 套接字。如果我重新启动发件人,那么数据包会被重定向,但我正在寻找一种方法来打开和关闭它而不影响发件人。
    【解决方案2】:

    Semi 的回答给了我一个可行的想法:首先重定向到不同的端口,然后使用 INPUT 规则丢弃流量(按预期工作)。

    iptables -t nat -A OUTPUT -p udp --dport 555 -j DNAT --to-destination 127.0.0.1:55555
    iptables -I INPUT 1 -p udp --dport 55555 -j DROP
    

    【讨论】:

      【解决方案3】:

      你可以使用nftables:

      nft add table nat
      nft add chain nat drop_my_udp_app {type nat hook output priority 0\;}
      nft add rule nat drop_my_udp_app ip protocol udp udp dport 555 drop
      

      显然删除nat 表(与filter 表不同)不会导致应用程序在sendto(内核版本4.19)期间收到-1 通知。

      如果您有其他 NAT 规则/链,您可能想要调整链优先级。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-24
        • 2014-03-07
        • 1970-01-01
        • 2023-03-15
        • 1970-01-01
        • 2023-03-13
        相关资源
        最近更新 更多