Linuxで プロセスごとにネットワークを禁止 / インターフェイスを限定
process
- TOP
- Old Archives
- Linuxで プロセスごとにネットワークを禁止 / インターフェイスを限定
特定のプロセスをオフラインにする
稀にネットワークを禁止した状態で利用したいことがある。 例えば安全性に疑問があるケース、無用な通信が疑われるケース、ファイルをダウンロードできているかの確認などだ。
方法としては
- cgroupsを使う
- iptablesを使う (EUID/EGID単位なら制御可能)
- SELinux + iptables を使う
の3種類。
単純にネットワークを利用できないようにするのはunshare
。
$ sudo unshare -n w3m /some/text/file
環境変数とかXAuthorityとか面倒なので、Firefoxなどを実行するならsudoでrootにしてsudoで戻すのが勧め。
特定のプロセスを特定のゲートウェイから流す
これだけだと「なんだよ」とか言われてしまうので、もうちょっとまともな話をしよう。
SSH+pppdを使ったVPNは比較的知られているが、VPNはプロキシを通すのに使うか、デフォルトゲートにしてしまうかというのが一般的で、プロセス単位でVPNにルーティングする方法というのはあまり知られていない。
しかしこれもcgroupsを使って実現可能だ。
ここではiptablesによるルーティングを目的とした仮想インターフェイスやブリッジを使うのではなく、あくまで既に割り当てられているインターフェイスを使用させることを目的とする。
まずはトンネルを通しておく。
# pppd updetach noauth silent nodeflate pty "/usr/bin/ssh root@gwhost /usr/sbin/pppd nodetach notty noauth" ipparam vpn 10.0.8.1:10.0.8.2
専用に名前空間を作り、pppデバイスを登録する。
# ip netns add vpnns
# ip link set ppp0 netns vpnns
pppデバイスにアドレスを与える。
pppは/32
プレフィックスがつくのだけど、/32
だと通信できないので、/24
にしておく。
# ip netns exec vpnns ip addr add 10.0.8.1/32 dev ppp0
これで10.0.8.2とは通信できるようになった。 あとはこの状態でシェルを立ち上げ
# ip netns exec vpnns bash -l
お好きにどうぞ。
SSH+pppdのトンネルをデフォルトルートにするのはなかなか苦労がある。 もし単純に物理的なインターフェイスをデフォルトルートとして使わせたいのならDHCPが使えて楽。
# ip netns exec newns dhcpclient eth1
# ip netns exec newns bash -l
もっと簡単な方法
SOCKSを使えばもっと楽にできる。
$ ssh -NCD8080 proxyhost
単純にSOCKS5プロキシとしてlocalhost:8080
を指定すればOK。SSH経由で流れてくれる。
SOCKSに対応していないプログラムでも、proxychainsやtsocksを使えばできる場合も多いだろう。
プロセスごとに帯域制限を
cgroupsとtcを使ってください。
現状では理想的に動作しないのでこの話は略。 情報はここらへんにある。