当前位置: > 其它学习 > OpenStack >

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)
------分隔线----------------------------