TORIPIYO DIARY

recent events, IoT, programming, security topics

unshareコマンドを利用して起動したプログラムのネットワーク通信を防ぐ

unshareコマンドは、PIDやmount, networkなどのnamespaceを作成できます。unshareコマンドでnetworkのnamespaceを新規に作成してプログラムを実行することで、起動したプロセスにおいては、ネットワークデバイス、ルーティングテーブルといったネットワーク関連のリソースは親プロセスから分離されます。

例えば、bashからpingコマンドを実行するとき、unshareコマンドでネットワークのnamespaceを作成して実行すると、新規に作成されたnetworkのnamespaceにおいて、ネットワークデバイスやルーティングテーブルの設定がされていないとpingコマンドは失敗します。

# コンテナを動かしてbashを起動
docker run --rm -it --privileged ubuntu bash

# ping コマンドを取得
apt update
apt-get install -y iputils-ping

# ping の応答が返る
ping google.co.jp
----------------------------------
PING google.co.jp (172.217.175.3) 56(84) bytes of data.
64 bytes from nrt20s18-in-f3.1e100.net (172.217.175.3): icmp_seq=1 ttl=37 time=16.8 ms
64 bytes from nrt20s18-in-f3.1e100.net (172.217.175.3): icmp_seq=2 ttl=37 time=23.7 ms
64 bytes from nrt20s18-in-f3.1e100.net (172.217.175.3): icmp_seq=3 ttl=37 time=26.9 ms
----------------------------------

# ping の応答が返ってこない
unshare -n ping google.co.jp
----------------------------------
ping: google.co.jp: Temporary failure in name resolution
----------------------------------

外部と通信させたくないプロセスを起動するときなどに、このunshareコマンドを利用できます。