9

この記事で概説されている原則を使用して、Python 3 でファイアウォール用の基本的な TCP ホール パンチャーを作成しようとしました。しかし、何かを接続するのに問題があります。コードは次のとおりです。

#!/usr/bin/python3

import sys
import socket
import _thread as thread

def client():
    c = socket.socket()

    c.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    c.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)

    c.bind((socket.gethostbyname(socket.gethostname()), int(sys.argv[3])))
    while(c.connect_ex((sys.argv[1], int(sys.argv[2])))):
        pass
    print("connected!")
    thread.interrupt_main()

def server():
    c = socket.socket()

    c.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    c.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEPORT, 1)

    c.bind((socket.gethostbyname(socket.gethostname()), int(sys.argv[3])))
    c.listen(5)
    c.accept()
    print("connected!")
    thread.interrupt_main()

def main():
    thread.start_new_thread(client, ())
    thread.start_new_thread(server, ())

    while True:
        pass

if __name__ == '__main__':
    main()

両方のインスタンスから送信されたすべてのトラフィックをキャプチャできるように、ローカル マシンでパンチャーを試すことにしました。最初にループバック ファイアウォールを設定しました。

iptables -A INPUT -i lo -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i lo -j DROP

次に、スクリプトの 2 つのコピーを起動しました。

left$ ./tcphole.py localhost 20012 20011

right$ ./tcphole.py localhost 20011 20012

Wireshark によると、SYN パケットが双方向に送信されていることがわかります。

Wireshark キャプチャ

しかし、「接続済み」と表示されるものはありません。私は何を間違っていますか?

4

1 に答える 1

6

答えは非常に単純であることが判明しました。同じ IP アドレスに到達しない場合、パケットは考慮されません!RELATED

bind行を次のように変更します

c.bind('', int(sys.argv[3])))

''ループバックアドレスへのバインド)は問題を完全に修正します。

于 2014-04-23T19:50:19.633 に答える