2009-12-09 7 views
7

UDPポート162(SNMPトラップ)でリッスンし、このトラフィックを複数のクライアントに転送するサーバーを作りたいと思います。また重要なことは、送信元ポート&のアドレスが同じままである(アドレススプーフィング)ことです。Pythonポート転送/多重化サーバ

私は、このための最良のツールはTwistedまたはScapyまたは多分バニラソケット、 だけ私はソースアドレススプーフィング/鍛造に関するツイストのドキュメントに何かを見つけることができないであろうと推測します。

これにはどのような解決策がありますか?

編集:bounty、mybe iptablesの任意の解決策が追加されましたか?

答えて

5

私はねじれたものやscapyに慣れていませんが、これはバニラのpythonソケットではとても簡単です。それのさらなる利点は、それがさらに移植性があるということです。このコードは、私の限られたテストで動作します。

#!/usr/bin/python 
from socket import * 
bufsize = 1024 # Modify to suit your needs 
targetHost = "somehost.yourdomain.com" 
listenPort = 1123 

def forward(data, port): 
    print "Forwarding: '%s' from port %s" % (data, port) 
    sock = socket(AF_INET, SOCK_DGRAM) 
    sock.bind(("localhost", port)) # Bind to the port data came in on 
    sock.sendto(data, (targetHost, listenPort)) 

def listen(host, port): 
    listenSocket = socket(AF_INET, SOCK_DGRAM) 
    listenSocket.bind((host, port)) 
    while True: 
     data, addr = listenSocket.recvfrom(bufsize) 
     forward(data, addr[1]) # data and port 

listen("localhost", listenPort) 
+0

私は、サーバーを起点からの送信元アドレスとポートを必要とする質問文の最初の部分に置くことを忘れて一つのこと(そのため、実際にサーバーが偽の送信元アドレスに必要)、これを行うソケットができますか? – Ib33X

+0

いいえ、できません。私はあなたがここで解決しようとしている問題は、いくつかのiptablesのルールによってより良く解決できるかもしれないと思います。どうしてあなたはPythonでそれをしたいのですか? – Benson

+0

ちなみに、パケットヘッダーを捻って偽造できるのであれば、私は非常に驚いています。おそらくあなたの最高の賭けです。私は一見を持って、それがどれほど難しいかを見ます。 – Benson