我已经在一台机器上安装了 LXCDebian/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
容器启动正常,它可以到达主机,反之亦然,我可以 ping 它,如果有正在运行的 Web 服务器,我可以使用主机上的浏览器进行访问。
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,则需要设置nat,以便LXC可以访问外界。
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
}
}