nftables를 사용하여 LXC 컨테이너에서 인터넷에 액세스

nftables를 사용하여 LXC 컨테이너에서 인터넷에 액세스

현재 nftables를 사용하여 LXC 컨테이너에 인터넷 액세스를 제공하려고 하는데 제대로 작동하지 않는 것 같습니다.

설정은 다음과 같습니다. 호스트에는 WAN 인터페이스(enp1s0)와 브리지(lxcbrd)가 있습니다. lxc-net을 사용하는 대신 다음과 같이 직접 브리지를 만들었습니다.

allow-hotplug enp1s0
iface enp1s0 inet dhcp

auto lxcbrd
iface lxcbrd inet static
        bridge_ports none
        bridge_fd 0
        bridge_maxwait 0
        address 10.0.0.254
        netmask 255.255.255.0

LXC 컨테이너는 lxcbrd를 사용하도록 구성되었습니다...

lxc.network.type = veth
lxc.network.link = lxcbrd
lxc.network.ipv4 = 10.0.0.1/24
lxc.network.flags = up
lxc.network.hwaddr = 00:16:3e:98:34:26
lxc.network.ipv4.gateway = auto

...어느 정도 성공한 것 같습니다.

2: enp1s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether [REDACTED] brd ff:ff:ff:ff:ff:ff
    inet [REDACTED] brd [REDACTED] scope global enp1s0
       valid_lft forever preferred_lft forever
    inet6 [REDACTED] scope link 
       valid_lft forever preferred_lft forever
3: lxcbrd: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether fe:5f:9a:9b:75:a4 brd ff:ff:ff:ff:ff:ff
    inet 10.0.0.254/24 brd 10.0.0.255 scope global lxcbrd
       valid_lft forever preferred_lft forever
    inet6 fe80::6414:77ff:fe2d:6699/64 scope link 
       valid_lft forever preferred_lft forever
5: vethPPYOVI@if4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master lxcbrd state UP group default qlen 1000
    link/ether fe:5f:9a:9b:75:a4 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::fc5f:9aff:fe9b:75a4/64 scope link 
       valid_lft forever preferred_lft forever

호스트에서 nftables는 nat로 구성되어 전달됩니다.

table ip nat {
        chain prerouting {
                type nat hook prerouting priority 0; policy accept;
        }

        chain postrouting {
                type nat hook postrouting priority 0; policy accept;
                oifname "enp1s0" masquerade
        }
}
table inet filter {
        chain input {
                type filter hook input priority 0; policy drop;
                ct state { established, related} accept comment "accept all traffic originated from us"
                ct state invalid drop comment "drop invalid packets"
                iif "lo" accept comment "accept all loopback traffic"
                icmp type { router-advertisement, destination-unreachable, parameter-problem, time-exceeded} accept comment "ICMP"
                icmpv6 type { nd-neighbor-solicit, time-exceeded, destination-unreachable, packet-too-big, nd-neighbor-advert, parameter-problem, nd-router-advert} accept comment "ICMPv6"
                tcp dport 2222 ct state new accept comment "ssh"
                udp dport 60000-61000 ct state new accept comment "mosh"
        }

        chain forward {
                type filter hook forward priority 0; policy accept;
                iifname "lxcbrd" oifname "enp1s0" accept
                iifname "enp1s0" oifname "lxcbrd" accept
        }

        chain output {
                type filter hook output priority 0; policy accept;
        }
}

컨테이너 내부에서:

6: eth0@if7: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
    link/ether 00:16:3e:98:34:26 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 10.0.0.1/24 brd 10.0.0.255 scope global eth0
       valid_lft forever preferred_lft forever
    inet6 fe80::216:3eff:fe98:3426/64 scope link 
       valid_lft forever preferred_lft forever

그러나 컨테이너 내부에서는 인터넷에 액세스할 수 없습니다. 호스트에서는 문제 없이 컨테이너를 ping할 수 있습니다.

업데이트: 이 구성을 사용하면 게이트웨이(예: 10.0.0.254)를 ping할 수 없지만 동일한 서브넷(10.0.0.0/24)에 있는 다른 컨테이너를 ping할 수 있습니다. nftables 체인 inet 필터 입력을 정책 승인으로 설정하면 게이트웨이를 ping할 수 있지만 모든 icmp 트래픽이 허용되어야 한다는 규칙이 있는 경우 서브넷 외부의 IP는 ping할 수 없습니다. 이유는 확실하지 않습니다. 이렇게 동작합니다.

업데이트 2: 이후 echo 1 > /proc/sys/net/ipv4/ip_forward(이 설정이 있다고 확신했지만 /etc/sysctl.conf...분명히 그렇지 않음) WAN IP(예: 8.8.8.8)를 핑하고 Google DNS 서버를 /etc/.conf에 수동으로 추가한 후 DNS를 확인할 수 있었습니다. 그러나 nftables 체인 inet 필터 입력이 정책 삭제로 설정된 경우 게이트웨이(브릿지 인터페이스 주소(10.0.0.254))에 대해 ping을 수행할 수 없습니다.

내 구성에서 심각한 문제를 발견한 사람이 있나요?

도와주셔서 감사합니다!

관련 정보