컴퓨터에 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-nic
veth94ECU1
lxc-start
192.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_forward
예1
이제 특정 호스트 포트를 컨테이너에 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
}
}