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

iptables 的 limit 和 connlimit 等模块现在是内置还是需要另外引入?

  •  
  •   itsme · 2015-10-20 23:44:24 +08:00 · 5141 次点击
    这是一个创建于 3351 天前的主题,其中的信息可能已经有所发展或是发生改变。
    百度还是找不到说明。
    自己的 vps 上写相关的规则发现没作用,搞不清是否需要额外引入才能用?
    14 条回复    2015-10-24 11:52:27 +08:00
    ryd994
        1
    ryd994  
       2015-10-21 07:02:00 +08:00 via Android
    iptables-save 看看
    vps 是 openvz 的么
    一般不需要
    michaelOoO
        2
    michaelOoO  
       2015-10-21 08:45:20 +08:00
    itsme
        3
    itsme  
    OP
       2015-10-21 10:05:11 +08:00
    谢谢两位。我对比了几个 vps ,不同 linux 内核版本,使用 iptables 相关含模块的规则,也没报错,估计是内置。不过效果比如 limit 模块,不同 vps 上明显效果不一样,不知道是否内核版本差别。

    我继续学习中。谢谢回复。现在就想怎么对不断开新端口的 BT 连接进行限制。我看到一个 ip 应该用了 BT ,随机占用端口 2xxxx 开始到 5xxxx ,嗯, ss 的连接,不知道只能有效阻止这种。
    fredcc
        4
    fredcc  
       2015-10-21 10:06:05 +08:00 via Android
    我想说 7 开始已经不用 iptables 了
    coreos
        5
    coreos  
       2015-10-21 11:04:21 +08:00
    内核编绎可选
    datocp
        6
    datocp  
       2015-10-21 12:33:34 +08:00 via Android
    limit 肯定比 connlimit 好, connlimit 实际测试在打开网页方面会导致断开白页。但是这属于全局限制,需要具体指定 ip ,用 hashlimit 吧,可以通过限制并发来限制流量。更高级的有 quota 。
    itsme
        7
    itsme  
    OP
       2015-10-21 18:22:31 +08:00
    @datocp quota 我也用了,流量能限制住,但是速度限不了,我那个 vps , hk 的带宽很小峰值 3M ,如果有一个人下载, ping 这个 vps 就可能几百上千的 ms 值了。
    connlimit 我目前是想限制住 bt 程序的连接数量,超过 50 就 drop ;
    limit 我是想用来限制下速度,不过在不同 vps 上,效果不太一样。不清楚原因了。
    datocp
        8
    datocp  
       2015-10-21 18:57:38 +08:00
    比较理想的是用 tc ,不过 vps 不支持。
    connlimit 一直没有好的印象,容易导致网络中断,像打开网页时突然就是白屏页面,在第三方固件和 ros 上测试过,印象一直不好, vps 上还没实际应用过。

    limit 是需要一个具体 ip 才能实现效果的,所以如果仅仅使用 limit 需要不断的侦测源 /目的 ip ,然后用脚本动态调用 iptables 进行插值处理才能针对特定 ip 实现连接数匹配,而 hashlimit 则是个增强版至少解决前面这些过程。


    -A INPUT -p tcp -m multiport --dport 80,1723,8080,8443,8843 -m hashlimit --hashlimit-name obfs --hashlimit 80/sec --hashlimit-burst 350 --hashlimit-mode srcip,srcport --hashlimit-htable-expire 300000 -j ACCEPT
    -A INPUT -p tcp -m multiport --dport 80,1723,8080,8443,8843 -j REJECT

    这个 hashlimit 由于是用令牌筒概念实现的,所以匹配的每秒数据包通过数量就有多有少,造成流量的不精确,效果肯定是不如 tc 的。有时候没有别的方法也只能根据 tcp 握手的过程,通过限制数据包来达到限制流量的过程。
    itsme
        9
    itsme  
    OP
       2015-10-22 10:08:24 +08:00
    @datocp 你楼上的例子 80/sec --hashlimit-burst 350 这些数字的单位是 packets 包?
    实际就是 1500x80=120000bytes 最高峰值可以 1500x350=512K 是大概这意思吧

    我现在最想解决就是限制 BT 程序通过 SS ,我发现 BT 程序会不断的请求端口, tail ss 的日志,会发现连续不断请求,我曾经观察过请求的端口号从 20000 多一直到 50000 多, ss 里面我不知道如何限制。所以想看 iptables 是否可以阻止这种情况。
    itsme
        10
    itsme  
    OP
       2015-10-22 19:23:08 +08:00
    @datocp 我尝试用下面两种,都限制不了 4011 4016 两个端口的速度。我分开写,就是一次写一个端口号也不行。改限制到 OUTPUT ,同样也限制不到速度。 y2b 播放就是直接满速占用 vps 带宽。

    iptables -A INPUT -p tcp -m multiport --dport 4011,4016 -m hashlimit --hashlimit-name portslimit --hashlimit 80/sec --hashlimit-burst 100 --hashlimit-mode srcport --hashlimit-htable-expire 300000 -j ACCEPT
    iptables -A INPUT -p tcp -m multiport --dport 4011,4016 -j REJECT

    iptables -A INPUT -p tcp --dport 4011 -m limit --limit 80/s --limit-burst 100 -j ACCEPT
    iptables -A INPUT -p tcp --dport 4011 -j DROP
    datocp
        11
    datocp  
       2015-10-22 19:37:44 +08:00
    limit 的原理是匹配每秒通过的数据包,根据 tcp 握手的过程通过限制源数据包的数量来同时限制返回的数据包数量,所以原则上不是用来限制流量用途的。一般能调节的就是--hashlimit-burst 100 突发最高可以通过 100 包,然后不断的减少直到 0 ,而 hashlimit 80/sec 是用来产生多少包来补偿--hashlimit-burst 100 减少的,但最高也只能到 100 ,所以它不是用来限流量的,只是因为限制并发而连带的抑制流量过程。

    我那两句用 wget 测试的时候, wget 属于单线程可以将流量限制在 200kb-1mb 之间。也许你应该用-hashlimit-mode srcip 限制每 ip ,然后调整 80/sec 为 40/sec 。然后再试试。
    itsme
        12
    itsme  
    OP
       2015-10-23 01:33:39 +08:00
    @datocp 谢谢详细说明。我再去调整测试下。除了 tc (似乎很复杂,而且 vps 估计用不了),应该也就 iptables 能稍微限制一下速度了吧。
    itsme
        13
    itsme  
    OP
       2015-10-24 10:57:35 +08:00
    @datocp -m multiport 使用这个 match 后,后面的--hashlimit 80/sec --hashlimit-burst 100 ,这个数是对于之前 multiport 列举的每个端口都是这个值还是之前列举端口的总和?

    感觉有点像是端口合计。又有点不确定。
    datocp
        14
    datocp  
       2015-10-24 11:52:27 +08:00
    这个 hashlimit 我也研究得少,不知道如何进行测试。你可以通过 hashlimit-name portslimit
    通过 cat /proc/net/ipt_hashlimit/portslimit 看看。它的本意做为 limit 的增强版本匹配每个源 ip ,但是多了 srcip srcport dstip dstport 我也答不上来了。。。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   6091 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 02:32 · PVG 10:32 · LAX 18:32 · JFK 21:32
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.