LXC NAT는 호스트 포트를 컨테이너로 전달합니다.

LXC NAT는 호스트 포트를 컨테이너로 전달합니다.

컴퓨터에 LXC를 설치했습니다데비안/sid그리고제시/amd64컨테이너

sudo apt-get install lxc debootstrap libvirt-clients \
                libvirt-daemon-system ebtables dnsmasq

sudo lxc-create -t /usr/share/lxc/templates/lxc-debian -n debian

그런 다음 브리지를 시작합니다.

sudo virsh net-start default

이렇게 하면 2개의 네트워크가 생성됩니다. virbr0나중에 생성되면 해당 네트워크가 사용되고 IP는 dhcp에 의해 할당됩니다.virbr0-nicveth94ECU1lxc-start192.168.122.0/24

컨테이너는 정상적으로 시작되고 호스트에 도달할 수 있으며 그 반대의 경우도 마찬가지입니다. 핑을 보낼 수 있고 실행 중인 웹 서버가 있으면 호스트의 브라우저를 사용하여 액세스할 수 있습니다.

virsh net-start또한 몇 가지 규칙을 추가합니다 iptables(호스트에서 실행되는 방화벽이 없으므로 기본적으로 모든 것이 비어 있습니다 ACCEPT).

iptables -L뒤쪽에net-start

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:domain
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootps
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:bootps

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             192.168.122.0/24     ctstate RELATED,ESTABLISHED
ACCEPT     all  --  192.168.122.0/24     anywhere            
ACCEPT     all  --  anywhere             anywhere            
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable
REJECT     all  --  anywhere             anywhere             reject-with icmp-port-unreachable

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     udp  --  anywhere             anywhere             udp dpt:bootpc

iptables -L -t nat뒤쪽에net-start

Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination         
RETURN     all  --  192.168.122.0/24     base-address.mcast.net/24 
RETURN     all  --  192.168.122.0/24     255.255.255.255     
MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24    

/proc/sys/net/ipv4/ip_forward1

이제 특정 호스트 포트를 컨테이너에 NAT하고 싶고 해결책을 찾았습니다. 온라인의 모든 것이 같은 방향을 가리키는 것 같습니다. 다음과 같이 작동해야 합니다.

iptables -A PREROUTING -t nat -p tcp --dport $HPORT -j DNAT --to $VRIP:$VRPORT
iptables -A FORWARD -p tcp -d $VRIP --dport $VRPORT -j ACCEPT

하지만 그렇지 않습니다. 내가 무엇을 놓치고 있습니까?

고쳐 쓰다

이 게시물 이후에 lxc-nat/virsh net-start(virbr0)에서 호스트 nat(br0)로 전환했습니다.eth0을 br0으로 변환하고 LXC 또는 LXD를 LAN에 연결합니다.

작동합니다. 컨테이너는 dhcp를 통해 LAN 라우터에서 IP를 가져오고 동일한 네트워크에 있습니다. 이는 라우터가 NAT 포트를 통해서만 LAN 주소를 전달할 수 있기 때문에 편리합니다.

간단히 말해서 다음과 같이 br0인터페이스를 만듭니다 /etc/network/interfaces.

auto br0
iface br0 inet static
    address 192.168.2.210
    netmask 255.255.255.0
    network 192.168.2.0
    broadcast 192.168.2.255
    gateway 192.168.2.1
    bridge-ifaces eth0
    bridge-ports eth0
    up ifconfig eth0 up

iface eth0 inet manual

lxc.network.link = br0그런 다음 컨테이너 구성에서 사용하십시오.

하지만, 호스트 브리지를 사용하지 않고 특정 포트만 NAT하는 방법을 아시는 분이 계시다면 알려주시면 좋겠습니다.

답변1

nfttables를 사용하는 경우 LXC가 외부 세계에 액세스할 수 있도록 nat를 설정해야 합니다.

table ip lxc {
    chain postrouting {
        type nat hook postrouting priority srcnat; policy accept;
        ip saddr 10.0.3.0/24 ip daddr != 10.0.3.0/24 masquerade
    }
}

인터넷에서 내부로 NAT하려면 예를 들어 인터넷의 포트 2222를 lxc 컨테이너의 포트 22로 사용하세요.사전 라우팅체인에서테이블.

table ip nat {
    chain prerouting {
        type nat hook prerouting priority dstnat; policy accept;
        iifname "eth0" meta l4proto tcp ip daddr $public_ip tcp dport 2222    dnat to $my_lxc_ip:22
    }
}

관련 정보