ที่อยู่ IP สาธารณะสำหรับคอนเทนเนอร์ LXC


26

ตกลงดังนั้นฉันต้องการทราบวิธีการทำเครือข่ายบนภาชนะบรรจุ LXC ไม่ใช่เพียงแค่ข้อมูลที่คลุมเครือที่คุณได้รับจากเว็บไซต์อื่น ๆ แต่เป็นแนวทางสำหรับผู้เริ่มต้นที่แท้จริงในการทำให้พวกเขาทำงาน .. เนื่องจากตัวอย่างส่วนใหญ่มีการตั้งค่าโดยทั่วไปสำหรับผู้ที่ต้องการทดสอบด้วยฉันต้องการเรียกใช้บริการหนึ่ง ... เว็บเซิร์ฟเวอร์เช่น

ฉันใช้ Ubuntu 12.04 LTS และฉันติดตั้ง LXC และฉันสามารถสร้างเริ่มต้นและหยุดคอนเทนเนอร์ได้ เซิร์ฟเวอร์ของฉันมี IP สาธารณะที่เห็นได้ชัดและฉันต้องการทราบวิธีการตั้งค่าคอนเทนเนอร์เพื่อให้สามารถมี IP สาธารณะได้เช่นกัน เนื่องจากดูเหมือนว่ามีบริดจ์อยู่แล้วจากคอนเทนเนอร์ปัจจุบันของฉันดูเหมือนว่าฉันอาจต้องให้ช่วง DHCP ของคอนเทนเนอร์ที่เป็นสาธารณะสำหรับพวกเขาในการทำงานหรือกำหนดที่อยู่ IP แบบคงที่ให้กับคอนเทนเนอร์ของฉันด้วยตนเอง

หากฉันต้องการกำหนด IP ให้กับคอนเทนเนอร์แบบสแตติกฉันจะทำอย่างไร ฉันต้องทำการเปลี่ยนแปลงใด ๆ กับการกำหนดค่าบริดจ์ของฉันบนโฮสต์หรือไม่ จริง ๆ แล้วมันจะดีกว่าที่จะทำกับตัวเลือก MACVLAN?

ความช่วยเหลือใด ๆ ที่จะได้รับการชื่นชม


ฉันไม่คุ้นเคยกับ LXC แต่โดยทั่วไปแล้ว isp ของคุณจะให้ที่อยู่ IP สาธารณะเดียวเท่านั้น คุณมีแพ็คเกจที่มี ips คงที่หลายตัวหรือไม่?
wlraider70

IP ที่เปิดเผยต่อสาธารณะไม่ได้เป็นกรณีใช้งานเพียงอย่างเดียวเราต้องการให้ IP สาธารณะ 2 ตัวได้รับการกำหนดให้กับคอนเทนเนอร์โหลดบาลานเซอร์ของเรา แต่เราต้องการ LAN IP เฉพาะที่ทุ่มเทให้กับบริการอื่น ๆ ที่หลากหลาย ด้วยวิธีนี้ถ้าเราย้ายคอนเทนเนอร์ไปรอบ ๆ บนฮาร์ดแวร์ที่แตกต่างกันมันง่ายเหมือนกับการย้าย IP (DNS ไม่ทำงานในแง่นี้สำหรับส่วนประกอบบางอย่างที่เราใช้)
David Parks

คำตอบ:


23

วิธีการของฉันถือว่าเซิร์ฟเวอร์ของคุณมี NIC เดียวและคุณต้องแชร์ NIC นั้นระหว่างโฮสต์และแขก LXC เรื่องนี้เกี่ยวข้องกับการใช้สะพาน eth0สะพานเจ้าของและผู้บริหาร เจ้าภาพในขณะนี้กำหนดค่าเครือข่ายของตัวเองบนแทนbr0 eth0แขกของ LXC ได้รับการกำหนดค่าให้เชื่อมต่อกับสะพาน

  1. ในโฮสต์, sudo apt-get install bridge-utils.

  2. บนโฮสต์ให้แทนที่eth0ด้วยบริดจ์:

    สิ่งนี้เป็นอันตราย ทำสิ่งนี้ผิดและคุณอาจถูกล็อคออกจากเซิร์ฟเวอร์ของคุณ ตรวจสอบให้แน่ใจว่าได้เปิดใช้งานการเข้าสู่ระบบในเครื่องและการเข้าถึงคอนโซลท้องถิ่นนั้นทำงานเพื่อให้คุณสามารถยกเลิกการเปลี่ยนแปลงนี้ได้หากคุณมีปัญหาใด ๆ

    ใน/etc/network/interfaces:

    1. แทนที่ด้วยauto eth0auto br0
    2. แทนที่:

      iface eth0 inet dhcp
      

      ด้วย:

      iface br0 inet dhcp
          bridge_ports eth0
      

      หากคุณมีการกำหนดค่าเครือข่ายแบบคงที่คุณจะต้องแทนที่:

      iface eth0 inet static
          address ...
          netmask ...
          gateway ...
          etc.
      

      ด้วย:

      iface br0 inet static
          bridge_ports eth0
          address ...
          netmask ...
          gateway ...
          etc.
      

      คุณเพียงแค่เปลี่ยนeth0สำหรับbr0และเพิ่มbridge_ports eth0บรรทัด

    3. รีบูตโฮสต์ หากคุณทำสิ่งนี้ในพื้นที่จากนั้นเรียกใช้sudo ifdown eth0ก่อนที่คุณจะเริ่มและsudo ifup br0หลังจากนั้นก็จะทำเช่นกัน โปรดทราบว่าสะพานอาจใช้เวลาเล็กน้อยในการขึ้นมาดังนั้นให้เวลาห้านาทีหลังจากรีบูตก่อนที่คุณจะคิดว่าทุกอย่างหายไป

  3. หากต้องการย้ายคอนเทนเนอร์ LXC ชื่อที่กำหนดให้ไปที่ IP สาธารณะ:

    1. หยุดภาชนะ
    2. บนโฮสต์แก้ไขและการเปลี่ยนแปลงไป/var/lib/lxc/container_name/configlxc.network.linkbr0
    3. บนโฮสต์ให้แก้ไขและกำหนดค่า IP สาธารณะของคุณตามปกติ (DHCP หรือการกำหนดค่าคงที่ตามต้องการ) โปรดทราบว่าอินเตอร์เฟสยังคงถูกเรียกใช้จากมุมมองของคอนเทนเนอร์/var/lib/lxc/container_name/rootfs/etc/network/interfaceseth0
    4. รีสตาร์ทคอนเทนเนอร์
  4. การเปลี่ยนค่าเริ่มต้นสำหรับภาชนะบรรจุ LXC ใหม่แก้ไข/etc/lxc/default.confในพื้นที่และการเปลี่ยนแปลงไปlxc.network.linkbr0

  5. หากคุณไม่จำเป็นต้อง LXC ที่ให้สะพาน NAT ที่ทุกคน (ie. ภาชนะทั้งหมดของคุณจะใช้สะพานใหม่แทน) จากนั้นในการแก้ไขโฮสต์/etc/default/lxcและการเปลี่ยนแปลงUSE_LXC_BRIDGEไปแล้วในการเรียกใช้โฮสต์"false"sudo service lxc restart


ขอบคุณ! มีคำถามที่คล้ายกันมากมายรอบตัว แต่ในที่สุดคำตอบนี้ก็ช่วยให้ฉันทำงานได้ดีขึ้น
Mausy5043

1

Robie ขอบคุณมากสำหรับการโพสต์คำตอบนี้ฉันพยายามดึงผมออกไปและนี่เป็นวิธีเดียวที่ได้ผล!

ฉันคิดว่าฉันควรพูดถึงบางสิ่งที่ฉันคิดออกเพื่อช่วยชี้แจงคำแนะนำสำหรับผู้ดูแลระบบคนอื่น

โฮสต์ของฉันมีชื่อแทน ip แบบคงที่หลายตัวที่กำหนดให้กับ eth0 บนแขกเช่น:

iface eth0:1 inet static
  address 5.5.5.5
  netmask 255.255.255.5
  gateway 5.5.5.1
etc.

ตอนนี้เราไม่ต้องการตั้งค่า br0 ด้วยวิธีเดียวกันเราแค่ต้องการ IP เดียวที่ไม่มีนามแฝงเหมือน Robie ที่ระบุไว้ด้านบน

สมมุติว่าคุณต้องการ 5.5.5.5 ที่จะถูกกำหนดให้กับคอนเทนเนอร์ debian8

แก้ไข/var/lib/lxc/debian8/etc/network/interfacesและเพิ่ม:

iface eth0 inet static 
      address 5.5.5.5
      netmask 255.255.255.5
      gateway 5.5.5.1
    etc.

จากนั้นออกคำสั่งนี้: route add default gw <gateway-ip, in my case 5.5.5.1>

หลังจากนั้นให้รีบูตคอนเทนเนอร์และทุกอย่างจะทำงานได้ในที่สุด! :)


1

ฉันมีปัญหาเดียวกันและฉันมีทางออกนี้ (รวดเร็วและสกปรก)

server: eth0 = 10.1.0.77/24
server: lxdbr0 (lxd bridge) = 10.255.255.77/24

container: eth0 = 10.255.255.100/24 (same network as lxdbr0)
container: eth0:0 = 194.99.99.99/28  (public ip address on eth0 alias)

บนเซิร์ฟเวอร์: route add -host 194.99.99.99 gw 10.255.255.100 dev lxdbr0

นอกจากนี้หากจำเป็นต้องเพิ่มเส้นทางไปยังเราเตอร์อัปสตรีม

อาจไม่ใช่ทางออกที่ดีที่สุด แต่ไม่ต้องใช้ความพยายามมาก! ไชโย

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.