lxdbr0 und quellenbasiertes Routing auf Host-Rechnerbasis

lxdbr0 und quellenbasiertes Routing auf Host-Rechnerbasis

Ich habe ein ziemlich normales LXD-Setup (Version 3.0.3) mit der Standard-Bridge-Schnittstelle lxdbr0 auf Ubuntu 18.04.2.

Andererseits ist das Netzwerk meiner Host-Rechner nicht das regulärste. Ich habe zwei Bridges (br0 und br1), die über zwei Bonds mit vier Schnittstellen verbunden sind (2 Schnittstellen pro Bond, 1 Bond pro Bridge).

Da ich Schwierigkeiten hatte, das reguläre Routing richtig zum Laufen zu bringen, verwende ich separate Routingtabellen pro Brücke. Ich musste dafür sorgen, dass die Anfragen und Antworten denselben Ausgangs- wie Eingangspfad verwenden.

Jetzt besteht das Problem darin, dass ich alles und überall anpingen kann (Host führt IP-Maskierung durch), außer Hosts, die sich im selben Subnetz wie br0 und br1 befinden, und da mein Forward-Proxy im selben Subnetz wie br1 ist, habe ich ein Problem. Die Standardroute des Hosts befindet sich ebenfalls auf br1.

Die Regeln und Routen für den Hostcomputer sind:

user@host:~$ ip route show
default via 10.10.50.254 dev br1 proto static
10.146.233.0/24 dev lxdbr0 proto kernel scope link src 10.146.233.1
10.10.99.0/24 dev br0 proto kernel scope link src 10.10.99.1
10.10.50.0/24 dev br1 proto kernel scope link src 10.10.50.1

user@host:~$ ip route show table 99
default via 10.10.99.254 dev br0 proto static

user@host:~$ ip rule show table 99
0:      from 10.10.99.0/24 lookup 99

user@host:~$ ip route show table 50
default via 10.10.50.254 dev br1 proto static

user@host:~$ ip rule show table 50
0:      from 10.10.50.0/24 lookup 50

Die entsprechende Netplan-Konfiguration lautet wie folgt:

...
bridges:
    br0:
      addresses: [10.10.99.1/24]
      interfaces: [bond1]
      routes:
      - to: 0.0.0.0/0
        via: 10.10.99.254
        table: 99
      routing-policy:
      - from: 10.10.99.0/24
        table: 99
      parameters:
        stp: true
        forward-delay: 0
    br1:
      addresses: [10.10.50.1/24]
      gateway4: 10.10.50.254
      interfaces: [bond0]
      routes:
      - to: 0.0.0.0/0
        via: 10.10.50.254
        table: 50
      routing-policy:
      - from: 10.10.50.0/24
        table: 50
      parameters:
        stp: true
        forward-delay: 0

Die einzigen IPTABLES-Regeln werden von LXD generiert

user@host:~$ sudo iptables -L -nv
Chain INPUT (policy ACCEPT 828 packets, 62176 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  lxdbr0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:53 /* generated for LXD network lxdbr0 */
   16  1064 ACCEPT     udp  --  lxdbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:53 /* generated for LXD network lxdbr0 */
    2   658 ACCEPT     udp  --  lxdbr0 *       0.0.0.0/0            0.0.0.0/0            udp dpt:67 /* generated for LXD network lxdbr0 */

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
    7   588 ACCEPT     all  --  *      lxdbr0  0.0.0.0/0            0.0.0.0/0            /* generated for LXD network lxdbr0 */
    7   588 ACCEPT     all  --  lxdbr0 *       0.0.0.0/0            0.0.0.0/0            /* generated for LXD network lxdbr0 */

Chain OUTPUT (policy ACCEPT 540 packets, 69728 bytes)
 pkts bytes target     prot opt in     out     source               destination
    0     0 ACCEPT     tcp  --  *      lxdbr0  0.0.0.0/0            0.0.0.0/0            tcp spt:53 /* generated for LXD network lxdbr0 */
   16  1020 ACCEPT     udp  --  *      lxdbr0  0.0.0.0/0            0.0.0.0/0            udp spt:53 /* generated for LXD network lxdbr0 */
    2   680 ACCEPT     udp  --  *      lxdbr0  0.0.0.0/0            0.0.0.0/0            udp spt:67 /* generated for LXD network lxdbr0 */

NAT-Regeln sind

user@host:~$ sudo iptables -t nat -L -nv
Chain PREROUTING (policy ACCEPT 1649 packets, 66895 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain INPUT (policy ACCEPT 9 packets, 899 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 10 packets, 927 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain POSTROUTING (policy ACCEPT 10 packets, 927 bytes)
 pkts bytes target     prot opt in     out     source               destination
    3   252 MASQUERADE  all  --  *      *       10.146.233.0/24     !10.146.233.0/24      /* generated for LXD network lxdbr0 */

Wenn ich Subnetzadressen anpinge, die nicht br0 oder br1 sind, kann ich Anfragen und Antworten auf den Schnittstellen br1, lxdbr0 und veth sehen. Wenn ich Adressen br0 oder br1 anpinge, sehe ich nur Anfragen auf den Schnittstellen lxdbr0 und veth. Kein Verkehr auf br1 und keine Antworten auf den zuvor erwähnten Schnittstellen.

und schließlich meine Schnittstellenkonfiguration mit ausgelassenen eth-, lo- und bond-Schnittstellen:

user@host:~$ ip a
7: br1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ee:f1:6a:84:6f:df brd ff:ff:ff:ff:ff:ff
    inet 10.10.50.1/24 brd 10.10.50.255 scope global br1
       valid_lft forever preferred_lft forever
8: br0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether ce:13:19:08:56:ad brd ff:ff:ff:ff:ff:ff
    inet 10.10.99.1/24 brd 10.10.99.255 scope global br0
       valid_lft forever preferred_lft forever
22: lxdbr0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fe:cb:12:0f:9f:d7 brd ff:ff:ff:ff:ff:ff
    inet 10.146.233.1/24 scope global lxdbr0
       valid_lft forever preferred_lft forever
    inet6 fe80::70f5:3eff:feac:2ae6/64 scope link
       valid_lft forever preferred_lft forever
26: vethANRBKX@if25: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxdbr0 state UP group default qlen 1000
    link/ether fe:cb:12:0f:9f:d7 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::fccb:12ff:fe0f:9fd7/64 scope link
       valid_lft forever preferred_lft forever

Mein gewünschtes Ergebnis wäre, NAT auf 10.10.50.254 und 10.10.99.254 einzuschränken und von den Containern aus über meinen Proxy im Unternetzwerk br1 auf das Internet zuzugreifen. Ich muss wahrscheinlich etwas an meinen Routing-/Richtlinienregeln oder iptables ändern oder lxdbr0 anders konfigurieren, aber im Moment stecke ich anscheinend fest.

Antwort1

Sie sollten die direkt verbundenen Routen zu Ihren zusätzlichen Routingtabellen hinzufügen. Wenn Sie in der aktuellen Konfiguration die Adressen der Bridge-Schnittstellen anpingen, werden die Antworten über Gateways ( 10.10.50.254und 10.10.99.254) nach außen geleitet.

Sie können das Routing mit den folgenden Befehlen überprüfen:

  • ip route get 10.146.233.2 from 10.10.50.1
  • ip route get 10.146.233.2 from 10.10.99.1

Sie sehen die tatsächlichen Routen und sind möglicherweise etwas verwirrt.

Ihre Routing-Tabellen sollten also folgendermaßen aussehen:

user@host:~$ ip route show table 50
default via 10.10.50.254 dev br1 proto static
10.146.233.0/24 dev lxdbr0 proto static scope link src 10.146.233.1
10.10.99.0/24 dev br0 proto static scope link src 10.10.99.1
10.10.50.0/24 dev br1 proto static scope link src 10.10.50.1

user@host:~$ ip route show table 99
default via 10.10.99.254 dev br0 proto static
10.146.233.0/24 dev lxdbr0 proto static scope link src 10.146.233.1
10.10.99.0/24 dev br0 proto static scope link src 10.10.99.1
10.10.50.0/24 dev br1 proto static scope link src 10.10.50.1

verwandte Informationen