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コマンドを利用できます。