Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

別のIPアドレス間でUDPパケットのやりとりを行う

実際のところ

受け手側ファイヤウォール

まず、受信側のファイヤウォール設定を。
普段SSH用に22番しか開けてませんが、今回は1111をUDP用に開けてみます。

$ sudo ufw allow 1111
$ sudo ufw status
Status: active

To                         Action      From
--                         ------      ----
22                         LIMIT       Anywhere                  
1111                       ALLOW       Anywhere                  
22 (v6)                    LIMIT       Anywhere (v6)             
1111 (v6)                  ALLOW       Anywhere (v6)     

受け手スクリプト

受け手スクリプトはおなじみsocatで。
ポートは1111にしましたが、ブッキングしない範囲でお好みで。
hex値を吐き出すので、hexdumpを繋いでみます

$ socat UDP-LISTEN:1111 STDOUT | hexdump

送信スクリプト

送信側はpythonスクリプトでやってみます。
受信側と送信側のIPとポートを予め抑えておきます。
私は面倒なのでやりませんでしたが、別ファイルにして読み込めば可搬性も上がるでしょう。

from socket import *

## UDP送信クラス
class udpsend():
    def __init__(self):

        SrcIP = SRCIP                            # 送信元IP
        SrcPort = SRCPORT                 # 送信元ポート番号
        self.SrcAddr = (SrcIP,SrcPort) # アドレスをtupleに格納

        DstIP = DISTIP                            # 宛先IP
        DstPort = DISTPORT                 # 宛先ポート番号
        self.DstAddr = (DstIP,DstPort) # アドレスをtupleに格納

        self.udpClntSock = socket(AF_INET, SOCK_DGRAM)  # ソケット作成
        self.udpClntSock.bind(self.SrcAddr)             # 送信元アドレスでバインド

    def send(self):
        data = b"\x80\x00\x02"

        self.udpClntSock.sendto(data, self.DstAddr)     # 宛先アドレスに送信

udp = udpsend()     # クラス呼び出し
udp.send()          # 関数実行

結果

受け取り側は実行するとこんな感じ

$ socat UDP-LISTEN:1111 STDOUT | hexdump
0000000 0080 0002 0064 6400 0000 0101 1c82 0020