Menjembatani wadah LXC dengan host eth0 sehingga mereka dapat memiliki IP publik

8

MEMPERBARUI:

Saya menemukan solusinya di sana: 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

Tapi saya ingin memiliki pendapat ahli tentang ini: apakah aman untuk menonaktifkan semua bridge-nf- *? Untuk apa mereka di sini?

AKHIR PEMBARUAN

Saya perlu menjembatani kontainer LXC dengan antarmuka fisik (eth0) dari host saya, membaca banyak tutorial, dokumen, dan posting blog tentang subjek tersebut.

Saya membutuhkan wadah untuk memiliki IP publik mereka sendiri (yang sebelumnya telah saya lakukan KVM / libvirt).

Setelah dua hari mencari dan mencoba, saya masih tidak bisa membuatnya bekerja dengan wadah LXC.

Tuan rumah menjalankan Ubuntu Server Quantal (12.10) yang baru diinstal dengan hanya libvirt (yang saya tidak gunakan di sini) dan lxc diinstal.

Saya membuat wadah dengan:

lxc-create -t ubuntu -n mycontainer

Jadi mereka juga menjalankan Ubuntu 12.10.

Konten dari / var / lib / lxc / mycontainer / config adalah:


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

Kemudian saya mengubah host / etc / network / interfaces saya ke:


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

Ketika saya mencoba konfigurasi baris perintah ("brctl addif", "ifconfig eth0", dll.) Host jarak jauh saya menjadi tidak dapat diakses dan saya harus mem-boot ulang harddisk.

Saya mengubah konten / var / lib / lxc / mycontainer / rootfs / etc / network / interfaces menjadi:


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

Dibutuhkan beberapa menit untuk mycontainer untuk memulai (lxc-start -n mycontainer).

Saya mencoba mengganti

        gateway 92.281.86.254
oleh :

        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

Wadah saya kemudian mulai secara instan.

Tetapi konfigurasi apa pun yang saya atur di / var / lib / lxc / mycontainer / rootfs / etc / network / interfaces, saya tidak bisa melakukan ping dari mycontainer ke IP apa pun (termasuk host):


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

Dan tuan rumah saya tidak dapat melakukan ping kontainer:


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 penampung saya:


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 host saya:


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)

Saya telah menonaktifkan lxcbr0 (USE_LXC_BRIDGE = "false" di / etc / default / lxc).


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

Saya telah mengkonfigurasi IP 179.43.46.233 untuk menunjuk ke 02: 00: 00: 86: 5b: 11 di panel konfigurasi penyedia hosting saya (OVH).
(IP dalam posting ini bukan yang asli.)

Terima kasih telah membaca pertanyaan panjang ini! :-)

Vianney

Vianney Stroebel
sumber

Jawaban:

6

Cara yang lebih baik untuk membuat perubahan Anda permanen adalah dengan menggunakan sysctl daripada langsung menulis ke / proc karena itu adalah cara standar untuk mengkonfigurasi parameter kernel saat runtime sehingga mereka ditetapkan dengan benar pada boot berikutnya:

# 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

Adapun jawaban atas pertanyaan di pembaruan Anda ...

bridge-netfilter (atau bridge-nf) adalah jembatan yang sangat sederhana untuk paket IPv4 / IPv6 / ARP (bahkan dalam header VLAN atau PPPoE 802.1Q) yang menyediakan fungsionalitas untuk firewall transparan stateful, tetapi fungsi yang lebih canggih seperti IP NAT transparan adalah disediakan dengan meneruskan paket-paket itu ke arptables / iptables untuk diproses lebih lanjut - namun bahkan jika fitur arptables / iptables yang lebih canggih tidak diperlukan, meneruskan paket ke program-program tersebut masih diaktifkan secara default di modul kernel dan harus dimatikan secara eksplisit menggunakan sysctl.

Untuk apa mereka di sini? Opsi-opsi konfigurasi kernel ini ada di sini untuk meneruskan (1) atau tidak mengirimkan (0) paket ke arptables / iptables seperti dijelaskan dalam FAQ bridge-nf :

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.

Apakah aman untuk menonaktifkan semua bridge-nf- *? Ya, tidak hanya aman untuk melakukannya, tetapi ada rekomendasi untuk distribusi untuk mematikannya secara default untuk membantu orang menghindari kebingungan untuk jenis masalah yang Anda temui:

Dalam praktiknya, ini dapat menyebabkan kebingungan serius di mana seseorang membuat jembatan dan menemukan bahwa beberapa lalu lintas tidak diteruskan melintasi jembatan. Karena begitu tak terduga bahwa aturan firewall IP berlaku untuk bingkai di jembatan, perlu beberapa saat untuk mengetahui apa yang terjadi.

dan untuk meningkatkan keamanan :

Saya masih berpikir risiko dengan menjembatani lebih tinggi, terutama di hadapan virtualisasi. Pertimbangkan skenario di mana Anda memiliki dua VM di satu host, masing-masing dengan jembatan khusus dengan maksud bahwa tidak ada yang tahu apa-apa tentang lalu lintas yang lain.

Dengan conntrack berjalan sebagai bagian dari jembatan, lalu lintas sekarang dapat menyeberang yang merupakan lubang keamanan yang serius.

PEMBARUAN: Mei 2015

Jika Anda menjalankan kernel yang lebih tua dari 3.18, maka Anda mungkin akan mengalami perilaku penyaringan jembatan yang diaktifkan secara default; jika Anda lebih baru dari 3.18, maka Anda masih dapat digigit oleh ini jika Anda telah memuat modul jembatan dan belum menonaktifkan penyaringan jembatan. Lihat:

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

Setelah bertahun-tahun meminta default penyaringan jembatan menjadi "dinonaktifkan" dan perubahan ditolak oleh pengelola kernel, sekarang penyaringan telah dipindahkan ke modul terpisah yang tidak dimuat (secara default) ketika modul jembatan dimuat, secara efektif membuat default "dinonaktifkan". Yay!

Saya pikir ini ada di kernel pada 3.17 (Sudah pasti ada di kernel 3.18.7-200.fc21, dan tampaknya ada di git sebelum tag "v3.17-rc4")

aculich
sumber
0

Saya punya set up serupa menjalankan pada hypervisor Debian Wheezy. Saya tidak perlu memodifikasi / etc / network / interfaces di dalam rootfs yang ada di dalamnya; memiliki lxc.network. * terkonfigurasi dalam konfigurasi LXC sudah cukup.

Anda harus bisa menjembatani pekerjaan terlepas dari apakah Anda menjalankan wadah atau tidak. Saya memiliki pengaturan berikut yang dikonfigurasi di bawah br0 di / etc / network / interfaces pada host:

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

Setelah mengkonfigurasi ini dan memindahkan konfigurasi alamat IP saya dari eth0 ke br0, secara sudo service networking restarttransparan mengkonfigurasi ulang antarmuka pada mesin host saya tanpa menjatuhkan sesi SSH saya.

Setelah selesai, coba hapus konfigurasi 'eth0' di / etc / network / interfaces dan mulai ulang wadah Anda.

Murali Suriar
sumber