Python3
ubuntu16.04
scapy

scapyとはpythonでもネットワークプログラミングができるライブラリのことです。

今までscapyはpython2のみ対応で、python3で使おうとすると有志が作ったscapy-python3というライブラリを使う必要がありました。さらにこのscapy-python3、微妙に更新が遅いのかIPv6周りのバグが残ったままの様子……。

ですが2017年11月ごろにとうとう本家もpython3に対応、2018年3月16日現在ではrc版ではありますが無事に使えることを確認しましたので共有しておきます。

またこちらUbuntu 16.04での話となりますのでご注意ください

インストール方法

pyenv+virtualenvを使った場合で説明します。

先に説明しておくと、scapyは受信パケットの確認にtcpdumpを使ったりする関係でroot権限で実行したほうが良いです。

ただsudoですと今度はpyenvのパスが上手く引き継がれないなどの影響があります。もちろん上手くsudoにパス変数を引き継がせることもvisudoなどで可能ですが、今度はtcpdumpへのパスが……などと複雑になっていくためオススメしません。

というわけで今回はroot用にpyenvが既にインストールされている、という前提でやっていきます。

もっと手っ取り早く、rootからでも実行できるようにシステムにpython3をインストールしてしまって、細かいバージョンは気にしない、というのも可能ですが、流石に乱暴な気がするので止めておきます。

cd test_scapy_python3
sudo su
pyenv local 3.6.4
python -V # 3.6.4と表示されるはず
python -m venv .venv
source .venv/bin/activate

pip install --pre scapy
# `--pre`をつけてrc版を使うようにしないと現状(2018/03/16)python 3.6.4では動きません

コード

基本的にpython2の頃と変わりませんので、他の方の書いた記事などを見て回ると良いと思います。ここではUDPパケットを送る例をサンプルとして置いておきます

send_udp.py
import scapy.all as scapy

packet = scapy.IPv6(dst='2001:1:1:11::2', src='2001:1:1:11::555')
packet.show()
scapy.send(packet/scapy.UDP())

実行方法

cd test_scapy_python3
sudo su
python -V # pyenvの設定が正しければ3.6.4と表示されるはず
source .venv/bin/activate
python send_udp.py

まとめ

もちろんC言語でパケットを送るより自由度は減りますが、L2レベルでEthernetフレームの中身も指定できますし、極端に変なことをしないのであれば簡単にネットワークプログラミングができると思います。

また今後scapyもrc版ではなくて本リリースでpython3に対応すると思いますし。

後はMacで使う方法ですが……試したことはないですがsudoつけたりするだけで行けるんだろうか……? もしコメントなどで教えて頂ければ幸いです。

参考

本家: https://github.com/secdev/scapy
python3対応に関するissue: https://github.com/secdev/scapy/issues/657