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パケットを送る例をサンプルとして置いておきます
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