特定のプロセスをオフラインにする稀にネットワークを禁止した状態で利用したいことがある。安全性に疑問があるケース、無用な通信が疑われるケース、ファイルをダウンロードできているかの確認などだ。単純にネットワークを利用できないようにするのはunshare。/some/text/file環境変数とかXAuthorityとか面倒なので、Firefoxなどを実行するならsudoでrootにしてsudoで戻すのが勧め。特定のプロセスを特定のゲートウェイから流すこれだけだと「なんだよ」とか言われてしまうので、もうちょっとまともな話をしよう。SSH+pppdを使ったVPNは比較的知られているが、VPNはプロキシを通すのに使うか、デフォルトゲートにしてしまうかというのが一般的で、プロセス単位でVPNにルーティングする方法というのはあまり知られていない。これもcgroupsを使って実現可能だ。ここではiptablesによるルーティングを目的とした仮想インターフェイスやブリッジを使うのではなく、あくまで既に割り当てられているインターフェイスを使用させることを目的とする。トンネルを通しておく。10.0.8.1:10.0.8.2専用に名前空間を作り、pppデバイスを登録する。vpnnspppデバイスにアドレスを与える。pppは/32プレフィックスがつくのだけど、/32だと通信できないので、/24にしておく。ppp0これで10.0.8.2とは通信できるようになった。SSH+pppdのトンネルをデフォルトルートにするのはなかなか苦労がある。単純に物理的なインターフェイスをデフォルトルートとして使わせたいのならDHCPが使えて楽。-lもっと簡単な方法SOCKSを使えばもっと楽にできる。proxyhost単純にSOCKS5プロキシとしてlocalhost:8080を指定すればOK。SSH経由で流れてくれる。SOCKSに対応していないプログラムでも、proxychainsやtsocksを使えばできる場合も多いだろう。プロセスごとに帯域制限をcgroupsとtcを使ってください。現状では理想的に動作しないのでこの話は略。情報はここらへんにある。