強制 LXC 容器使用自己的 IP 地址
對不起,如果這個問題已經被問過。我找不到它,我有這個設置:
+---------------------------------------------------------------------------------------------+ |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 | | | | +-------------------+ | +------------------+ | | +-------------------------------------------------+ | +---------------------------------------------------------------------------------------------+
- 移除 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
出於某種原因,這不起作用(將不勝感激編輯/評論)
解決方案是配置 a
routed 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。