Kết nối các container LXC để lưu trữ eth0 để chúng có thể có IP công cộng


8

CẬP NHẬT:

Tôi đã tìm thấy giải pháp ở đó: http://www.linuxfoundation.org/collabISE/workgroups/networking/bridge#No_traffic_gets_trough_.28except_kv_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

Nhưng tôi muốn có ý kiến ​​chuyên gia về vấn đề này: có an toàn để vô hiệu hóa tất cả các cầu nối-nf- * không? Họ ở đây để làm gì?

KẾT THÚC CẬP NHẬT

Tôi cần kết nối các container LXC với giao diện vật lý (eth0) của máy chủ của mình, đọc nhiều hướng dẫn, tài liệu và bài đăng trên blog về chủ đề này.

Tôi cần các container để có IP công cộng của riêng họ (mà trước đây tôi đã thực hiện KVM / libvirt).

Sau hai ngày tìm kiếm và thử, tôi vẫn không thể làm cho nó hoạt động với các thùng chứa LXC.

Máy chủ chạy Ubuntu Server Quantal mới được cài đặt (12.10) chỉ với libvirt (mà tôi không sử dụng ở đây) và lxc được cài đặt.

Tôi đã tạo các container với:

lxc-create -t ubuntu -n mycontainer

Vì vậy, họ cũng chạy Ubuntu 12.10.

Nội dung của / var / lib / lxc / mycontainer / config là:


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

Sau đó, tôi đã thay đổi máy chủ / etc / mạng / giao diện của mình thành:


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

Khi tôi thử cấu hình dòng lệnh ("brctl addif", "ifconfig eth0", v.v.) máy chủ từ xa của tôi không thể truy cập được và tôi phải khó khởi động lại nó.

Tôi đã thay đổi nội dung của / var / lib / lxc / mycontainer / rootfs / etc / network / giao diện thành:


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

Phải mất vài phút để mycontainer bắt đầu (lxc-start -n mycontainer).

Tôi đã thử thay thế

        gateway 92.281.86.254
bởi:

        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

Container của tôi sau đó bắt đầu ngay lập tức.

Nhưng bất kỳ cấu hình nào tôi đặt trong / var / lib / lxc / mycontainer / rootfs / etc / network / giao diện, tôi không thể ping từ mycontainer sang bất kỳ IP nào (bao gồm cả máy chủ lưu trữ):


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

Và máy chủ của tôi không thể ping container:


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 của tôi chứa:


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 của máy chủ của tôi:


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)

Tôi đã tắt lxcbr0 (USE_LXC_BRIDGE = "false" trong / etc / default / lxc).


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

Tôi đã cấu hình IP 179.43.46.233 để trỏ đến 02: 00: 00: 86: 5b: 11 trong bảng cấu hình nhà cung cấp dịch vụ lưu trữ (OVH) của tôi.
(Các IP trong bài đăng này không phải là IP thực.)

Cảm ơn đã đọc câu hỏi dài này! :-)

Vianney

Câu trả lời:


6

Cách tốt hơn để thay đổi vĩnh viễn là sử dụng sysctl thay vì ghi trực tiếp vào / Proc vì đó là cách tiêu chuẩn để định cấu hình các tham số kernel khi chạy để chúng được đặt chính xác trong lần khởi động tiếp theo:

# 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

Đối với câu trả lời cho câu hỏi trong bản cập nhật của bạn ...

Bridge-netfilter (hoặc Bridge-nf) là một cầu nối rất đơn giản cho các gói IPv4 / IPv6 / ARP (ngay cả trong các tiêu đề Vlan hoặc PPPoE 802.1Q) cung cấp chức năng cho tường lửa trong suốt, nhưng chức năng nâng cao hơn như IP NAT trong suốt được cung cấp bằng cách chuyển các gói đó đến arptables / iptables để xử lý thêm-- tuy nhiên ngay cả khi các tính năng nâng cao hơn của arptables / iptables là không cần thiết, việc chuyển các gói đến các chương trình đó vẫn được bật theo mặc định trong mô-đun hạt nhân và phải được tắt rõ ràng sử dụng hệ thống.

Họ ở đây để làm gì? Các tùy chọn cấu hình kernel này ở đây để chuyển (1) hoặc không chuyển (0) gói tới arptables / iptables như được mô tả trong FAQ-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.

Có an toàn để vô hiệu hóa tất cả các cầu-nf- *? Có, nó không chỉ an toàn để làm như vậy, nhưng có một khuyến nghị cho các bản phân phối tắt nó theo mặc định để giúp mọi người tránh nhầm lẫn cho loại vấn đề bạn gặp phải:

Trong thực tế, điều này có thể dẫn đến sự nhầm lẫn nghiêm trọng khi ai đó tạo ra một cây cầu và thấy rằng một số lưu lượng truy cập không được chuyển tiếp qua cầu. Vì thật bất ngờ khi các quy tắc tường lửa IP áp dụng cho các khung trên một cây cầu, nên có thể mất khá nhiều thời gian để tìm hiểu điều gì đang xảy ra.

và để tăng tính bảo mật :

Tôi vẫn nghĩ rằng rủi ro với việc bắc cầu sẽ cao hơn, đặc biệt là trong sự hiện diện của ảo hóa. Hãy xem xét kịch bản nơi bạn có hai máy ảo trên một máy chủ, mỗi máy chủ có một cây cầu chuyên dụng với ý định không nên biết gì về lưu lượng của máy chủ kia.

Với conntrack hoạt động như một phần của cầu nối, giao thông giờ đây có thể vượt qua, đây là một lỗ hổng bảo mật nghiêm trọng.

CẬP NHẬT: Tháng 5 năm 2015

Nếu bạn đang chạy kernel cũ hơn 3.18, thì bạn có thể phải tuân theo hành vi cũ của lọc cầu được bật theo mặc định; nếu bạn mới hơn 3.18, thì bạn vẫn có thể bị cắn bởi điều này nếu bạn đã tải mô-đun cầu và không tắt tính năng lọc cầu. Xem:

https://ormszilla.redhat.com/show_orms.cgi?id=634736#c44

Sau tất cả những năm yêu cầu mặc định bộ lọc cầu bị "vô hiệu hóa" và thay đổi bị từ chối bởi các nhà duy trì hạt nhân, giờ đây bộ lọc đã được chuyển sang một mô-đun riêng không được tải (theo mặc định) khi mô-đun cầu được tải, làm cho "vô hiệu hóa" mặc định. Yay!

Tôi nghĩ rằng đây là trong kernel kể từ 3.17 (Nó chắc chắn nằm trong kernel 3.18.7-200.fc21 và dường như nằm trong git trước thẻ "v3.17-rc4")


0

Tôi đã có một thiết lập tương tự chạy trên trình ảo hóa Wheezy Debian. Tôi đã không phải sửa đổi / etc / mạng / giao diện trong rootfs của container; có lxc.network. * được cấu hình trong cấu hình của LXC là đủ.

Bạn sẽ có thể làm cho cầu nối hoạt động bất kể bạn có đang chạy container hay không. Tôi có các cài đặt sau được định cấu hình trong br0 in / etc / network / interface trên máy chủ:

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

Sau khi định cấu hình này và chuyển cấu hình địa chỉ IP của tôi từ eth0 sang br0, sudo service networking restartcấu hình lại một cách trong suốt các giao diện trên máy chủ của tôi mà không bỏ phiên SSH của tôi.

Khi đã xong, hãy thử xóa cấu hình 'eth0' trong / etc / mạng / giao diện và khởi động lại bộ chứa của bạn.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.