Python Twisted: restreindre l'accès par adresse IP
Question
Quelle serait la meilleure méthode pour restreindre l'accès à mon serveur XMLRPC par adresse IP? Je vois la classe CGIScript dans web / twcgi.py a une méthode render qui accède à la demande ... mais je ne suis pas sûr de savoir comment accéder à cette demande dans mon serveur. J'ai vu un exemple où quelqu'un patché twcgi.py pour définir des variables d'environnement, puis dans l'accès au serveur les variables d'environnement ... mais je me dis que il doit y avoir une meilleure solution.
Merci.
La solution
Quand une connexion est établie, est appelée buildProtocol d'une usine pour créer une nouvelle instance de protocole pour gérer cette connexion. buildProtocol est passée l'adresse du pair qui a établi la connexion et buildProtocol peut retourner Aucun d'avoir la connexion fermée immédiatement.
Ainsi, par exemple, vous pouvez écrire une usine comme ceci:
from twisted.internet.protocol import ServerFactory
class LocalOnlyFactory(ServerFactory):
def buildProtocol(self, addr):
if addr.host == "127.0.0.1":
return ServerFactory.buildProtocol(self, addr)
return None
Et seules les connexions locales seront traitées (mais toutes les connexions seront toujours acceptées au départ, puisque vous devez les accepter d'apprendre ce que l'adresse de pairs est).
Vous pouvez l'appliquer à l'usine que vous utilisez pour servir les ressources XML-RPC. Juste sous-classe de cette usine et la logique ajouter comme celui-ci (ou vous pouvez faire un emballage au lieu d'une sous-classe).
iptables ou un autre pare-feu de la plate-forme est aussi une bonne idée pour certains cas, cependant. Avec cette approche, votre processus n'a jamais même pour voir la tentative de connexion.
Autres conseils
D'accord, une autre réponse est d'obtenir l'adresse IP de transport, à l'intérieur de tout protocole:
d = href="http://twistedmatrix.com/documents/current/api/twisted.internet.interfaces.ITCPTransport.html#getHost" rel="nofollow noreferrer"> self.transport.getHost
() ; print d.type, d.host, d.port
Ensuite, utilisez la valeur pour filtrer de quelque façon que vous voulez.
J'utilise un pare-feu sur les fenêtres, ou iptables
sur linux.