Iptables

通過 iptables 和虛擬介面進行 NAT

  • March 11, 2013

我正在嘗試實現以下場景:一個虛擬機主機,多個來賓虛擬機,每個虛擬機都有自己的 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

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