iptables NAT实践 -- 如何让私网内的虚拟机被公网访问到

来源:互联网 发布:淘宝卖家打折 编辑:程序博客网 时间:2024/05/29 17:26

在Linux内部通过KVM创建一个虚拟机,通常可以通过SNAT的方式让这个虚拟机访问外网。那么,如果这个虚拟机需要提供一个可以让外网访问的地址,该怎样才能办到呢?这有点像OpenStack Neutron里的Floating IP。实际上的实现机制也和Neutron差不多,都是通过SNAT, DNAT的组合来实现。不同的是这里不会用到Open vSwitch。


具体的实现步骤如下:

1. 实际的试验环境时RHEL 7。由于RHEL 7缺省使用firewalld,所以需要停止firewalld服务:

# systemctl stop firewalld# systemctl disable firewalld

2. 参考http://blog.csdn.net/zhangli_perdue/article/details/50436164创建一个虚拟机,并且通过DHCP获得IP地址。


3. 这时候查看iptables规则,发现多出了一条,如下:

# iptables-save*nat:PREROUTING ACCEPT [0:0]:INPUT ACCEPT [0:0]:OUTPUT ACCEPT [2:134]:POSTROUTING ACCEPT [2:134]-A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j MASQUERADE

==> 规则"-A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j MASQUERADE"表示所以从虚拟机私网10.0.0.1/24出发到其它网段的IP包都会被iptables修改其源地址为宿主机的网卡IP地址,这实际上就是一个SNAT,MASQUERADE是为了匹配宿主机网卡上变化的IP地址。加入宿主机的IP地址是192.168.100.41,那么这条规则也可以是"-A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j SNAT --to-source 192.168.100.41"。正是这条规则结合"net.ipv4.ip_forward = 1"使得虚拟机可以访问外网。


4. 为了让虚拟机能够被外网访问到,我们需要暴露虚拟机的IP地址给外网,可是虚拟机的实际IP地址是在私网内,是无法被外网直接访问的。这时候就用到了iptables的DNAT功能。假设虚拟机的私网IP地址是10.0.0.117,那么我们需要添加如下DNAT规则:

# iptables -t nat -A PREROUTING -d 192.168.100.100/32 -j DNAT --to-destination 10.0.0.117# iptables -t nat -A OUTPUT -d 192.168.100.100/32 -j DNAT --to-destination 10.0.0.117# iptables-save*nat:PREROUTING ACCEPT [7:533]:INPUT ACCEPT [2:137]:OUTPUT ACCEPT [1:59]:POSTROUTING ACCEPT [5:323]-A PREROUTING -d 192.168.100.100/32 -j DNAT --to-destination 10.0.0.117-A OUTPUT -d 192.168.100.100/32 -j DNAT --to-destinatio 10.0.0.177-A POSTROUTING -s 10.0.0.0/24 ! -d 10.0.0.0/24 -j MASQUERADE

==> 规则"-A PREROUTING -d 192.168.100.100/32 -j DNAT --to-destination 10.0.0.117"表示所有宿主机接收到的目标地址为192.168.100.100的IP包,都会被iptables修改其目标地址为10.0.0.117,然后进行路由。规则"-A OUTPUT -d 192.168.100.100/32 -j DNAT --to-destination 10.0.0.117"表示所有宿主机发出的目标地址为192.168.100.100的IP包,都会被iptables修改其目标地址为10.0.0.117,然后发出,这一条规则主要是为了让宿主机能通过192.168.100.100这个浮动IP地址来访问虚拟机。


5. 这个时候我们已经可以在宿主机上通过192.168.100.100这个浮动IP地址来访问虚拟机了。但是,如果想从外网访问虚拟机还是不行,因为192.168.100.100这个浮动IP并不对外网可见。这就需要在宿主机上创建一个虚拟网卡,并且把192.168.100.100这个浮动IP分配给它。如下:

# ip tuntap add tap-fip mode tap# ip link set tap-fip up# ifconfig tap-fip 192.168.100.100 netmask 255.255.255.0 up
之后就可以在外网访问虚拟机了




0 0
原创粉丝点击