如何通过 lxc 路由主机流量?

如何通过 lxc 路由主机流量?

部分信息已更新:

Last login: Wed Aug 31 18:10:24 2022
root@pve:~# ip route
default via 192.168.132.1 dev vmbr0 proto kernel onlink
192.168.132.0/24 dev vmbr0 proto kernel scope link src 192.168.132.4
root@pve:~#
root@pve:~# ping 10.0.0.26
PING 10.0.0.26 (10.0.0.26) 56(84) bytes of data.
64 bytes from 10.0.0.26: icmp_seq=1 ttl=64 time=0.044 ms
64 bytes from 10.0.0.26: icmp_seq=2 ttl=64 time=0.051 ms

10.0.0.26 是 openwrt lxc 的 wan 接口从上游路由器获得的 ip,它回复了来自 pve 主机的请求,我猜测是通过环回,因为 ping 10.0.0.1 或任何 10.0.xx 都不会得到回复。

--

我遇到了无法将我的 openwrt vm 迁移到 lxc 的情况。我使用 vm 通过其虚拟网桥来路由和管理主机的网络,但是当我在 lxc 上使用相同的配置时,它不起作用。

/etc/hosts

127.0.0.1 localhost.localdomain localhost
192.168.132.4 pve

# The following lines are desirable for IPv6 capable hosts

::1     ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

/etc/网络/接口

iface enp3s0 inet manual

auto vmbr0
iface vmbr0 inet static
        address 192.168.132.4/24
        gateway 192.168.132.1
        bridge-ports none
        bridge-stp off
        bridge-fd 0

auto vmbr1
iface vmbr1 inet manual
        bridge-ports enp3s0
        bridge-stp off
        bridge-fd 0

210.conf

cores: 1
memory: 128
net0: name=eth0,bridge=vmbr1,hwaddr=CA:2B:9D:E6:52:08,type=veth
net1: name=eth1,bridge=vmbr0,hwaddr=FA:24:4E:32:4B:9B,type=veth
ostype: unmanaged
rootfs: datastore1:210/vm-210-disk-0.raw,size=204M
swap: 512

OpenWrt容器的/etc/config/network

config interface 'loopback'
    option ifname 'lo'
    option proto 'static'
    option ipaddr '127.0.0.1'
    option netmask '255.0.0.0'

config interface 'wan'
    option ifname 'eth0'
    option proto 'dhcp'

config interface 'wan6'
    option proto 'dhcpv6'
    option ifname '@wan'
    option reqaddress 'try'
    option reqprefix 'auto'

config interface 'lan'
    option proto 'static'
    option ifname 'eth1'
    option type 'bridge'
    option netmask '255.255.255.0'
    option ipaddr '192.168.132.1'

我的上游路由器 IP 是 10.0.0.1

从容器 (192.168.132.1) ping 到任何地方(包括主机、上游 LAN 和公共区域)=> 有效

从主机 (192.168.132.4) ping 192.168.132.1 => 成功

从主机 (192.168.132.4) ping 外部 10.0.0.1 => 不起作用

它曾经在 vm 上运行,但在 lxc 上似乎情况不同。

请解释一下如何解决这个问题。

我在论坛上问过同样的问题

答案1

您所需要的是所谓的 NAT 发夹(又名 NAT 环回、NAT 反射):

NAT loopback, [...] is a feature in many consumer routers which permits the access of a service via the public IP address from inside the local network.

为什么它不起作用?您在问题中提供的 IPTables DNAT 规则指定了此规则应应用到的传入接口:-i eth0。但是,您的流量不是来自 eth0,而是来自某个虚拟网络接口或其他什么。只需删除对 eth0 的此限制就足以使其正常工作。

或者,可以向 lxcbr0 添加单独的规则:

iptables -t nat -A PREROUTING -i lxcbr0 -p tcp --dport 443 --
目标 80.xxx -j DNAT --to 10.0.3.100:443

答案2

好吧,我只需重新启动防火墙服务直到应用默认策略即可解决此问题。我在启动脚本中添加了以下语句:

until $(iptables -t nat -L PREROUTING |grep -q 'zone_lan_prerouting')
do
    /etc/init.d/firewall restart
    sleep 1
done

因此/etc/rc.local看起来像这样:

# Put your custom commands here that should be executed once
# the system init finished. By default this file does nothing.

until $(iptables -t nat -L PREROUTING |grep -q 'zone_lan_prerouting')
do
    /etc/init.d/firewall restart
    sleep 1
done

exit 0

当它是 lxc 时,似乎无法检测到网络变化,因此不会触发服务重新启动,不需要除默认值之外的其他策略。

相关内容