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之后就可以在外网访问虚拟机了
- iptables NAT实践 -- 如何让私网内的虚拟机被公网访问到
- CentOS6下NAT模式访问公网
- ARM 虚拟机使用同一个公共 IP 访问公网的解决方案
- ARM 虚拟机使用同一个公共 IP 访问公网的解决方案
- 虚拟机网络访问-nat
- 局域网中如何访问其他主机上NAT方式的虚拟机
- NAT连接的虚拟机提供web服务,如何让HOST同一局域网机器访问
- iptables的NAT配置
- iptables的NAT设置
- 如何在虚拟机nat模式下访问虚拟主机
- centos服务器关闭iptables防火墙后仍然无法通过公网ip访问http端口的问题
- 如何配置IIS让自己的网站在公网上被访问
- 如何知道一个nat后面的机器的公网ip是什么
- NAT端口映射让外网访问虚拟机
- 通过ssh访问NAT网络模式虚拟机里的Linux
- Windows访问VMware Workstation中通过NAT联网的虚拟机
- VMware虚拟机NAT网络模式通过SSH访问的配置
- 通过ssh访问NAT网络模式下的虚拟机Linux
- JavaScript面向对象编程实战
- Raycast 的使用方法
- 嵌入式Linux系统连不上外网,也ping不通外网解决办法
- Invalid result location value/parameter 解决办法
- Mac tomcat 配置
- iptables NAT实践 -- 如何让私网内的虚拟机被公网访问到
- appium实现功能自动化测试
- unity3d发布Android程序
- java spring mvc 上传
- iOS 开发之#Import #include @class区别
- jquery添加移除style/css属性
- UI控件学习前言
- AspxGridView使用教程
- 苹果软件通过web接口获取应用程序信息,版本号,程序名等