br0VPNなしでの設定

br0VPNなしでの設定

ゲスト (Windows または Linux) からのすべてのトラフィックをホスト (Linux) の VPN を経由するように強制しようとしています。ゲストが VPN の外部のインターネットにアクセスできないようにするために、ホスト システムで接続を確立し、新しいインターフェイスを作成しますtun0。VPN トンネルはホスト上で正常に動作します。

br0VPNなしでの設定

ゲストで VPN を使用せずにインターネットに接続するには、ブリッジ デバイスを作成してbr0接続しますenp7s0。こうすることで、ゲストでインターネットが機能します。

ip link add name br0 type bridge
ip link set br0 up
ip link set enp7s0 master br0

ホストでは、vnet5デバイスが追加され、ブリッジされていますbr0。 しかし同時に、ホストからリモートへの ping は機能しなくなりました。

## On the Host
sudo ip a
# ...
# 14: vnet5: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br0 state UNKNOWN group default qlen 1000
# link/ether ab:ab:ab:ab:ab:ab brd ff:ff:ff:ff:ff:ff
# inet6 fe80::fc54:ff:fe92:5aa9/64 scope link
# valid_lft forever preferred_lft forever
ping www.google.com
# ping: www.google.com: Temporary failure in name resolution
ping 8.8.8.8
# From 192.168.1.100 icmp_seq=1 Destination Host Unreachable

次に VM を起動してvirt-manager接続を確認します。ゲストはインターネットに接続しています:

## On the Guest
ip a
# 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
# ...
# 2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
#     link/ether 52:54:00:92:5a:a9 brd ff:ff:ff:ff:ff:ff
#     inet 192.168.1.221/24 brd 192.168.1.255 scope global dynamic noprefixroute enp1s0
#        valid_lft 67432sec preferred_lft 67432sec
ping www.google.ch
# PING www.google.ch (172.217.168.35) 56(84) bytes of data.
# 64 bytes from zrh04s14-in-f3.1e100.net (172.217.168.35): icmp_seq=1 ttl=117 time=2.47 ms

設定する代わりに、とip link set enp7s0 master br0の間にルーティング ルールを作成することもできると思います。br0enp7s0

VPNとtun0インターフェース

VPN 接続を確立すると、tun0ブリッジに割り当てることができないインターフェイスが作成されます。したがって、いずれにしてもルーティング ルールを作成する必要があります。したがって、状況は上記の場合と似ていると思います。まず、enp7s0から再度削除しますbr0

ip link set enp7s0 nomaster
sudo openvpn my_vpn_tcp.ovpn
# ...
# Initialization Sequence Completed
sudo ip a
# ...
# 3: enp7s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
# link/ether ab:ab:ab:ab:ab:ab brd ff:ff:ff:ff:ff:ff permaddr ab:ab:ab:ab:ab:ab
# inet 192.168.1.100/24 brd 192.168.1.255 scope global dynamic noprefixroute enp7s0
# valid_lft 82702sec preferred_lft 82702sec
# ...
# 10: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 500
# link/none
# inet 10.7.7.5/24 scope global tun0
# valid_lft forever preferred_lft forever
# ...
# 12: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
# link/ether 72:eb:06:e5:1e:5a brd ff:ff:ff:ff:ff:ff
# inet6 fe80::70eb:6ff:fee5:1e5a/64 scope link
# valid_lft forever preferred_lft forever

これ以上何もしなくても、ホスト上で VPN 接続が使用され、問題ありません。

ping www.google.com
# PING www.google.com (172.217.168.3) 56(84) bytes of data.
# 64 bytes from lala.net (172.217.168.3): icmp_seq=1 ttl=117 time=9.64 ms
# ...
ping www.google.com -I tun0
# PING www.google.com (172.217.168.3) from 10.7.7.5 tun0: 56(84) bytes of data.
# 64 bytes from lala.net (172.217.168.3): icmp_seq=2 ttl=117 time=10.0 ms
# ...
ping www.google.com -I enp7s0
# PING www.google.com (172.217.168.3) from 192.168.1.100 enp7s0: 56(84) bytes of data.
# 64 bytes from lala.net (172.217.168.3): icmp_seq=1 ttl=115 time=4.59 ms
# ...

tun0しかし、すでに述べたように、追加することはできませんbr0。そのため、ゲストにはインターネットもありません。

sudo ip link set tun0 master br0
# RTNETLINK answers: Invalid argument

解決策を探しましたが、うまくいくものは見つかりませんでした。または、私のケースは少し異なりますが、ネットワークに関するより多くの洞察が必要ですが、私にはそれがありません。例:これ(これでは役に立たなかった)またはこれ(私のケースには完全には当てはまりません)。

答え1

同じ質問に 2 つの質問がありますが、実際にはそれらは互いに依存していません。それでも両方に回答します。

また、noprefixrouteアドレス オプションは、ネットワーク構成の一部がルートを追加するために何らかの追加ツール (NetworkManager など) によって管理されていることを示唆しています。この回答では、ネットワーク ツールの統合については扱いません。これには、適切に再構成しないと後で変更が上書きされる可能性がある DHCP 構成の処理が含まれます。インターフェイスがダウンしたり削除されたりすると、多くの設定が消えてしまい、再度実行する必要があります。そのため、これは、担当するさまざまなネットワーク ツールのさまざまなフックで行うのが最適です。

br0VPNなしでの設定

ブリッジポートとして設定されたインターフェースはルーティングへの参加を失います

ブリッジポートとして設定すると、インターフェースに関連付けられたルートは無視されます。アドレスをそのままにしておくと、有害な副作用が発生する可能性があります。詳細はブログをご覧ください。Linuxブリッジの適切な分離:

  1. フレームをデバイス固有の受信ハンドラ、もしあれば、
  2. フレームをグローバルまたはデバイス固有のプロトコル ハンドラー(例: IPv4、ARP、IPv6)

ブリッジインターフェースの場合、カーネルはデバイス固有の受信ハンドラを設定しましたbr_handle_frame()。この関数は、STPおよびLLDPフレームの場合、または「brouting」が有効になっている場合を除き、受信インターフェースのコンテキストで追加の処理を許可しません。したがって、プロトコルハンドラは実行されないこの場合。

ブリッジポートとなったインターフェースに設定された IP アドレスは、br0ルーティングに参加できる唯一のインターフェースである特別なブリッジのセルフインターフェース ( : ブリッジ自体) に移動する必要があります (他のオプションもありますが、簡単に説明します)。関連するルートについても同様です。

OP のデフォルト ゲートウェイが 192.168.1.1/24 であると仮定します。これを最初のケースに書き直してみましょう。

ip link add name br0 up type bridge
ip link set dev enp7s0 master br0

ip address flush dev enp7s0
# previous command will also have removed all associated routes as a side effect
ip address add 192.168.1.100/24 dev br0
# previous command added the LAN route too as a side effect (no noprefixroute here)
ip route add default via 192.168.1.1

これにより、ホストと VM の両方がインターネットにアクセスできるようになります。

VM 部分では、vnet5ブリッジ ポートでもあり、ルーティングにも参加しないことに注意してください。ホストは VM とルーター (192.168.1.1) の間でフレームをスイッチングしているだけで、ルーティングは行われません。

VPNとtun0インターフェース

OpenVPNはTUN/TAPドライバ(Linuxではカーネルモジュールによって提供される)に依存していますtunドライバーは以下を提供できます:

  • レイヤー2 TAPインターフェース

    vnet5これはイーサネット デバイスのように動作し、 VM ハイパーバイザーによって作成されるイーサネット ブリッジ ポートとして設定できます。

  • またはレイヤー3 TUNインターフェース

    フレーム情報 (イーサネット MAC アドレス) は含まれず、フレームも処理しませんが、レイヤー 3 以上のプロトコル (IPv4 または IPv6) のみを処理します。したがって、イーサネット ブリッジ ポートとして設定することはできません。これは、tun0TUN モードで OpenVPN によって作成された OP です。

OpenVPNはブリッジ可能なTAPモードも使用できますが、リモートの再設定が必要です。サーバ側も、そしてすべてのネットワーク レイアウトも: リモート サーバーも 192.168.1.0/24 LAN の一部になります。OP はそれを制御できないようです。

それでは、OP の TUN インターフェイスで何ができるかを考えてみましょう。これは、レイヤー 2 ではなく、レイヤー 3 のルーティングで実行されます。

信頼できる VM のみに以前の設定を再利用する

ホストにファイアウォールの制限やブリッジ パスの変更などの高度なファイアウォールが含まれていない場合、VM に自身をゲートウェイとして使用するように強制することはできません。以前のようにブリッジされた VM は、単にホストを無視して 192.168.1.1 をゲートウェイとして保持し、そのトラフィックがtun0最終的にホストのインターフェイスを使用しないようにすることができます。

VM が信頼でき、再構成できる場合は、br0上記を維持し、 に基づいて任意の OpenVPN 設定を適用しbr0(enp7s0参照を に置き換えますbr0)、VM が実行中 (アドレス 192.168.1.221) で VPN が起動したら、これを実行できます。

  • ホスト上

    使用ポリシー/ソースベースルーティングこの特定のソースに対して別のルート結果を選択するには:

    ip rule add from 192.168.1.221 lookup 1000
    ip rule add iif tun0 lookup 1000
    ip route add 192.168.1.0/24 dev br0 table 1000
    ip route add default dev tun0 table 1000
    

    ルーターとして設定:

    sysctl -w net.ipv4.ip_forward=1
    

このような類似の NAT ルールがまだこのケースを処理していない場合は、次のようになります。

  iptables -t nat -A POSTROUTING -s 192.168.1.221 -o tun0 -j MASQUERADE
  • (Linux) VMでは、ホストのルーターの代わりにホストをゲートウェイとして使用します。

    ip route flush to default
    ip route add default via 192.168.1.100
    

信頼できないVMの場合の推奨事項: ホストのメインインターフェースをブリッジポートとして設定しないでください

tun0これにより、VM が改ざんしてはならないネットワークの部分が見えなくなるため、VM のトラフィックの通過を強制することが容易になります。

  • VMの設定を変更して独自のIPネットワークを使用する

    例: 192.168.100.0/24 と静的 IP 192.168.100.2/24 (ホストのネットワーク DHCP の代わりに)、デフォルト ゲートウェイ 192.168.100.1。Linux VM の場合:

    ip address add 192.168.100.2/24 dev enp1s0
    ip route add default via 192.168.100.1
    
  • ホスト上で、初期構成から開始します(ブリッジなしenp7s0

    ip address add 192.168.100.1/24 dev vnet5下記のゼロブリッジ(つまり、ブリッジポートとして設定されていvnet5ない直接)でも実行できますが、libvirtこれをさらに困難にするかもしれません。

    VM専用のブリッジを用意するだけです(ここではアドレス192.168.100.1/24を使用していますが、通常はlibvirt192.168.122.1/24 にデフォルトのブリッジを提供しますvirbr0):

    ip link add name br0 up type bridge
    ip address add 192.168.100.1/24 dev br0
    ip link set dev vnet5 master br0
    

    また、ポリシールーティング2 つの関係するインターフェイス ( および ) の VM に関連するトラフィックの動作を変更します。br0通常tun0どおり、代替ルーティング テーブル内の既存のルートの複製と変更がいくつか発生します。ここでは、tun0ホストとその VM のみにサービスを提供するものと想定しています。最終目標は、VM 側からのものはすべて tun 側にルーティングされ、TUN 側からのものはすべて VM 側にルーティングされ、不要な側は無視されることです。

    ip rule add iif br0 lookup 2000
    ip rule add iif tun0 lookup 2000
    ip route add 192.168.100.0/24 dev br0 table 2000
    ip route add default dev tun0 table 2000 # layer 3 interfaces don't need a gateway
    

    注:tun0ホスト宛ての(つまりルーティングされていない)受信パケットは、すでに地元ルーティング テーブルには、テーブル 2000 に追加のルートは必要ありません。

    ルーターとして設定:

    sysctl -w net.ipv4.ip_forward=1
    

    リモート OpenVPN サーバーは 192.168.100.0/24 を認識していないため、NAT を完了します。

    iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o tun0 -j MASQUERADE
    

VM が 192.168.1.0/24 LAN にまだ到達できる場合:

  • これに対応するためにテーブル2000を再度更新する

    メイン テーブルからテーブル 2000 に LAN ルートを複製します。

    ip route add 192.168.1.0/24 dev enp7s0 table 2000
    
  • そして適切なMASQUERADEルールを再度追加する

    ... VM は現在、他のシステムが認識していない別の LAN にあるため:

    iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o enp7s0 -j MASQUERADE
    

    (一部の iptables ルールの因数分解は実行できます)。

関連情報