
Ubuntu 18.04.2의 기본 브리지 인터페이스 lxdbr0을 사용하여 상당히 일반적인 LXD 설정(버전 3.0.3)을 가지고 있습니다.
반면에 내 호스트 컴퓨터 네트워크는 가장 규칙적이지 않습니다. 두 개의 브리지(br0 및 br1)가 2개의 본드를 통해 4개의 인터페이스(본드당 2개의 인터페이스, 브리지당 1개의 본드)에 연결되어 있습니다.
일반 라우팅이 제대로 작동하는 데 어려움을 겪었기 때문에 브리지마다 별도의 라우팅 테이블을 사용하고 있습니다. 요청과 응답을 받기 위해서는 수신과 동일한 송신 경로를 사용해야 했습니다.
이제 문제는 br0 및 br1과 동일한 서브넷에 있는 호스트를 제외하고 모든 곳에서 모든 것을 ping할 수 있다는 것입니다(호스트는 IP 가장 무도회를 수행합니다). 그리고 내 정방향 프록시가 br1과 동일한 서브넷에 있기 때문에 문제가 있습니다. 호스트 기본 경로도 br1에 있습니다.
호스트 시스템의 규칙과 경로는 다음과 같습니다.
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
관련 netplan 구성은 다음과 같습니다.
...
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
유일한 IPTABLES 규칙은 LXD에 의해 생성됩니다.
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 규칙은
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 */
br0 또는 br1이 아닌 서브넷 주소로 ping을 실행하면 br1, lxdbr0 및 veth 인터페이스에 대한 요청 및 응답을 볼 수 있습니다. br0 또는 br1 주소를 ping하면 lxdbr0 및 veth 인터페이스에 대한 요청만 표시됩니다. br1에는 트래픽이 없으며 앞서 언급한 인터페이스에서는 응답하지 않습니다.
마지막으로 eth, lo 및 bond 인터페이스가 생략된 인터페이스 구성입니다.
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
내가 원하는 결과는 10.10.50.254 및 10.10.99.254에서 NAT를 제한하고 br1 하위 네트워크의 프록시를 통해 컨테이너에서 인터넷에 액세스하는 것입니다. 라우팅/정책 규칙이나 iptables를 사용하여 뭔가를 수행하거나 lxdbr0을 다르게 구성해야 할 수도 있지만 지금은 막힌 것 같습니다.
답변1
추가 라우팅 테이블에 직접 연결된 경로를 추가해야 합니다. 현재 구성에서는 브리지 인터페이스의 주소를 ping하면 응답이 게이트웨이( 10.10.50.254
및 10.10.99.254
)를 통해 외부로 라우팅됩니다.
다음 명령을 사용하여 라우팅을 확인할 수 있습니다.
ip route get 10.146.233.2 from 10.10.50.1
ip route get 10.146.233.2 from 10.10.99.1
실제 경로를 볼 수 있으며 어쩌면 약간 혼란스러울 수도 있습니다.
따라서 라우팅 테이블은 다음과 같아야 합니다.
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