Chienomi

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を使ってください。

現状では理想的に動作しないのでこの話は略。 情報はここらへんにある。