对照IBM的OpenStack iptables资料学习NAT表中加入的相关规则。 1 root@eccp-compute-01:~# iptables-save -t nat 2 # Generated by iptables-save v1.4.12 on Sat Jan 4 20:16:24 2014 3 *nat 4 :PREROUTING ACCEPT [7378:919387] 5 :INPUT ACCEPT [2512:743782] 6 :OUTPUT ACCEPT [97738:5874282] 7 :POSTROUTING ACCEPT [94602:5677886] 8 :nova-api-OUTPUT - [0:0] 9 :nova-api-POSTROUTING - [0:0] 10 :nova-api-PREROUTING - [0:0] 11 :nova-api-float-snat - [0:0] 12 :nova-api-snat - [0:0] 13 :nova-compute-OUTPUT - [0:0] 14 :nova-compute-POSTROUTING - [0:0] 15 :nova-compute-PREROUTING - [0:0] 16 :nova-compute-float-snat - [0:0] 17 :nova-compute-snat - [0:0] 18 :nova-network-OUTPUT - [0:0] 19 :nova-network-POSTROUTING - [0:0] 20 :nova-network-PREROUTING - [0:0] 21 :nova-network-float-snat - [0:0] 22 :nova-network-snat - [0:0] 23 :nova-postrouting-bottom - [0:0] 24 -A PREROUTING -j nova-network-PREROUTING 25 -A PREROUTING -j nova-compute-PREROUTING 26 -A PREROUTING -j nova-api-PREROUTING 27 -A OUTPUT -j nova-network-OUTPUT 28 -A OUTPUT -j nova-compute-OUTPUT 29 -A OUTPUT -j nova-api-OUTPUT 30 -A POSTROUTING -j nova-network-POSTROUTING 31 -A POSTROUTING -j nova-compute-POSTROUTING 32 -A POSTROUTING -j nova-api-POSTROUTING 33 -A POSTROUTING -s 192.168.122.0/24 -d 224.0.0.0/24 -j RETURN 34 -A POSTROUTING -s 192.168.122.0/24 -d 255.255.255.255/32 -j RETURN 35 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p tcp -j MASQUERADE --to-ports 1024-65535 36 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -p udp -j MASQUERADE --to-ports 1024-65535 37 -A POSTROUTING -s 192.168.122.0/24 ! -d 192.168.122.0/24 -j MASQUERADE 38 -A POSTROUTING -j nova-postrouting-bottom 39 -A POSTROUTING -o br100 -j MASQUERADE 40 -A nova-api-snat -j nova-api-float-snat 41 -A nova-compute-snat -j nova-compute-float-snat 42 -A nova-network-OUTPUT -d 10.0.75.15/32 -j DNAT --to-destination 10.1.10.6 -> 从本机出来的目的为10.0.75.15的包都发给10.1.10.6,保证本机的程序能够通过浮动ip访问虚拟机 43 -A nova-network-POSTROUTING -s 10.0.0.0/20 -d 10.0.75.2/32 -j ACCEPT 44 -A nova-network-POSTROUTING -s 10.0.0.0/20 -d 10.0.0.0/20 -m conntrack ! --ctstate DNAT -j ACCEPT 45 -A nova-network-PREROUTING -d 169.254.169.254/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.0.75.2:8775 -> 接收到发往169.254.169.254:80的tcp包时,都默认发到本机(10.0.75.2)的8775端口 46 -A nova-network-PREROUTING -d 10.0.75.15/32 -j DNAT --to-destination 10.1.10.6 -> 接收到要发到10.0.75.15(虚拟机floating_ip)的包,都默认发到10.1.10.6(虚拟机fixed_ip) 47 -A nova-network-float-snat -s 10.1.10.6/32 -o br100 -j SNAT --to-source 10.0.75.15 -> 自br100出来的,来自10.1.10.6(虚拟机fixed_ip)的包,都改变为来自10.0.75.15(虚拟机floating_ip)再发出去 48 -A nova-network-snat -j nova-network-float-snat 49 -A nova-network-snat -s 10.0.0.0/20 -o br100 -j SNAT --to-source 10.0.75.2 50 -A nova-postrouting-bottom -j nova-network-snat 51 -A nova-postrouting-bottom -j nova-compute-snat 52 -A nova-postrouting-bottom -j nova-api-snat 53 COMMIT 54 # Completed on Sat Jan 4 20:16:24 2014 疑问: 1. rules 43, 44, 49 很奇怪,我指定的固定ip(fixed_ip)段是10.1.10.0/24,为什么规则中会是10.0.0.0/20 ? 感觉应该是: 43 -A nova-network-POSTROUTING -s 10.1.10.0/24 -d 10.0.75.2/32 -j ACCEPT -> 对源地址在fixed_ip段发出,目的地址是本物理机的包,都予放行 44 -A nova-network-POSTROUTING -s 10.1.10.0/24 -d 10.1.10.0/24 -m conntrack ! --ctstate DNAT -j ACCEPT -> 对于从本物理机出去的,在fixed_ip段内互传的包,对于状态为非DNAT的包,都予放行,保证虚拟机之间通过fixed_ip连接正常 49 -A nova-network-snat -s 10.1.10.0/24 -o br100 -j SNAT --to-source 10.0.75.2 -> 对自br100出来的,源自fixed_ip段发出的包,都把源地址换为本物理机,保证虚拟机获取fixed_ip后能够访问外部网络 参考资料: http://www.ibm.com/developerworks/cn/cloud/library/cl-openstack-network/ http://blog.csdn.net/jk110333/article/details/8229828 http://blog.tangjianwei.com/2009/01/12/my-understanding-about-dnat-and-snat-in-iptables/ 2014.01.16补充: 对于line 39的补充理解 39 -A POSTROUTING -o br100 -j MASQUERADE 补充下网络环境: 本机在内网开启了一块网卡eth0,此网段有网关10.0.75.254,通过这块网卡能够上外网(traceroute第一跳是10.0.75.254) 如果不加入line39,虚拟机能获取ip地址(10.0.10.0/24),但是无法上外网。 理解:本条目应该是指由本机出去的包都伪装成为br100的ip地址,而如果没有此条,在网关处就会把虚拟机发出的(源地址是10.0.10.0/24)的包都丢弃,而词条把这些包都伪装成为br100发出的。 另一场景: 两台物理机 A , B A物理机为controller节点,有两块网卡: eth0: 10.42.0.1 -> 内网网段 eth1: xxx.xxx.xxx.119 -> 外网ip地址(网关xxx.xxx.xxx.254) B物理机为compute节点,有一块网卡: eth0 10.42.0.2 -> 内网网段 10.42.0.0/24这个网络没有网关,需要将A机器设置为网关,开启路由转发功能,将eth0的流量经eth3导向外网,并通过eth3接受外网数据。 本例与上例的区别在于,内网无法直接经由eth0出外网,必须通过eth3做路由。 步骤: 1.开启linux内核路由转发: vim /etc/sysctl.conf net.ipv4.ip_forward=1 sudo sysctl -p 2.设置nat转发规则 iptables -t nat -A POSTROUTING -o eth3 -j MASQUERADE 其中eth3为能够连接外网的那块网卡,含义是所有出去的包都被伪装成为eth3获取到的地址然后转发。这样对于网关来说,所有经由A机器的包(vm,其他10.42.0.0段的物理机器)都被伪装成为A的外网ip地址。 (责任编辑:IT) |