openstack-notes

iptables/netfilter

iptables是一个配置Linux内核防火墙的命令行工具,它基于内核的netfilter机制。新版本的内核(3.13+)也提供了nftables,用于取代iptables。

netfilter {#7uff4o}

netfilter是Linux内核的包过滤框架,它提供了一系列的钩子(Hook)供其他模块控制包的流动。这些钩子包括

iptables {#4n041j}

iptables通过表和链来组织数据包的过滤规则,每条规则都包括匹配和动作两部分。默认情况下,每张表包括一些默认链,用户也可以添加自定义的链,这些链都是顺序排列的。这些表和链包括:

Tables↓/Chains→ PREROUTING INPUT FORWARD OUTPUT POSTROUTING
(routing decision)        
raw      
(connection tracking enabled)      
mangle
nat(DNAT)      
(routing decision)      
filter    
security    
nat(SNAT)      

所有链默认都是没有任何规则的,用户可以按需要添加规则。每条规则都包括匹配和动作两部分:

这样,网络数据包通过iptables的过程为

其规律为

  1. 当一个数据包进入网卡时,数据包首先进入PREROUTING链,在PREROUTING链中我们有机会修改数据包的DestIP(目的IP),然后内核的”路由模块”根据”数据包目的IP”以及”内核中的路由表” 判断是否需要转送出去(注意,这个时候数据包的DestIP有可能已经被我们修改过了)
  2. 如果数据包就是进入本机的(即数据包的目的IP是本机的网口IP),数据包就会沿着图向下移动,到达INPUT链。数据包到达INPUT链后,任何进程都会收到它
  3. 本机上运行的程序也可以发送数据包,这些数据包经过OUTPUT链,然后到达POSTROTING链输出(注意,这个时候数据包的SrcIP有可能已经被我们修改过了)
  4. 如果数据包是要转发出去的(即目的IP地址不再当前子网中),且内核允许转发,数据包就会向右移动,经过FORWARD链,然后到达POSTROUTING链输出(选择对应子网的网口发送出去)

iptables示例 {#1zhljm}

查看规则列表

iptables -nvL

允许22端口

iptables -A INPUT -p tcp --dport 22 -j ACCEPT

允许来自192.168.0.4的包

iptables -A INPUT -s 192.168.0.4 -j ACCEPT

允许现有连接或与现有连接关联的包

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

禁止ping包

iptables -A INPUT -p icmp --icmp-type echo-request -j DROP

禁止所有其他包

iptables -P INPUT DROP
iptables -P FORWARD DROP

MASQUERADE

iptables -t nat -I POSTROUTING -s 10.0.0.30/32 -j MASQUERADE

NAT

iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I INPUT   -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -t nat -I OUTPUT -d 55.55.55.55/32 -j DNAT --to-destination 10.0.0.30
iptables -t nat -I PREROUTING -d 55.55.55.55/32 -j DNAT --to-destination 10.0.0.30
iptables -t nat -I POSTROUTING -s 10.0.0.30/32 -j SNAT --to-source 55.55.55.55

端口映射

iptables -t nat -I OUTPUT -d 55.55.55.55/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.10.3:80
iptables -t nat -I POSTROUTING -m conntrack ! --ctstate DNAT -j ACCEPT
iptables -t nat -I PREROUTING -d 55.55.55.55/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.10.3:80

重置所有规则

iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X