web-dev-qa-db-ja.com

ホストとゲスト間のIPv6ルーティング

現在、現在の設定に関する問題に直面しています。基本的に、/ 64 IPv6サブネットが割り当てられている専用サーバーがあります(2a01:4f8:221:1e81 ::/64)。そこからipv6.google.comにpingを実行できるため、ホストの接続は正常に機能しています。

また、これは構成です。

root@void ~ # ifconfig vmbr0
vmbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.250.0.1  netmask 255.255.0.0  broadcast 10.250.255.255
        inet6 2a01:4f8:221:1e81:1:ffff:ffff:ffff  prefixlen 80  scopeid 0x0<global>
        inet6 2a01:4f8:221:1e81:212:ffff:ffff:ffff  prefixlen 80  scopeid 0x0<global>
        inet6 2a01:4f8:221:1e81:253:ffff:ffff:ffff  prefixlen 80  scopeid 0x0<global>
        inet6 2a01:4f8:221:1e81:251:ffff:ffff:ffff  prefixlen 80  scopeid 0x0<global>
        inet6 fe80::70a5:a1ff:fed6:8c0  prefixlen 64  scopeid 0x20<link>
        ether 4a:5a:df:ab:a8:bc  txqueuelen 1000  (Ethernet)
        RX packets 949686094  bytes 162428268530 (151.2 GiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 285868499  bytes 143826674082 (133.9 GiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

root@void ~ #

ルーティングテーブル:

root@void ~ # ip -6 route show
2a01:4f8:221:1e81:1::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81:212::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81:251::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81:253::/80 dev vmbr0 proto kernel metric 256 pref medium
2a01:4f8:221:1e81::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev vmbr0 proto kernel metric 256 pref medium
default via fe80::1 dev eth0 metric 1024 pref medium
root@void ~ #

仮想マシンにSSHで接続してネットワークを構成すると、問題が発生します。この例では、次の構成があります。

hypnotize@irc:~$ cat /etc/network/interfaces | tail -n4
iface eth0 inet6 static
    address 2a01:4f8:101:3172:251::3
    netmask 80
    gateway 2a01:4f8:101.3172:251:ffff:ffff:ffff
hypnotize@irc:~$

したがって、ifconfigは次のようになります。

hypnotize@irc:~$ Sudo ifconfig
[Sudo] password for hypnotize:
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 10.250.3.6  netmask 255.255.0.0  broadcast 10.250.255.255
        inet6 fe80::9474:f1ff:fe6f:4bc3  prefixlen 64  scopeid 0x20<link>
        inet6 2a01:4f8:101:3172:251::3  prefixlen 80  scopeid 0x0<global>
        ether 96:74:f1:6f:4b:c3  txqueuelen 1000  (Ethernet)
        RX packets 177  bytes 16270 (15.8 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 161  bytes 18477 (18.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

lo: flags=73<UP,LOOPBACK,RUNNING>  mtu 65536
        inet 127.0.0.1  netmask 255.0.0.0
        inet6 ::1  prefixlen 128  scopeid 0x10<Host>
        loop  txqueuelen 0  (Local Loopback)
        RX packets 0  bytes 0 (0.0 B)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 0  bytes 0 (0.0 B)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

hypnotize@irc:~$

ルーティングテーブルが表示されている間:

hypnotize@irc:~$ ip -6 route show
2a01:4f8:101:3172:251::/80 dev eth0 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
hypnotize@irc:~$

残念ながら、ping6を実行しようとすると、「接続:ネットワークに到達できません」と表示されます。 net.ipv6.conf.all.forwardingを有効にしました。

構成にエラーがありますか?前もって感謝します


タイプミスを修正しましたが、次のように表示されます。

root@irc:/home/hypnotize# ping6 ipv6.google.com
PING ipv6.google.com(fra16s20-in-x0e.1e100.net (2a00:1450:4001:821::200e)) 56 data bytes
From 2a01:4f8:101:3172:251::3 (2a01:4f8:101:3172:251::3) icmp_seq=1 Destination unreachable: Address unreachable
From 2a01:4f8:101:3172:251::3 (2a01:4f8:101:3172:251::3) icmp_seq=2 Destination unreachable: Address unreachable
From 2a01:4f8:101:3172:251::3 (2a01:4f8:101:3172:251::3) icmp_seq=3 Destination unreachable: Address unreachable
^C
--- ipv6.google.com ping statistics ---
5 packets transmitted, 0 received, +3 errors, 100% packet loss, time 4032ms

root@irc:/home/hypnotize#

また、ルーティングテーブルの見栄えが良くなり、少なくともデフォルトのエントリがあります。

root@irc:/home/hypnotize# ip -6 route show
2a01:4f8:101:3172:251::/80 dev eth0 proto kernel metric 256
fe80::/64 dev eth0 proto kernel metric 256
default via 2a01:4f8:101:3172:251:ffff:ffff:ffff dev eth0 metric 1024
root@irc:/home/hypnotize#
1
alestark

多くの企業と同様に、Hetznerはネットワークスイッチでスイッチポートセキュリティを実行しています。つまり、許可されたMACアドレスのみがネットワークと通信できます。つまり、サーバーのNICのハードウェアアドレスは話すことができますが、仮想マシンの仮想MACアドレスは話すことができません。したがって、VMを外部に直接ブリッジすることはできません。 (追加のIPv4アドレスを注文した場合、Hetznerを使用すると、VMに割り当てることができる各アドレスの仮想MACアドレスを生成できます。これにより、このセットアップが機能しますが、追加のIPv4アドレスがない場合、またはそれらを購入したくない場合は、購入できません。)

HetznerにKVM仮想マシンホストがあり、VMはほとんどIPv6でのみ到達可能であり、これが私が設定した方法です。

ホストNICに直接ブリッジする代わりに、/ 80ごとに仮想ネットワークを作成し、それらの仮想ネットワークにVMを割り当てます。次に、ホストは、ホストNICと、ブリッジされていない(レイヤー2)がルーティングされている(レイヤー3)仮想ネットワークとの間でルーティングします。

したがって、ホストは次のように構成されます。

IPV6ADDR="2a01:4f8:150:43ea::2/64"
IPV6_DEFAULTGW="fe80::1"

Libvirt仮想ネットワークは/ 80ネットワークとして構成されます。 Virt-managerは/ 80ネットワークの作成を処理できないため、XMLを自分で作成する必要があります。次に例を示します。

<network>
  <name>v6net1</name>
  <forward mode='route'/>
  <bridge name='v6net1' stp='on' delay='0'/>
  <domain name='v6net1'/>
  <ip address='192.168.101.1' netmask='255.255.255.0'>
    <dhcp>
      <range start='192.168.101.128' end='192.168.101.254'/>
    </dhcp>
  </ip>
  <ip family='ipv6' address='2a01:4f8:150:43ea:1::1' prefix='80'>
    <dhcp>
      <range start='2a01:4f8:150:43ea:1::1000' end='2a01:4f8:150:43ea:1::ffff'/>
    </dhcp>
  </ip>
</network>

これで、すべての仮想マシンのNICがv6ne​​t1ネットワークに追加され、DHCPv6からこの/ 80のアドレスを取得します。ただし、必要に応じて手動で割り当てることもできます。これにより、ブリッジv6net1が作成されますが、ホストNICはブリッジの一部ではありません。したがって、トラフィックはVMと外部ワールドの間でルーティングされ、ホストを離れるとき、トラフィックにはホストのMACアドレスがあります。 。

これは、グローバルIPv4接続には適用されません。マスカレードまたはポートフォワーディング。私はこれをlibvirtの外部のfirewalldで個別に処理し、libvirtのNAT機能を使用しません。VMが接続できるように単純なNAT IPv4ホストであり、着信トラフィックを必要としない場合は、代わりに<forward mode='nat'>を使用します。純粋なIPv6のみのVMの場合、IPv4セットアップを完全に省略することもできます。

4
Michael Hampton