简体   繁体   English

扭曲的Python:如何在UDP协议中使用HTB速率限制

[英]Python Twisted: How use HTB rate-limiting with UDP Protocol

I have a DNS server which I want to add some rate-limiting on, since I'm receiving some bursts of floods of queries. 我有一台DNS服务器,要添加一些速率限制,因为我收到了一些查询洪水。

I read through https://github.com/racker/python-twisted-core/blob/master/doc/examples/shaper.py and adapted it to my needs: 我通读了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)

But I'm getting the following exception: 但是我收到以下异常:

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'

Is it even possible to to use twisted.protocols.htb with the UDP protocol? 甚至可以将twisted.protocols.htb与UDP协议一起使用吗?

Probably not. 可能不是。 HTB in Twisted is for stream-oriented sockets, not for datagram-oriented sockets like UDP. Twisted中的HTB适用于面向流的套接字,不适用于UDP等面向数据报的套接字。

Also, the HTB in Twisted is probably pretty sketchy even for its intended purpose. 同样,即使是用于预期目的的《 Twisted》中的HTB可能也很粗略。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM