LXC NAT 将主机端口转发到容器

LXC NAT 将主机端口转发到容器

我已经在一台机器上安装了 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-nicveth94ECU1lxc-start192.168.122.0/24

容器启动正常,它可以到达主机,反之亦然,我可以 ping 它,如果有正在运行的 Web 服务器,我可以使用主机上的浏览器进行访问。

virsh net-start还添加一些规则iptables(我没有在主机上运行防火墙,所以默认情况下一切都是空的ACCEPT

iptables -Lnet-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 natnet-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,则需要设置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
    }
}

相关内容