[Twisted-Python] Protection against flooding
glyph at twistedmatrix.com
Tue Sep 20 13:29:29 EDT 2011
On Sep 20, 2011, at 8:51 AM, Don Schoeman wrote:
> Hi all,
> Before I start digging in the Twisted code, I'd just like to bump this off you in case the solution is obvious...
> I have a lot of clients having permanent connections to my TCP server. These clients are devices that will buffer data if it can't connect to the server. I can see a possible problem in the future if/when for whatever reason there is downtime on my server or the network and all these devices start connecting and transmitting their buffered data once the server is back up, potentially causing server flooding.
> What would be a good area to start looking into preventing something like this from happening? My first thoughts are to simply limit an X number of new connections per minute (or per X seconds) and to simply immediately drop new connections if it exceeds that limit. (I'd probably implement this on Protocol level). Over time the connections should theoretically normalise as the buffered data on the devices are also limited.
> Of course it would be better to not allow the connections from being established in the first place if the limits are exceeded (will be great for DDOS protection), but I have a feeling that might be difficult to achieve.
> Any thoughts/tips or even links to examples?
My suggestion would be "try it and see what happens". You may be surprised to find that your Twisted app deals with the load just fine. I've seen several applications for which this is the case.
If there really is an issue, a running system will give you a _lot_ more information about what the issue might be than a guess in advance :).
You may rest assured, however, that Twisted has all the APIs you will need to use to shed load, if that is in fact necessary; you can call stopListening() on the Port object that is currently accepting your connections, you can call stopReading() which will take it out of the reactor (but allow the listen queue to continue backing up); you can call pauseProducing() on any connection that is feeding you too much data.
Does this answer your question?
-------------- next part --------------
An HTML attachment was scrubbed...
More information about the Twisted-Python