Iptables
通過 iptables 和虛擬介面進行 NAT
我正在嘗試實現以下場景:一個虛擬機主機,多個來賓虛擬機,每個虛擬機都有自己的 IP 地址(和域)。
我們的伺服器只有一個物理介面,因此預期用途是在 eth0 上添加虛擬介面。為了使我們的情況復雜化,提供商在他們的交換機上使用埠安全,所以我不能在橋接模式下執行來賓介面,因為交換機會檢測到“欺騙”的 MAC 地址並終止介面(永久地,迫使我打電話支持,我相信第三次會讓他們有點生氣;))。
我的第一個猜測是使用 iptables 和 NAT 將所有包從一個虛擬介面轉發到另一個虛擬介面,但 iptables 似乎不喜歡虛擬介面(至少我無法讓它正常工作)。所以我的第二個猜測是使用包的源IP到公共介面。
假設 libvirt 創建了一個 virbr0 網路,其地址為 192.168.100.0/24,來賓使用 192.168.100.2 作為 IP 地址。
這是我嘗試使用的:
iptables -t nat -I PREROUTING --src public_ip_on_eth0:0 -p tcp --dport 80 -j DNAT --to-destination 192.168.100.2:80
這也沒有給我預期的結果(訪問伺服器超時)。
有沒有辦法做我想做的事情,甚至可以將所有流量路由到虛擬機設備的虛擬介面上的某個 IP?
要像這樣使用 DNAT,您需要您的來賓系統將 VM-host 作為預設網關。
我有一個類似的網路配置,我使用了這個配置:
localnetwork (192.168.0.0/24) <-> host eth0 (192.168.0.10) host tun0 (192.168.1.150) <-> vm1 eth0 (192.168.1.200) gw 192.168.1.150 <-> vm2 eth0 (192.168.1.201) gw 192.168.1.150
我所有的虛擬機都可以相互 ping 通,並且可以使用以下 iptable 規則訪問外部網路:
Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 192.168.1.0/24 0.0.0.0/0 to:192.168.0.10
外部網路可以使用以下規則訪問我的虛擬機上的服務:
Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:22200 to:192.168.1.200:22 DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:22201 to:192.168.1.201:22 DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:3389 to:192.168.1.202:3389 DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:443 to:192.168.1.206:443 DNAT tcp -- 0.0.0.0/0 192.168.0.10 tcp dpt:80 to:192.168.1.206:80
我在 debian 的文件 /etc/network/interfaces 中用這些行配置了 tun0 介面:
auto tun0 iface tun0 inet static address 192.168.1.150 netmask 255.255.255.0 pre-up tunctl -g uml-net -t tun0 post-down tunctl -d tun0