【问题标题】:Python Twisted: How use HTB rate-limiting with UDP ProtocolPython Twisted:如何通过 UDP 协议使用 HTB 速率限制
【发布时间】:2019-09-09 22:20:07
【问题描述】:

我有一个 DNS 服务器,我想在其上添加一些速率限制,因为我收到了大量的查询。

我阅读了https://github.com/racker/python-twisted-core/blob/master/doc/examples/shaper.py 并根据我的需要对其进行了调整:

from twisted.internet import reactor, protocol
from twisted.protocols import htb

udpBucket = htb.Bucket()
udpBucket.maxburst = 100000 # 1000 kb/s
udpBucket.rate     = 100000 # 1000 kb/s thereafter 

udpFilter = htb.HierarchicalBucketFilter()
udpFilter.buckets[None] = udpBucket

class DNSClientBucket(htb.Bucket):
  maxburst = 10000 # 10 kb/s
  rate     =  1000 #  1 kb/s thereafter

udpFilter2 = htb.FilterByHost(udpFilter)
udpFilter2.bucketFactory = DNSClientBucket

class DnsUdpProtocol(protocol.Protocol):
  def datagramReceived(self, data, client):
    print(data)

dns_udp_protocol = DnsUdpProtocol()
dns_udp_protocol = htb.ShapedProtocolFactory(dns_udp_protocol, udpFilter2)

dns_udp_interface   = socket.gethostbyname(socket.gethostname())
dns_udp_server_port = 53
reactor.listenUDP(port=dns_udp_server_port, protocol=dns_udp_protocol, interface=dns_udp_interface)

但我得到以下异常:

Traceback (most recent call last):
  File "server.py", line 263, in <module>
    reactor.listenUDP(port=dns_udp_server_port, protocol=dns_udp_protocol, interface=dns_udp_interface)
  File "/usr/lib/python3.7/site-packages/twisted/internet/posixbase.py", line 369, in listenUDP
    p.startListening()
  File "/usr/lib/python3.7/site-packages/twisted/internet/udp.py", line 179, in startListening
    self._connectToProtocol()
  File "/usr/lib/python3.7/site-packages/twisted/internet/udp.py", line 217, in _connectToProtocol
    self.protocol.makeConnection(self)
AttributeError: 'ShapedProtocolFactory' object has no attribute 'makeConnection'

甚至可以将twisted.protocols.htb 与UDP 协议一起使用吗?

【问题讨论】:

  • 我不知道这个工具,但是因为它是一个工厂(并且按照你添加的链接),你不应该先调用它来创建一个协议实例吗?试试htb.ShapedProtocolFactory(dns_udp_protocol, udpFilter2)()

标签: python udp twisted rate-limiting trafficshaping


【解决方案1】:

可能不会。 Twisted 中的 HTB 用于面向流的套接字,而不是面向数据报的套接字,如 UDP。

此外,Twisted 中的 HTB 可能非常粗略,即使就其预期目的而言也是如此。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-08-09
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2021-03-15
    • 2012-08-10
    相关资源
    最近更新 更多