web-dev-qa-db-ja.com

特定のプロセスの特定のインターフェースを介してトラフィックをルーティングする方法

15分ごとにcronから実行されるスクリプトがあります。このスクリプトは、DNSサーバーにpingを実行して、動的に変化するIPを更新することを目的としています。このスクリプトでeth0ではなくwlanインターフェイスを介してpingを実行します。

ただし、他のプロセスでは、インターネットにアクセスするための主要なインターフェイスとしてeth0を使用する必要があります。

他のプロセスを妨害することなく、特定のプロセスに対してのみこれをどのように行うのですか? stdoutを誘導するようなインターフェースを介してトラフィックを誘導する方法はありますか? ls -al > /dev/tty2'のように。 chrootは、サンドボックス環境を提供することで、これを支援できますか?

4
Lord Loh.

解決策は、高度なルーティングで使用できるNetfilterパケットマークを設定することです。プロセスIDで照合する方法はありませんが、NetfilterではプロセスUIDまたはGIDで照合できます。この場合、特にこのタスクのために新しいシステムユーザーを作成するのが最も簡単な解決策のようです。

iptables -t mangle -A OUTPUT -m owner --uid-owner wlanping -j MARK --set-mark 42

/ etc/iproute2/rt_tablesに新しいルーティングテーブル(forecewlan)を作成し、デフォルトゲートウェイとしてwlanゲートウェイを選択します。

ip route add default via $WLAN_GATEWAY

そして、このマークの付いたパケットに対してこのルーティングテーブルの使用を強制します。

ip rule add fwmark 42 table forcewlan

たぶん、メインルーティングテーブルからこの種のエントリをコピーする必要もあります。

192.168.0.0/24 dev wlan0  proto kernel  scope link  src 192.168.0.100
7
Hauke Laging