将LXC容器桥接到主机eth0,以便可以拥有公共IP

更新:

我find了解决scheme: http : //www.linuxfoundation.org/collaborate/workgroups/networking/bridge#No_traffic_gets_trough_.28except_ARP_and_STP.29

# cd /proc/sys/net/bridge # ls bridge-nf-call-arptables bridge-nf-call-iptables bridge-nf-call-ip6tables bridge-nf-filter-vlan-tagged # for f in bridge-nf-*; do echo 0 > $f; done 

但我想对此有专家意见:禁用所有bridge-nf- *是否安全? 他们在这里干什么?

更新结束

我需要将LXC容器连接到我的主机的物理接口(eth0),阅读大量教程,文档和博客文章。

我需要容器有自己的公共IP(我以前做过KVM / libvirt)。

经过两天的search和尝试,我仍然无法使用LXC容器。

主机运行一个新鲜安装的Ubuntu服务器Quantal(12.10)只有libvirt(我没有在这里使用)和lxc安装。

我创build了容器:

 lxc-create -t ubuntu -n mycontainer 

所以他们也运行Ubuntu 12.10。

/ var / lib / lxc / mycontainer / config的内容是:

 lxc.utsname = mycontainer lxc.mount = /var/lib/lxc/test/fstab lxc.rootfs = /var/lib/lxc/test/rootfs lxc.network.type = veth lxc.network.flags = up lxc.network.link = br0 lxc.network.name = eth0 lxc.network.veth.pair = vethmycontainer lxc.network.ipv4 = 179.43.46.233 lxc.network.hwaddr= 02:00:00:86:5b:11 lxc.devttydir = lxc lxc.tty = 4 lxc.pts = 1024 lxc.arch = amd64 lxc.cap.drop = sys_module mac_admin mac_override lxc.pivotdir = lxc_putold # uncomment the next line to run the container unconfined: #lxc.aa_profile = unconfined lxc.cgroup.devices.deny = a # Allow any mknod (but not using the node) lxc.cgroup.devices.allow = c *:* m lxc.cgroup.devices.allow = b *:* m # /dev/null and zero lxc.cgroup.devices.allow = c 1:3 rwm lxc.cgroup.devices.allow = c 1:5 rwm # consoles lxc.cgroup.devices.allow = c 5:1 rwm lxc.cgroup.devices.allow = c 5:0 rwm #lxc.cgroup.devices.allow = c 4:0 rwm #lxc.cgroup.devices.allow = c 4:1 rwm # /dev/{,u}random lxc.cgroup.devices.allow = c 1:9 rwm lxc.cgroup.devices.allow = c 1:8 rwm lxc.cgroup.devices.allow = c 136:* rwm lxc.cgroup.devices.allow = c 5:2 rwm # rtc lxc.cgroup.devices.allow = c 254:0 rwm #fuse lxc.cgroup.devices.allow = c 10:229 rwm #tun lxc.cgroup.devices.allow = c 10:200 rwm #full lxc.cgroup.devices.allow = c 1:7 rwm #hpet lxc.cgroup.devices.allow = c 10:228 rwm #kvm lxc.cgroup.devices.allow = c 10:232 rwm 

然后,我将我的主机/ etc / network / interfaces更改为:

 auto lo iface lo inet loopback auto br0 iface br0 inet static bridge_ports eth0 bridge_fd 0 address 92.281.86.226 netmask 255.255.255.0 network 92.281.86.0 broadcast 92.281.86.255 gateway 92.281.86.254 dns-nameservers 213.186.33.99 dns-search ovh.net 

当我尝试命令行configuration(“brctl addif”,“ifconfig eth0”等),我的远程主机变得无法访问,我必须重新启动它。

我将/ var / lib / lxc / mycontainer / rootfs / etc / network / interfaces的内容更改为:

 auto lo iface lo inet loopback auto eth0 iface eth0 inet static address 179.43.46.233 netmask 255.255.255.255 broadcast 178.33.40.233 gateway 92.281.86.254 

mycontainer启动需要几分钟(lxc-start -n mycontainer)。

我试过replace

  gateway 92.281.86.254 

通过:

  post-up route add 92.281.86.254 dev eth0 post-up route add default gw 92.281.86.254 post-down route del 92.281.86.254 dev eth0 post-down route del default gw 92.281.86.254 

我的容器然后立即启动。

但无论我在/ var / lib / lxc / mycontainer / rootfs / etc / network / interfaces中设置了什么configuration,我都无法从mycontainer ping任何IP(包括主机):

 ubuntu@mycontainer:~$ ping 92.281.86.226 PING 92.281.86.226 (92.281.86.226) 56(84) bytes of data. ^C --- 92.281.86.226 ping statistics --- 6 packets transmitted, 0 received, 100% packet loss, time 5031ms 

而我的主机不能ping容器:

 root@host:~# ping 179.43.46.233 PING 179.43.46.233 (179.43.46.233) 56(84) bytes of data. ^C --- 179.43.46.233 ping statistics --- 5 packets transmitted, 0 received, 100% packet loss, time 4000ms 

我的容器的ifconfig:

 ubuntu@mycontainer:~$ ifconfig eth0 Link encap:Ethernet HWaddr 02:00:00:86:5b:11 inet addr:179.43.46.233 Bcast:255.255.255.255 Mask:0.0.0.0 inet6 addr: fe80::ff:fe79:5a31/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:64 errors:0 dropped:6 overruns:0 frame:0 TX packets:54 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4070 (4.0 KB) TX bytes:4168 (4.1 KB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:32 errors:0 dropped:0 overruns:0 frame:0 TX packets:32 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2496 (2.4 KB) TX bytes:2496 (2.4 KB) 

我的主机的ifconfig:

 root@host:~# ifconfig br0 Link encap:Ethernet HWaddr 4c:72:b9:43:65:2b inet addr:92.281.86.226 Bcast:91.121.67.255 Mask:255.255.255.0 inet6 addr: fe80::4e72:b9ff:fe43:652b/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1453 errors:0 dropped:18 overruns:0 frame:0 TX packets:1630 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:145125 (145.1 KB) TX bytes:299943 (299.9 KB) eth0 Link encap:Ethernet HWaddr 4c:72:b9:43:65:2b UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:3178 errors:0 dropped:0 overruns:0 frame:0 TX packets:1637 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:298263 (298.2 KB) TX bytes:309167 (309.1 KB) Interrupt:20 Memory:fe500000-fe520000 lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:6 errors:0 dropped:0 overruns:0 frame:0 TX packets:6 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:300 (300.0 B) TX bytes:300 (300.0 B) vethtest Link encap:Ethernet HWaddr fe:0d:7f:3e:70:88 inet6 addr: fe80::fc0d:7fff:fe3e:7088/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:54 errors:0 dropped:0 overruns:0 frame:0 TX packets:67 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4168 (4.1 KB) TX bytes:4250 (4.2 KB) virbr0 Link encap:Ethernet HWaddr de:49:c5:66:cf:84 inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0 UP BROADCAST MULTICAST MTU:1500 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) 

我禁用了lxcbr0(/ etc / default / lxc中的USE_LXC_BRIDGE =“false”)。

 root@host:~# brctl show bridge name bridge id STP enabled interfaces br0 8000.4c72b943652b no eth0 vethtest 

我在我的主机提供商(OVH)configuration面板中将IP 179.43.46.233configuration为指向02:00:00:86:5b:11。
(这篇文章中的知识产权并不是真正的知识产权。)

感谢您阅读这个长期的问题! 🙂

Vianney

    更好的方法是使用sysctl而不是直接写入/ proc,因为这是在运行时configuration内核参数的标准方法,所以在下次启动时它们被正确设置:

     # cat >> /etc/sysctl.d/99-bridge-nf-dont-pass.conf <<EOF net.bridge.bridge-nf-call-ip6tables = 0 net.bridge.bridge-nf-call-iptables = 0 net.bridge.bridge-nf-call-arptables = 0 net.bridge.bridge-nf-filter-vlan-tagged = 0 EOF # service procps start 

    至于你的更新中的问题的答案…

    bridge-netfilter(或者bridge-nf)是为IPv4 / IPv6 / ARP数据包(即使在802.1Q VLAN或PPPoE头部中)提供有状态透明防火墙function的非常简单的桥梁,但是更高级的function,如透明IP NAT通过将这些数据包传递给arptables / iptables进行进一步处理来提供 – 然而,即使不需要更高级的arptables / iptablesfunction,传递数据包到这些程序仍然在内核模块中默认打开,并且必须显式closures使用sysctl。

    他们在这里干什么? 这些内核configuration选项在这里传递(1)或不传递(0)数据包到arptables / iptables中,如bridge-nf FAQ中所述 :

     As of kernel version 2.6.1, there are three sysctl entries for bridge-nf behavioral control (they can be found under /proc/sys/net/bridge/): bridge-nf-call-arptables - pass (1) or don't pass (0) bridged ARP traffic to arptables' FORWARD chain. bridge-nf-call-iptables - pass (1) or don't pass (0) bridged IPv4 traffic to iptables' chains. bridge-nf-call-ip6tables - pass (1) or don't pass (0) bridged IPv6 traffic to ip6tables' chains. bridge-nf-filter-vlan-tagged - pass (1) or don't pass (0) bridged vlan-tagged ARP/IP traffic to arptables/iptables. 

    禁用所有bridge-nf- *是否安全? 是的,这样做不仅安全,而且还build议分发人员在默认情况下将其closures,以帮助人们避免对遇到的问题造成混淆

    在实践中,这可能会导致严重的混淆,有人创build一个桥梁,发现一些交通没有被转发过桥。 由于IP防火墙规则适用于网桥上的帧是非常意外的,因此可能需要相当长的一段时间才能确定发生了什么事情。

    增加安全性

    我仍然认为搭桥风险更高,特别是在虚拟化的情况下。 考虑一个主机上有两个虚拟机的场景,每个虚拟机都有一个专门的桥,目的是既不知道对方的stream量。

    当conntrack作为桥接的一部分运行时,交通现在可以跨越,这是一个严重的安全漏洞。

    更新:2015年5月

    如果你正在运行一个比3.18更早的内核,那么你可能会受到以前默认启用的网桥过滤行为的影响。 如果你比3.18更新,那么如果你已经加载了网桥模块,并且还没有禁用网桥过滤,那么你仍然可以被这个咬伤。 看到:

    https://bugzilla.redhat.com/show_bug.cgi?id=634736#c44

    在所有这些年来,要求“禁用”网桥过滤的默认设置,并且内核维护人员拒绝这个更改,现在过滤已经被移到一个单独的模块中,当桥模块(默认)被加载,有效地使默认“禁用”。 好极了!

    认为这是在3.17内核(它肯定是在内核3.18.7-200.fc21,似乎是在标签之前的git“v3.17-rc4”)

    我有一个在Debian Wheezy hypervisor上运行的类似的设置。 我不需要在容器的rootfs中修改/ etc / network / interfaces; 在LXC的configuration中configurationlxc.network。*就足够了。

    无论您是否在运行集装箱,您都应该能够进行桥接工作。 我在主机上的/ etc / network / interfaces的br0下configuration了以下设置:

     % grep bridge /etc/network/interfaces bridge_ports eth0 bridge_fd 0 bridge_stp off bridge_waitport 0 bridge_maxwait 0 

    configuration完成后,我的IP地址configuration从eth0移动到br0, sudo service networking restart透明地重新configuration我的主机上的接口,而不会丢失我的SSH会话。

    一旦完成,请尝试删除/ etc / network / interfaces中的“eth0”configuration,然后重新启动容器。