web-dev-qa-db-ja.com

アプリケーションごとにOpenVPNをバイパスする方法

私は、openVPN接続を介してインターネットトラフィック全体をルーティングするLinuxマシンを持っています。そのように機能するように明示的に構成されました。

ただし、マシンには、VPN接続(tun +)を使用せず、オープン接続(eth0)を経由する必要のないアプリケーションがいくつかあります。

宛先IPに基づくルーティングではないため、最初は、openVPNチャネルを回避するためにアプリケーションが使用するローカルsocks5プロキシを作成することでした。ただし、ssh -Dまたは他のswを使用してこれを実行しようとしても失敗し(おそらく私のせいです)、そのための別のより良い解決策があるかどうか疑問に思っています。

4
roymreelee

最近投稿しました 別の回答 この特定の状況に対処しますが、この質問はOpenVPNに固有であるため、質問は重複していません。回答を直接質問に入れるのではなく、回答へのリンクに反対票を投じる人もいるので、ここにコピーして貼り付けます。

私はこれにとても苦労しているので、ここに完全な解決策があります。 Ubuntu15から19.10でテストされています。特にOpenVPNで使用して、VPNトンネルインターフェースの外部に特定のアプリをルーティングできます。

完全な「cgroup」ソリューション

それはどのように機能しますか?

  • Linuxカーネルは、アプリを コントロールグループ に配置します。このcgroup内のアプリからのネットワークトラフィックは、ネットワークコントローラーレベルのクラスIDによって識別されます。
  • iptablesはこのトラフィックをマークし、適切なIPで強制的に終了します
  • ip routeは、マークされたトラフィックを別のルーティングテーブルで処理し、必要なゲートウェイIPへのデフォルトルートを使用します。

自動化されたスクリプト

novpn.sh スクリプトを作成して、依存関係のインストールと実行を自動化しました。 Ubuntu15から19.10でテスト済み。

最初にVPNを開始します。

wget https://Gist.githubusercontent.com/kriswebdev/a8d291936fe4299fb17d3744497b1170/raw/novpn.sh
# If you don't use eth0, edit the script setting.
Sudo chmod +x novpn.sh
./novpn.sh traceroute www.google.com
./novpn.sh --help

手動ハウツー

まず、cgroupサポートとツールをインストールします。

Sudo apt-get install cgroup-lite cgroup-tools

Iptables 1.6。0+が必要です。 iptables 1.6.0リリースソースを取得 、それを抽出し、iptablesソースディレクトリからこれを実行します(--disable-nftablesフラグはエラーを回避します):

iptables --version
Sudo apt-get install dh-autoreconf bison flex
./configure --prefix=/usr      \
            --sbindir=/sbin    \
            --disable-nftables \
            --enable-libipq    \
            --with-xtlibdir=/lib/xtables
make
Sudo make install
iptables --version

さて、実際の設定。 novpnという名前のコントロールグループを定義します。このcgroupのプロセスは、0x00110011(11:11)のクラスIDを持ちます。

Sudo su
mkdir /sys/fs/cgroup/net_cls/novpn
cd /sys/fs/cgroup/net_cls/novpn
echo 0x00110011 > net_cls.classid

ここで、特定のアプリに使用する実際のインターフェースはeth0であり、ゲートウェイIPは10.0.0.1であると想定します。 [〜#〜] replace [〜#〜]これらを本当に必要なものに置き換えます(ip routeから情報を取得します)。特に、インターフェイスの名前がおかしい新しいUbuntuバージョンではそうです。 rootとしてまだ実行します:

# Add mark 11 on packets of classid 0x00110011
iptables -t mangle -A OUTPUT -m cgroup --cgroup 0x00110011 -j MARK --set-mark 11

# Force the packets to exit through eth0 with NAT
iptables -t nat -A POSTROUTING -m cgroup --cgroup 0x00110011 -o eth0 -j MASQUERADE

# Define a new "novpn" routing table
# DO THIS JUST ONCE !
echo 11 novpn >> /etc/iproute2/rt_tables

# Packets with mark 11 will use novpn
ip rule add fwmark 11 table novpn

# Novpn has a default gateway to the interface you want to use
ip route add default via 10.0.0.1 table novpn

# Unset reverse path filtering for all interfaces, or at least for "eth0" and "all"
for i in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 0 > $i; done

最後に、特定のインターフェースでアプリを実行します。

exit
Sudo cgcreate -t $USER:$USER -a $USER:$USER -g net_cls:novpn
cgexec -g net_cls:novpn traceroute www.google.com
# Close all Firefox windows first
killall firefox; cgexec -g net_cls:novpn firefox

または、すでに実行中のプロセスをcgroupに移動したい場合は、まあ... できません!これはNAT(マスカレード)関数が原因のようです:iptables -nvL -t natは、cgroupが切り替えられたときに一致しませんが、iptables -nvL -t mangleは一致します。

# Get PID of the process (we'll then suppose it's 1234)
pidof firefox
# Add to cgroup - THIS DOESN'T WORK! Silently fails to produce the final result.
Sudo echo 1234 > /sys/fs/cgroup/net_cls/novpn/tasks
# Remove - but this works...
Sudo echo 1234 > /sys/fs/cgroup/net_cls

クレジット:期待どおりに機能する回答はありませんでしたが、それらを組み合わせて機能しました:chripell answer evolware article プロセスルーティングごとに2:cgroups、iptables、ポリシールーティングを使用 、- OpenVPN接続を経由しない特定のプロセスを作成するにはどうすればよいですか?iptablesに基づいてOpenVPNのスイッチを強制終了します

4
KrisWebDev