OpenStack iptables(NAT)学习笔记
时间:2019-12-28 16:12 来源:linux.it.net.cn 作者:IT
对照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)
对照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) |