V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Distributions
Ubuntu
Fedora
CentOS
中文资源站
网易开源镜像站
bibiisme
V2EX  ›  Linux

udp 有限制端口最大会话数的 iptables 命令吗?

  •  
  •   bibiisme · 2023-04-18 20:41:53 +08:00 · 2211 次点击
    这是一个创建于 582 天前的主题,其中的信息可能已经有所发展或是发生改变。
    最近在玩 qos ,tcp 的话有 connlimit ,比如下面这个对多线程 tcp 进行标记送去相应的 qos 命令。
    iptables -t mangle -A FORWARD -d 192.168.6.1/24 -p tcp --sport 1:65535 -m connlimit --connlimit-above 4 --connlimit-saddr -j MARK --set-mark 1
    iptables -t mangle -A FORWARD -s 192.168.6.1/24 -p tcp --dport 1:65535 -m connlimit --connlimit-above 4 --connlimit-daddr -j MARK --set-mark 9

    udp 的话,主要想限制 bt 。游戏 udp 还好,可以用包大小匹配,但是 qq 视频这种和 bt 实在不知道咋区分。就两种思路:
    1.类似上面的 tcp 命令,局域网主机某个端口如果同时收到许多 ip 的数据则进行标记,但查了一圈没找到 udp 如何实现。
    2.将视频通话的 udp 单独标记,但不知道这种数据包有啥特征。

    请问各位有什么想法吗?
    18 条回复    2023-04-20 12:05:47 +08:00
    pagxir
        1
    pagxir  
       2023-04-18 20:48:00 +08:00
    UDP 没有连接的概念。所以你的先把 UDP 会话给定义出来。
    learningman
        2
    learningman  
       2023-04-18 20:55:13 +08:00 via Android
    不上 DPI 不可能
    bibiisme
        3
    bibiisme  
    OP
       2023-04-18 21:30:47 +08:00
    @pagxir 是的,所以我没说连接,说的会话,指 conntrack 里面看到的那组信息。
    tomychen
        4
    tomychen  
       2023-04-18 22:13:02 +08:00
    #2 说的 DPI 是一解法 参考 openDPI

    或者 L7 filter ,相当于 iptables 的一个补丁? 我在上古内核版本内核试着装过

    无论是,bt ,视频流,要识别就已经脱离了 iptables 的范畴了,因为它是(ip)tables ,不是 packet filter

    当然,也有抖机灵的办法,比如--string 里去匹配一些关键字.
    bibiisme
        5
    bibiisme  
    OP
       2023-04-18 22:38:17 +08:00
    @tomychen bt 我发现的特征就是会有很多外部 ip 连接主机特定端口,可惜 udp 没有类似 connlimit 的工具
    tomychen
        6
    tomychen  
       2023-04-18 23:06:50 +08:00
    哈哈,因为 UDP 没有 CONN ,当然也就不能用这套,我忘了你是要做 QoS ,我以为你想 block 来着。

    刚刚去瞄了一眼 openwrt 的作法,用的也是 layer7.

    但是在 gentoo 的论坛发现一个可以借 tc 完成,倒也挺有意思

    https://forums.gentoo.org/viewtopic-t-926236-start-0.html
    bibiisme
        7
    bibiisme  
    OP
       2023-04-18 23:56:06 +08:00
    @tomychen

    感谢。不过 tc 这部分我这里暂时用不着,在测硬路由的硬件 qos 。qos 硬件是根据收到的包带的 mark 来设置 qos 等级的。
    现在是普通 udp 和 1 楼的>4 线程 tcp 最小 mark ,<=4 线程 tcp 中等 mark ,udp 小包最大 mark 。
    udp 视频和 bt 下载看来通过 iptables 是区分不了了。
    datocp
        8
    datocp  
       2023-04-19 00:26:34 +08:00 via Android
    嘿嘿,竟然看不懂

    Qos 实现的是 htb 的 prio 优先级,不是并发数仰制。当然当年在 8mbps 的宽带依然需要用 iptables limit 抑制迅雷才能让网络正常,主要是带宽并发数有限。

    https://wiki.dd-wrt.com/wiki/index.php/Preventing_Brute_Force_Attacks

    保障高优先级端口,抑制其它端口 limit 更平滑不会出现打开网页图片有问题的情况。本机这就是 qos 以外的最好方法。

    iptables -N rate_limit
    iptables -F rate_limit
    iptables -A rate_limit -p tcp --dport 22 -m limit --limit 3/min --limit-burst 3 -j ACCEPT
    iptables -A rate_limit -p udp --dport 1194 -m limit --limit 3/min --limit-burst 3 -j ACCEPT
    iptables -A rate_limit -p ICMP --icmp-type echo-request -m limit --limit 3/sec -j ACCEPT
    iptables -A rate_limit -p <protocol> --dport <port> -m limit --limit <x/sec/min/hr> --limit-burst X -j ACCEPT
    iptables -A rate_limit -p ! ICMP -j LOG --log-prefix " Connection dropped!! "
    iptables -A rate_limit -p tcp -j REJECT --reject-with tcp-reset
    iptables -A rate_limit -p udp -j REJECT --reject-with icmp-port-unreachable
    iptables -A rate_limit -j DROP

    在有一定基础以后,用 connbytes 就能 1 秒抓到高流量用户,实现动态 qos ,无视任何 p2p 的存在。

    qos 实现流量和延迟的对比关系,看自己如何平衡。平时都用目的端口实现 prio 优先级控制,通过划分流量到不同 class 实现不同的延迟。真正要保障的也就高优先级的游戏,网页浏览。其它的感受甚微。



    udp_5000:5500,6060,8088_0x10/0xff
    tcp_2099,5222,5223,5060,6060,8088,8393:8400,992,1992,26241_0x10/0xff
    udp_53,123_0x20/0xff
    tcp_22,23,3389,8123_0x20/0xff
    tcp_80,443,1080,1863,8080:8081,12000,14000_0x30/0xff
    udp_500,1701,4000:4030,4500,8000:8001,16285_0x30/0xff
    tcp_20,21,25,143,465,993,1024:65535_0x40/0xff
    udp_1:65535_0x40/0xff
    datocp
        9
    datocp  
       2023-04-19 00:33:16 +08:00 via Android
    玩 linux 路由,qos 最好的参考模板是 tomato qos 。其它的理论名词一大堆,不知所谓。
    bibiisme
        10
    bibiisme  
    OP
       2023-04-19 00:44:53 +08:00
    @datocp

    没打算抑制并发数,现在的策略在 7 楼,只是打算给并发数太多的流量降低优先级。
    测的是 mtk 的硬件 qos ,因为这些流量后面会被硬件加速模块接管并进行 qos ,要在硬件模块接管流量之前按优先级打好 mark ,干不了其他的,只能设置好优先级。
    tomychen
        11
    tomychen  
       2023-04-19 00:55:05 +08:00
    单纯按照流量确实是可以实现的 rate_limit / hashlimit 等

    就是这样就有点模糊,可能会有协议外的误伤。

    但好像又很有道理,目的本身就是 QoS ,又不是协议识别和包过滤。流量大了,就给他弄了。
    bibiisme
        12
    bibiisme  
    OP
       2023-04-19 08:23:48 +08:00
    @tomychen 其实就是流量识别,因为 qos 本身实现我是交给硬件了。。。突然记起来 bt 下载的时候,这些软件会通过 upnp 开启端口转发。看看后面改下 upnp ,在 upnp 加端口转发规则的时候,同时给到这台主机端口的流量打上对应的 mark ?
    leonshaw
        13
    leonshaw  
       2023-04-19 08:46:17 +08:00 via Android
    nft 的 meter 和 ct count 能满足需求吗?
    hrMn23lO4Ds226CV
        14
    hrMn23lO4Ds226CV  
       2023-04-19 10:37:26 +08:00
    有些 BT 软件会自己打 LE 标 然后直接读它
    iptables -t mangle -A POSTROUTING -o pppoe-CU -m tos --tos 0x04/0xfc -j CLASSIFY --set-class 1:8
    或者你自己打标
    iptables -t mangle -A OUTPUT --protocol udp --sport 6881 -j DSCP --set-dscp-class LE
    Windows 也可以用组策略的 QoS 指定程序数据包标记 IP 协议层的标记读起来应该比较快 也可后续映射到 802.1p
    Juszoe
        15
    Juszoe  
       2023-04-19 12:13:56 +08:00
    我也有 qos 需求,正在考虑使用集成度高的软路由实现,之前用过爱快是能识别 BT 流量的
    bibiisme
        16
    bibiisme  
    OP
       2023-04-19 14:13:49 +08:00
    @OneOfSisters 刚才去瞅了下 openwrt 上 miniupnpd 的代码,发现里面有 dscp 的相关信息,不过貌似基本没人提这个。
    bibiisme
        17
    bibiisme  
    OP
       2023-04-19 19:11:28 +08:00
    @OneOfSisters 不过倒提醒我,尝试改了下路由器上的 upnp 源码,统一给映射的端口打上 dscp 0x2 ,现在能进一步区分 p2p 流量了。

    https://github.com/padavanonly/packages/blob/openwrt-18.06/net/miniupnpd/patches/109-dscp.patch
    bibiisme
        18
    bibiisme  
    OP
       2023-04-20 12:05:47 +08:00
    @tomychen 其实我的目的是分流打 mark ,qos 属于硬件的事了。暂时通过路由器的 upnp 这玩意来设定 dscp
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3172 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 13:30 · PVG 21:30 · LAX 05:30 · JFK 08:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.