web-dev-qa-db-ja.com

dnsmasqにルーターアドバタイズメントを特定のインターフェースに送信するように強制する

私は次の設定をしています:

  • 静的IPv6/64を持つリモートサーバー
  • ローカル(今のところ)サーバーを備えたIPv4のみのホームネットワーク
  • 2つのサーバー間でIPv6/64の上半分を/ 65としてトンネリングするIPv4OpenVPN接続

トンネルのおかげで、サーバーはIPv6経由でインターネットに正常に接続できるようになりましたが、dnsmasqで他のデバイスにIPv6を提供することができません。

これが私の/etc/dnsmasq.confの関連部分です:

except-interface=tun0
# pick up prefix from tun0
dhcp-range=::2,::500,constructor:tun0,slaac, 12h
enable-ra
# try to force advertisement on br0
ra-param=br0,30

Dnsmasqを起動すると、次の出力が表示されます(英語に翻訳し、ipv6/routerアドバタイズメント以外の部分を省略しました)。

Compile options: IPv6 GNU-getopt DBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset auth DNSSEC loop-detect inotify dumpfile
DHCP, IP-range 192.168.0.2 -- 192.168.0.100, Lease time 12h
DHCPv6, IP-range ::2 -- ::500, Lease Time 12h, template for tun0
Router-Advertisment on tun0
IPv6-Router-Advertisement enabled

デフォルトでは、br0インターフェイスにはリンクローカルアドレスのみがあり、dnsmasqで使用される範囲からのリンクはありません。ただし、この範囲のアドレスを指定した後でも、アドバタイズメントはtun0についてのみ報告されます。

Dnsmasqにbr0経由でアドバタイズを実行させるにはどうすればよいですか?

編集されたIPアドレスは

リモートサーバー:

eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet xx.xx.xx.xx brd xx.xx.xx.xx scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2a01:xxxx:xxxx:xxxx::1/64 scope global deprecated 
       valid_lft forever preferred_lft 0sec
    inet6 fe80::xxxx:xx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever
tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 2a01:xxxx:xxxx:xxxx:8000::1/65 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::xxxx:xx:xxxx:xxxx/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

私のローカルサーバー上

br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether xx:xx:xx:xx:xx:xx brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 2a01:xxxx:xxxx:xxxx:8000::500/65 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::xx:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever


tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 2a01:xxxx:xxxx:xxxx:8000::1000/65 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::xxxx:xxxx:xxxx/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

64ビットのプレフィックスはすべての2a01アドレスで同じです。

[〜#〜]編集[〜#〜]

grawityの答え から次の設定を試してみました:

リモートサーバー上/etc/openvpn/server.conf

server-ipv6 fc00::/96 
# use low metric to override existing route
route-ipv6 2a01:xxx:xxxx:xxxx::/64 ::1 1
# enable routing to remote on local server
Push "route-ipv6 2a01:xxxx:xxxx:xxxx::1/128 ::1 1"
$ ip addr
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether 96:00:00:27:b7:14 brd ff:ff:ff:ff:ff:ff
    inet xx.xx.xx.xx brd 116.202.98.219 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2a01:xxxx:xxxx:xxxx::1/64 scope global deprecated 
       valid_lft forever preferred_lft 0sec
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever
tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.1 peer 10.8.0.2/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fc00::1/96 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever

$ ip -6 route
2a01:xxxx:xxxx:xxxx::/64 dev tun0 metric 1 pref medium
2a01:xxxx:xxxx:xxxx::/64 dev eth0 proto kernel metric 256 pref medium
fc00::/96 dev tun0 proto kernel metric 256 pref medium
fe80::/64 dev eth0 proto kernel metric 256 pref medium
fe80::/64 dev tun0 proto kernel metric 256 pref medium
default via fe80::1 dev eth0 metric 1024 pref medium

私のローカルサーバー:/etc/dnsmasq.conf

# start with 3 to avoid assigning the remote eth0 and local br0 addresses
dhcp-range=::3,constructor:br0,slaac, 12h
enable-ra
$ ip addr
br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 0c:c4:7a:02:09:cc brd ff:ff:ff:ff:ff:ff
    inet 192.168.0.1/24 brd 192.168.0.255 scope global br0
       valid_lft forever preferred_lft forever
    inet6 2a01:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx:9cc/64 scope global dynamic mngtmpaddr noprefixroute 
       valid_lft 6930sec preferred_lft 6930sec
    inet6 2a01:xxxx:xxxx:xxxx::2/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link 
       valid_lft forever preferred_lft forever
tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UNKNOWN group default qlen 100
    link/none 
    inet 10.8.0.6 peer 10.8.0.5/32 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fc00::1000/96 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::xxxx:xxxx:xxxx:xxxx/64 scope link stable-privacy 
       valid_lft forever preferred_lft forever
$ ip -6 route
::1 dev lo proto kernel metric 256 pref medium
2a01:xxxx:xxxx:xxxx::1 dev tun0 metric 1024 pref medium
2a01:xxxx:xxxx:xxxx::/64 dev br0 proto kernel metric 256 pref medium
2a01:xxxx:xxxx:xxxx::/64 dev br0 proto ra metric 1024 expires 6243sec pref medium
fc00::/96 dev tun0 proto kernel metric 256 pref medium
fe80::/64 dev br0 proto kernel metric 256 pref medium
fe80::/64 dev tun0 proto kernel metric 256 pref medium
default dev tun0 metric 1024 pref medium

この構成を使用すると、LANデバイスは2a01:xxxx:xxxx:xxxx/64からIPv6を取得します。 LAN内でこれらのアドレスに正常にpingを実行できますが、トンネルの交差点が壊れているようです。

次のIPを持っている:

  1. リモートサーバーeth02a01:xxxx:xxxx:xxxx :: 1
  2. リモートサーバーtun0fc00 :: 1
  3. ローカルサーバーbr02a01:xxxx:xxxx:xxxx :: 2
  4. ローカルサーバーtun0fc00 :: 1000

リモートサーバーから、3番目(ローカルサーバーbr0)を除くすべてにpingを実行できます。ローカルサーバーからすべてにpingを実行できます。 LANから、すべてのローカルにpingを実行できますが、リモートにはpingを実行できません。

したがって、その半分は機能しているようです。さらに、2a01:xxx:xxxx:xxxx/64のすべてのトラフィックが、リモートのtcpdumpを介してリモートのeth0にルーティングされ、別のIPv6ホストからpingされていることを確認できました。

1
Nobody

サーバーには/ 64がルーティングされていますか、それとも/ 64がリンク上で利用可能ですか? (リンク上にある場合、サーバーでproxy_ndpのようなものをすでに使用していますか?)

多くのVPSプロバイダーが(推奨されるルーティングされたプレフィックスの代わりに)オンリンク範囲を割り当てるため、これを尋ねました。これは、プロバイダーのローカルゲートウェイが/ 64内のすべてのアドレスがローカルであると見なしていることを意味します:NDPを送信することを期待しています(ARP)はそれらを照会し、サーバーがそれらのいずれかに応答することを期待します。

通常、システムは、そのインターフェースに割り当てられた個々のアドレスのネイバー要請にのみ応答します。あなたの場合、サーバーは2a01:xxxx:xxxx:xxxx :: 1に対してのみ応答しますが、VPNに使用するすべてのアドレスについては何もしません。その結果、サーバープロバイダーのゲートウェイは、これらのアドレスがすべてLANに存在しないと見なし、到達不能として報告します。

これは、サーバーで「NDPプロキシ」を有効にして、VPNで使用している/ 65に対して「なりすまし」応答を送信するようにすることでハッキングできます。理論的には、これは、プロバイダーの観点から、ローカルにアドレスを持っていることと区別がつかないはずです。

2つのサーバー間でIPv6/64の上半分を/ 65としてトンネリングするIPv4OpenVPN接続

通常、SLAACは/ 64以外には使用できません。 (元々、自動構成でEUI64ベースのアドレスが使用されていたためです。)したがって、最初のステップは、より短いプレフィックスを取得することです。/56または少なくとも/ 60で、複数のネットワークに分割できます。

LANに/ 64以外のプレフィックスを使用する必要がある場合は、静的IP構成またはおそらくDHCPv6(それをサポートするデバイスの場合。すべてが使用できるわけではありません)のみを使用できます。

/ 64を共有する以外に選択肢がなく、requireSLAACが機能する場合は、br0で/ 64として構成およびアドバタイズする必要があります。インターフェイスであり、プロキシNDPを使用して両側にパッチを適用する必要がある場合があります。 (プロキシARPに似ていますが、IPv6用です。)つまり、ndppdを使用して、下位/ 65のNDクエリに応答する必要があります。

デフォルトでは、br0インターフェイスにはリンクローカルアドレスのみがあり、dnsmasqで使用される範囲からのリンクはありません。

システムは2つのネットワーク間のルーターとして機能しており、各インターフェイスshouldには通常、所属するネットワークのアドレスがあります。 (192.168.1.0/24を処理するルーター自体が、その範囲のアドレスを持つようになります。)

ただし、さらに重要なのは、各リンクにuniqueプレフィックスを割り当てる必要があることです。 「ローカル」システムには、同じ2a01:xxxx:xxxx:xxxx:8000 ::/65プレフィックスを使用する2つのインターフェースがあります。そのため、LANホストがアドレスを構成しても、ルーターはパケットを正しく転送できません。つまり特定のアドレスがtun0経由とbr0経由のどちらで到達可能かはわかりません。ブランケット/ 65ルートは2つしかないため、すべてのトラフィックに対して常に同じルートが選択されます。

運が良ければ、br0ルートが選択され、LANホストは2a01:xxxx:xxxx:xxxx:8000 :: 1でサーバー自体に到達できなくなりますが、それ以外はすべて機能する可能性があります。運が悪ければ、tun0ルートが選択され、パケットが反映されるため、サーバーはLANホストに何も送信できなくなります。

この状況では、OpenVPNトンネルは実際には/ 65からのアドレス指定を使用する必要はまったくありません。例えばプライベートアドレスを使用できます。いずれの場合も、/ 65はローカルbr0インターフェイスに対してdedicatedである必要があり、dnsmasqではconstructor:br0を使用する必要があります。

サーバーOpenVPN構成の例:

server-ipv6 fd6a:d884:2a8b:11b::/96
route-ipv6 2a01:xxxx:xxxx:xxxx:8000::/65

そして、クライアントのccdで:

iroute-ipv6 2a01:xxxx:xxxx:xxxx:8000::/65

サーバーインターフェイスの例:

eth0:  2a01:xxxx:xxxx:xxxx:0000::1/65  (note prefix length)
tun0:  fd6a:d884:2a8b:11b::1/96

クライアントインターフェイスの例:

tun0:  fd6a:d884:2a8b:11b::1000/96
br0:   2a01:xxxx:xxxx:xxxx:8000::1/65

Dnsmasq構成の例:

enable-ra
dhcp-range = ::2, ::500, constructor:br0, 12h
# you can't get SLAAC with a non-/64 prefix, so it's DHCPv6 only
2
user1686