Ip

強制 LXC 容器使用自己的 IP 地址

  • June 3, 2014

對不起,如果這個問題已經被問過。我找不到它,我有這個設置:

+---------------------------------------------------------------------------------------------+
|HOST                                                                                         |
|                                                                                             |
| +-------------------------------------------------+                                         |
| | UBUNTU-VM                                       |                                         |
| |                                                 |                                         |
| | +-------------------+                           |                                         |
| | |UBUNTU-LXC         |                           |                   +------------------+  |
| | |       10.0.0.3/24 |  10.0.0.1/24              |                   |OTHER VM          |  |
| | |               eth0-----lxcbr0----------eth0-----------br0----------eth0              |  |
| | |                   |           192.168.100.2/24|  192.168.100.1/24 |192.168.100.3/24  |  |
| | +-------------------+                           |                   +------------------+  |
| +-------------------------------------------------+                                         |
+---------------------------------------------------------------------------------------------+

當我從我的 UBUNTU-LXC ping 192.168.100.3 時,源 IP 地址被 UBUNTU-VM 自動更改為 192.168.100.2。這就像擁有一個 NAT,而我真的希望我的 UBUNTU-LXC 與它自己的 IP 地址通信。有沒有辦法做到這一點?

編輯:這些資訊可能是相關的:

  • 我正在使用 KVM +libvirt 來設置我的虛擬機
  • 這是我在 UBUNTU-VM 中創建界面的方法

:

<interface type='bridge'>                                                    
 <mac address='52:54:00:cb:aa:74'/>                                         
 <source bridge='br0'/>                                                     
 <model type='e1000'/>                                                      
<address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</interface>                                                                 

終於解決了。這裡是如何。很抱歉這篇很長的文章,但我花了很多時間在這上面,我認為有些人可能對詳細的解決方案感興趣。

設置

+---------------------------------------------------------------------------------------------+
|HOST                                                                                         |
|                                                                                             |
| +-------------------------------------------------+                                         |
| | UBUNTU-VM                                       |                                         |
| |                                                 |                                         |
| | +-------------------+                           |                                         |
| | |UBUNTU-LXC         |                           |                   +------------------+  |
| | |       10.0.0.3/24 |  10.0.0.1/24              |                   |OTHER VM          |  |
| | |               eth0-----lxcbr0----------eth0-----------br0----------eth0              |  |
| | |                   |           192.168.100.2/24|  192.168.100.1/24 |192.168.100.3/24  |  |
| | +-------------------+                           |                   +------------------+  |
| +-------------------------------------------------+                                         |
+---------------------------------------------------------------------------------------------+
  1. 移除 UBUNTU-VM 上的 NAT ======================

我的數據包輸出 UBUNTU-VM 的原因是因為我啟動容器時創建192.168.100.2的預設規則:iptables

root@UBUNTU-VM# iptables -nL -t nat     
Chain PREROUTING (policy ACCEPT)                    
target     prot opt source               destination

Chain INPUT (policy ACCEPT)                         
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)                        
target     prot opt source               destination

Chain POSTROUTING (policy ACCEPT)                   
target     prot opt source               destination
MASQUERADE  all  --  10.0.3.0/24         !10.0.3.0/24 

這條規則基本上說“如果數據包來自子網10.0.3.0/24並且目標在另一個子網中,則更改源 ip”。因此,如果我刪除此規則,我應該能夠使用我的容器 IP 地址 ping 外部。讓我們刪除這條規則:

root@UBUNTU-VM# iptables -D POSTROUTING 1 -t nat

192.168.100.1現在,如果我從我的 LXC 容器 ( ) 執行ping操作,10.0.3.233會發生以下情況:

root@HOST# tcpdump -i br0 -n
12:51:56.174009 IP 10.0.3.233 > 192.168.100.1: ICMP echo request, id 498, seq 1, length 64
12:51:56.174072 ARP, Request who-has 10.0.3.233 tell 192.168.100.1, length 28

ICMP 請求來自我的 LXC ip 地址 :) 但是,br0似乎無法回答。

2.在HOST上添加預設路由

root@HOST# ip route add 10.0.0.0/8 via 192.168.100.2

10.0.0.0/8現在子網的預設網關eth0在 UBUNTU-VM 上。讓我們嘗試 ping :

root@HOST# tcpdump -i br0 -n
14:14:33.885982 IP 10.0.3.233 > 192.168.100.1: ICMP echo request, id 660, seq 14, length 64
14:14:34.884054 ARP, Request who-has 10.0.3.233 tell 192.168.100.1, length 28

它仍然不起作用。不幸的是,我對此沒有任何解釋。最糟糕的是,為什麼要br0為一個甚至不在其子網中的 IP 發出 ARP 請求?至少,我希望 ICMP 請求會被默默地忽略,但是用 ARP 請求來回答是很奇怪的。

3.配置libvirt

3.1。目前配置

br0是我在主機上手動配置的網橋,使用netctl. 在我的 UBUNTU-VM 模板中,我有這個:

<interface type='bridge'>                                                    
  <mac address='52:54:00:cb:aa:74'/>                                         
  <source bridge='br0'/>                                                     
  <model type='e1000'/>                                                      
  <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</interface>     

創建 UBUNTU-VM 時,kvm(或libvirt?)創建一個 veth 對並將它們附加到網橋。

root@HOST# brctl show
bridge name     bridge id               STP enabled     interfaces
br0             8000.fe0000000001       no              vnet1
                                                       vnet2

出於某種原因,這不起作用(將不勝感激編輯/評論)

解決方案是配置 arouted network而不僅僅是bridged network.

3.2. 定義網路

為您的網路創建一個 xml 模板:

<network>                                                       
 <name>vms</name>                                              
 <uuid>f3e18be1-41fe-4f34-87b4-f279f4a02254</uuid>             
 <forward mode='route'/>                                       
 <bridge name='br0' stp='on' delay='0'/>                       
 <mac address='52:54:00:86:f3:04'/>                            
 <ip address='192.168.100.1' netmask='255.255.255.0'>          
 </ip>                                                         
 <route address='10.0.0.0' prefix='8' gateway='192.168.100.2'/>
</network>                                                      

注意預設路由節。然後獲取並啟動它

virsh # define vms.xml
virsh # net-start vms

3.3. 編輯虛擬機

界面現在應該如下所示:

<interface type='network'>                                                   
 <mac address='52:54:00:cb:aa:74'/>                                         
 <source network='vms'/>                                                    
 <model type='e1000'/>                                                      
 <address type='pci' domain='0x0000' bus='0x00' slot='0x09' function='0x0'/>
</interface>                                                                 

最後一個考試

重新啟動 VM 和容器後,我終於可以br0使用 LXC 容器 ip 進行 ping 操作:

root@HOST# tcpdump -i br0 -n
14:24:00.349856 IP 10.0.3.233 > 192.168.100.1: ICMP echo request, id 468, seq 16, length 64
14:24:00.349900 IP 192.168.100.1 > 10.0.3.233: ICMP echo reply, id 468, seq 16, length 64

剩下的問題

  • 為什麼這個 ARP 請求在2.
  • 為什麼我的設置不起作用,除非我讓 libvirt 處理網橋和路由本身?我的ip route add手動配置(用netctl 創建網橋,並用?
  • 我是否能夠通過此設置擴展容器的數量(這是我的最終目標)。

有幫助的來源

  • libvirt 網路文件
  • 當我有足夠的聲譽時,我將編輯並添加其他連結(它需要 10…)

將 libvirt 網路的網路描述更改為不執行 nat。

從 VM 主機執行virsh net-list

然後virsh net-edit是虛擬機所在的網路以刪除 natting。

引用自:https://serverfault.com/questions/601310