3.iptables表(tables)和链(chains)
下面的表格展示了表和链的对应关系。
表(iptables) 链(chains)
INPUT FORWARD OUTPUT PREROUTING POSTROUTIING
FILTER
NAT
MANGLE
提示:所有链名都要大写
4.表及其链的功能
Filter表
主要和主机自身有关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)。filter表是iptables默认使用的表。这个表定义了三个链(chains):
企业工作场景:主机防火墙。
INPUT:负责过滤所有目标地址是本机地址的数据包。通俗的讲,就是过滤进入主机的数据包
FORWARD:负责转发流经主机的数据包。起转发的作用,和Nat关系很大,后面会详细介绍。Lvs NAT模式。net.ipv4.ip_forward=0
OUTPUT:处理所有源地址是本机地址的数据包,通俗的讲,就是处理从主机发出去的数据包。
强调:对于Filter表的控制是我们实现本机防火墙功能的重要手段,特别是对INPUT链的控制
NAT表
负责网络地址转换,即来源与目的ip地址和port的转换。应用:和主机本身无关。一般用于局域网共享上网或者特殊的端口转换服务相关。
NAT功能一般企业工作场景.
l)用于做企业路由(zebra)或网关(iptables),共享上网(POSTROUTING)
2)做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,FTP
服务。(PREROUTING),
3)web,单个端口的映射,直接映射80端口(PREROUTING)。
这个表定义了三个链(chains),nat功能就相当于网络的acl控制。和网络交换机acl类似。
INPUT:和主机发出去的数据包有关。改变主机发出数据包的目标地址。
PREROUTING:在数据包到达防火墙时进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等。(通俗比喻,就是收信时,根据规则重写收件人的地址,这看上去很不地道啊!哈哈。)例如:把公网IP;124.42.60.113映射到局域网的10.0.0.19服务器上。如果是web服务,可以把80转为局域网的服务器上9000端口。
POSTROUTING:在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址、源端口等。(通俗比喻,就是寄信时,写好发件人的地址,要让人家回信时能够有地址可回。),例如:我们现在的笔记本和虚拟机都是10.0.0,0/24,就是出网的时候被我们企业路由器把源地址改成了公网地址了。生产应用:局域网共享上网。
MANGLE表
主要负责修改数据包中特殊的路由标记,如TTL,TOS,MAARK等。这个表定义5个链(Chains)。
INPUT、FORWARD、OUTPUT、PREROUTING、POSTROUTING。
由于这个表与特殊标记相关,一般情况下,我们用不到这个mangle表,这里就不做详细介绍了。
5.iptables的工作流程
前面介绍己经提到,iptables是采用数据包过滤机制工作的,所以它会对请求的数据包的包头数据进行分析,并根据我们预先设定的规则进行匹配来决定是否可以进入主机。
数据包的流向是从左向右的
小结:
防火墙是层层过滤的。实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
如果匹配上规则,即明确表明是阻止还是通过,数据包就不在向下匹配新规则了。
如果所有规则中没有明确表明是阻止还是通过,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。
防火墙默认规则是所有的规则执行完才会执行的。
重点:匹配上了拒绝规则也是匹配,例如
[root@mysql ~]# iptables -A INPUT -p tcp --dport 3306 -j DROP
[root@mysql ~]# iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
此时telnet ip address 3306 是不同的,原因就是telnet请求已先匹配上了拒绝规则,因此不会再找下面的规则匹配了。如果希望telnet ip address 3306连通,可以把ACCEPT规则中的-A改为-I,即iptables -I INPUT -p tcp --dport 3306 -j ACCEPT,把允许规则放于INPUT链的第一行生效
6.iptables表和链的工作流程图
下面的这张图清晰的描绘了netfilter对包的处理流程
二、iptables实战应用
1.iptables命令参数详解
iptables内核模块
[root@mysql ~]# /etc/init.d/iptables start #启动防火墙
如果遇到iptables无法启动,可以通过setup–firewall configure–enable
[root@mysql ~]# lsmod|egrep “nat|filter|ipt” #iptables默认加载内核模块
iptable_filter 2793 1
ip_tables 17831 1 iptable_filter
加载如下模块到linux内核
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
清除默认规则
[root@mysql ~]# iptables -h #查看帮助
[root@mysql ~]# iptables -F #清除所有规则,不会处理默认的规则。
[root@mysql ~]# iptables -X #删除用户自定义的链。
[root@mysql ~]# iptables -Z #链的记数器清零。
–flush -F [chain] Delete all rules in chain or all chains
–delete-chain -X [chain] Delete a user-defined chain
–zero -Z [chain [rulenum]] Zero counters in chain or all chains
禁止规则
[root@mysql ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP #禁止访问22端口
[root@mysql ~]# iptables -t filter -A INPUT -i eth0 -s 10.0.0.0/24 -j DROP #禁止IP地址段进入eth0网卡的流量
–table -t table table to manipulate (default: `filter’)
–append -A chain Append to chain #添加链,最后一条
–new -N chain Create a new user-defined chain #创建一个新链
–policy -P chain target Change policy on chain to target
–insert -I chain [rulenum] Insert in chain as rulenum (default 1=first) #添加链第一条
–delete -D chain Delete matching rule from chain #删除链
–proto -p proto protocol: by number or name, eg. ‘tcp’
–dport #指定目的端口
–in-interface -i input name[+] network interface name ([+] for wildcard)
–source -s address[/mask][…] source specification
-j, --jump target #对规则进行ACCEPT(接受)、DROP(丢弃)、REJECT(拒绝)
打台球:如果对方告诉你不去,REJECT(拒绝),如果对方没反应,DROP(丢弃),DROP好于REJECT
使用-I和-A的顺序,防火墙的过滤根据规则顺序的
-A是添加规则到指定链的结尾,最后一条。
-I是添加规则到指定链的开头,第一条。此参数经常用来封IP
测试配置拒绝规则也是匹配
下面的测试有两个要点:非的作用,匹配拒绝也是匹配
Centos5.8版本:iptables -t filter -A INPUT -i eth0 -s ! 192.168.80.1 -j DROP
Centos6.4版本:iptables -t filter -A INPUT -i eth0 ! -s 192.168.80.1 -j DROP
查看规则
[root@mysql ~]# iptables -L -n --line-numbers #以数字形式列出防火请规则
–list -L [chain [rulenum]] List the rules in a chain or all chains
–numeric -n numeric output of addresses and ports
–line-numbers print line numbers when listing #可以用此参数显示的序号删除规则
[root@mysql ~]# iptables -t filter -D INPUT 1 #删除第一条规则
2.详解匹配标准
通用匹配:源地址目标地址的匹配
-s:指定作为源地址匹配,这里不能指定主机名称,必须是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
而且地址可以取反,加一个“!”表示除了哪个IP之外
-d:表示匹配目标地址
-p:用于匹配协议的(这里的协议通常有3种,TCP/UDP/ICMP)
-i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上
隐含扩展:对协议的扩展
-p tcp :TCP协议的扩展。一般有三种扩展
–dport XX-XX:指定目标端口,不能指定多个非连续端口,只能指定单个端口,比如
–dport 21 或者 --dport 21-23 (此时表示21,22,23)
–sport:指定源端口
–tcp-fiags:TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)
对于它,一般要跟两个参数:
-p udp:UDP协议的扩展
–dport
–sport
-p icmp:icmp数据报文的扩展
–icmp-type:
echo-request(请求回显),一般用8 来表示
所以 --icmp-type 8 匹配请求回显数据包
echo-reply (响应的数据包)一般用0来表示
显式扩展(-m)
扩展各种模块
-m multiport:表示启用多端口扩展
之后我们就可以启用比如 --dports 21,23,80
iptables -t filter -A INPUT -p icmp --icmp-type 8 ! -s 192.168.80.1 -j DROP #禁止ping
iptables -A INPUT -d 192.168.80.100 -p tcp --dport 80 -j ACCEPT
iptables -t filter -A OUTPUT -s 172.16.100.1 -d 192.168.80.0/24 -p tcp --dport 22 -j ACCEPT
iptables -I INPUT -p tcp ! --dport 22 -s 192.168.80.1 -j DROP
iptables -I INPUT -p tcp -m multiport --dport 21,22,23,24 -j ACCEPT #正确
iptables -I INPUT -p tcp --dport 21:24 -j ACCEPT #正确
iptables -I INPUT -p tcp --dport 21,22,23,24 -j ACCEPT #错误
iptables -A INPUT -p tcp --sport 1024: --dport 1024: -m state –-state ESTABLISHED -j ACCEPT
3.企业生产环境防火墙配置
清除默认规则
iptables -F
iptables -X
iptables -Z
设置允许本地网段ssh登录
iptables -A INPUT -p tcp --dport 52113 -s 192.168.80.0/24 -j ACCEPT
设置允许本机lo通信
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
设置默认的防火墙禁止和允许规则:DROP掉FORWARD、INPUT,允许OUTPUT
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
开启信任的ip网段
#允许IDC LAN/WAN和办公网IP的访问,及对外合作机构访问
iptables -A INPUT -s 124.43.62.95/27 -p all -j ACCEPT #办公室固定IP段
iptables -A INPUT -s 192.168.1.0/24 -p all -j ACCEPT #IDC机房的内网网段
iptables -A INPUT -s 10.0.0.0/27 -p all -j ACCEPT #其他机房的内网网段
iptables -A INPUT -s 203.83.24.0/24 -p all -j ACCEPT #IDC机房的外网网段
iptables -A INPUT -s 201.82.34.0/24 -p all -j ACCEPT #其他IDC机房的外网网段
允许业务服务端口对外访问(80)
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
允许icmp类型协议通过
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT 如果不想开,就不执行此步
iptables -A INPUT -p icmp -s 192.168.80.0/24 -m icmp --icmp-type 8 -j ACCEPT #允许内网ping
允许关联的包通过(ftp协议)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
使用其他主机扫描此主机的端口
[root@nfs ~]# nmap 192.168.80.105 -p 1-65535
Starting Nmap 5.51 ( http://nmap.org ) at 2016-05-20 20:14 CST
Nmap scan report for mysql.etiantian.org (192.168.80.105)
Host is up (0.00051s latency).
Not shown: 65533 filtered ports
PORT STATE SERVICE
80/tcp closed http
52113/tcp open unknown
MAC Address: 00:0C:29:5D:1D:81 (VMware)
Nmap done: 1 IP address (1 host up) scanned in 118.12 seconds
保存防火墙的配置
/etc/init.d/iptables save #法一
iptables-save >/etc/sysconfig/iptables #法二
cat /etc/sysconfig/iptables 查看iptables配置文件
注:/etc/init.d/iptables save第二次使用时会删除第一次保存的配置
4.生产环境如何维护防火墙
生产中,一般第一次添加规则命令行或者脚本加入然后一次性保存成文件,然后以后可以改配置文件管理
手工封IP
iptables -I INPUT -s 192.168.80.20 -j DROP
自动封IP:分析web或应用日志或者网络连接状面封掉垃圾IP
[root@mysql ~]# cat dropip.sh
#/bin/bash
/bin/netstat -na|grep ESTABLISHED|awk ‘{print $5}’|awk -F: ‘{print $1}’|sort|uniq -c|sort -rn|head -10|egrep -v ‘192.168|127.0’|awk ‘{if ($2!=null && $1>4) {print $2}}’ >/home/liwen/dropip.txt
for i in $(cat /home/liwen/dropip.txt)
do
/sbin/iptables -I INPUT -s
i
−
j
D
R
O
P
e
c
h
o
"
i -j DROP echo "
i−jDROPecho"i kill at date
" >>/var/log/ddos
done
5.企业iptables面试题:自定义链处理syn攻击
iptables -N syn-flood
iptables -A INPUT -i eth0 -syn -j syn-flood
iptables -A syn-flood -m limit -limit 5000/s -limit-burst 200 -j RETURN
iptables -A syn-flood -j DROP
6.部署企业及IDC机房网关
对应实际企业办公上网场景逻辑图:
服务器网关需具备如下条件
1)物理条件是具备双网卡,建议eth0外网地址(这里是10.0.0.19,gw10.0.0.254),ethl内网地址(这里是192.168.1.19,内网卡不配GW)。
2)确保服务器网关B要可以上网(B上网才能代理别的机器上网)。可以通过ping baidu.com或ping 203.81.17.1测试。
3)内核文件/ete/sysctl.conf里开启转发功能
在服务器网关B 192.168.1.19机器上开启路由转发功能。编辑/etc/sysctl.conf修改内容为net.ipv4.ip_forward=l,然后执行sysctl -p使修改生效
4)iptables的filter表的FORWARD链允许转发
iptables -P FORWARD ACCEPT
5)不要filter防火墙功能,共享上网,因此,最好暂时停掉防火墙测试
加载iptables内核模块
配置网关需要iptables的nat表,PREROUTING,POSTROUTING。
1)载入iptables内核模块,执行并放入rc.local。
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state
局域网的机器:
l)局域网的机器有一块网卡即可,确保局域网的机器C,默认网关设置了网关服务器B的ethl内网卡IP(192.168.1.19)。把主机C的gateway设置为B的内网卡192段的网卡ip,即192.168.1.19。
2)检查手段:分别ping网关服务器B的内外网卡IP,都应该是通的就对了。
3)出公网检查除了ping网站域名外,也要ping下外网IP,排除DNS故障。不通。
4)ping10.0.0.254网关也是不通的。
局域网共享的两条命令方法
方法1:适合于有固定外网地址的:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.19
(l)-s 192.168.1.0/24办公室或IDC内网网段。,
(2)-o etho为网关的外网卡接口。
(3)-j SNAT --to-source 10.0.0.19是网关外网卡IP地址。
方法2:适合变化外网地址(ADSL):
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
注:配置NAT必须开启防火墙转发功能,并且允许forward表通过
把外部lP地址及端口映射到内部服务器地址及端口
在10段主机可以通过访问10.0.0.19:80即可访问到92.168.1.17:9000提供的web服务
iptables -t nat -A PREROUTING -d 10.0.0.19 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.17:9000
强调:有个别同学说网关服务需要开启80服务,但不需要对外服务?.
测试结果:网关开启httpd 80后。
此时:来自80端口的请求转发依然会转发到后端的服务器。但是当iptables nat规则删除后,此时就到达了httpd服务监听的80端口,所以显示的是默认的页面。
7.企业内部局域网生产映射案例
一对一ip映射
实现外部IP 124.42.34.112一对一映射到内部server10.0.0.8
企业内部局域网生产映射案例:实现外部ip 124.42.34.112一对一映射到内部srver10.0.0.8
网关IP:eth0:124.42.60.109 eth1:10.0.0.252
首先在路由网关上绑定124.42.34.112,可以是别名的方式。
-A PREROUTING -d 124.42.34.112 -j DNAT --to-destination 10.0.0.8
-A POSTROUTING -s 10.0.0.8 -o eth0 -j SNAT --to-source 124.42.34.112
-A POSTROUTING -s 10.0.0.0/255.255.240.0 -d 124.42.34.112 -i SNAT --to-source 10.0.0.254
映射多个外网IP上网
iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j SNAT --to-source 124.42.60.11-124.42.60.16