从逻辑上将,防火墙大体可以分为主机防火墙和网络防火墙。
主机防火墙:针对于单个主机进行防护
网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网
iptables并不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”中,这个“安全框架”才是真正的防火墙,而这个框架的名字叫做netfilter。
netfilter才是防火墙真正的安全框架,它位于内核空间。
然而,iptables只是一个命令行工具,位于用户空间,我们借助这个工具操作真正的框架。
我们知道iptables是按照规则来办事的,而规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
当我们对每个“链”上都放置了一串规则,但是这些规则是有些很相似,比如,A类规则都是对IP或者端口的过滤,B类规则是修改报文,那么这个时候,我们就需要把实现相同功能的规则放在一起。
我们把具有相同功能的规则的集合叫做“表”。所以说,不同功能的规则,我们可以放置在不同的表中进行管理。而iptables已经为我们定义了4中表,每种表对应了不同的功能,而我们定义的规则也都逃脱不了这4中功能的范围,也就是说,所有的规则都存在于这4张“表”中。
iptables为我们提供的表的分类,如下:
PREROUTING 的规则可以存在于:raw表、mangle表、nat表。
INPUT 的规则可以存在于:mangle表、filter表 (centos7中还有nat表,centos6中没有)。
FORWARD 的规则可以存在于:mangle表、filter表。
OUTPUT 的规则可以存在于:raw表、mangle表、nat表、filter表。
POSTROUTING 的规则可以存在于:mangle表、nat表。
raw 表中的规则可以被哪些链使用:PREROUTING、OUTPUT
mangle 表中的规则可以被哪些链使用:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
nat 表中的规则可以被哪些链使用:PREROUTING、OUTPUT、POSTROUTING(centos7中还有INPUT,centos6中没有)
filter 表中的规则可以被哪些链使用:INPUT、FORWARD、OUTPUT
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求石沉大海了,过了超时时间才会有反应。
REJECT:拒绝数据包通过,必要时会给数据发送端一个相应的信息,客户端刚请求就会收到拒绝的信息。
SNAT:源地址转换,解决内网用户用同一个公网地址上网的问题。
MASQUERADE:是SNAT的一种特殊形式,适用于动态的、临时会变的IP上。
DNAT:目标地址转换。
REDIRECT:在本机做端口映射。
LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条数据,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。
-n:以数字格式显示地址和端口号
-v:显示详细信息
-vv:更详细
-L:查看规则
[root@CentOS7-2 ~]#iptables -vnL
Chain INPUT (policy ACCEPT 14412 packets, 1265K bytes)pkts bytes target prot opt in out source destinationChain FORWARD (policy ACCEPT 22 packets, 1848 bytes)pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 1154 packets, 139K bytes)pkts bytes target prot opt in out source destination
-t:指定表
[root@CentOS7-2 ~]#iptables -vnL -t nat
Chain PREROUTING (policy ACCEPT 154 packets, 21417 bytes)pkts bytes target prot opt in out source destinationChain INPUT (policy ACCEPT 139 packets, 20247 bytes)pkts bytes target prot opt in out source destinationChain OUTPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destinationChain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination
-A:添加规则
-p:指定协议、--dport:指定目标端口、--sport:指定源端口
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.104 -p icmp -j REJECT
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.1 -j ACCEPT
--line-numbers:查看规则序列号
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable120 8148 ACCEPT all -- * * 192.168.36.1
....
-R:替换指定链上的指定规则编号
[root@CentOS7-2 ~]#iptables -R INPUT 1 -s 192.168.36.100 -p icmp -j REJECT
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 56 packets, 5013 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable
....
-Z:置零,将计数器清零
[root@CentOS7-2 ~]#iptables -Z INPUT
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 9 packets, 662 bytes)
num pkts bytes target prot opt in out source destination
1 0 0 REJECT icmp -- * * 192.168.36.100 0.0.0.0/0 reject-with icmp-port-unreachable
....
-S:以命令格式显示
[root@CentOS7-2 ~]#iptables -S
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-N TEST
-A INPUT -s 192.168.36.100/32 -p icmp -j REJECT --reject-with icmp-port-unreachable
-I:插入,要指明插入至的规则编号
[root@CentOS7-2 ~]#iptables -I INPUT 3 -j REJECT
-D:删除规则,要指明规则编号
规则删除,后面的规则编号自动进行排序
[root@CentOS7-2 ~]#iptables -D INPUT 1
[root@CentOS7-2 ~]#iptables -vnL --line-numbers
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 193 13252 ACCEPT all -- * * 192.168.36.1 0.0.0.0/0
2 679 62517 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
-N:new, 自定义一条新的规则链
[root@CentOS7-2 ~]#iptables -N TEST
[root@CentOS7-2 ~]#iptables -vnL
...
Chain TEST (0 references)pkts bytes target prot opt in out source destination
-X:delete,删除自定义的空的规则链
[root@CentOS7-2 ~]#iptables -X TEST-M
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受、DROP:丢弃
[root@CentOS7-2 ~]#iptables -P INPUT DROP
[root@CentOS7-2 ~]#iptables -vnL
Chain INPUT (policy DROP 0 packets, 0 bytes)
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
[root@CentOS7-2 ~]#iptables -E TEST TEST-M
[root@CentOS7-2 ~]#iptables -vnL
....
Chain TEST-M (0 references)pkts bytes target prot opt in out source destination
-F:清空指定的规则链,不指定链则清空当前表
[root@CentOS7-2 ~]#iptables -F -t filter
以离散方式定义多端口匹配,最多指定15个端口
例题:拒绝192.1688.36.100主机访问192.168.36.104(本机)的20,21,22,80端口
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -d 192.168.36.104 -p tcp -m multiport --dport 20:22,80 -j REJECT
指明连续的(但一般不是整个网络)ip地址范围
例题:禁止192.168.36.90-192.168.36.101主机访问192.168.36.104主机的80端口
[root@CentOS7-2 ~]#iptables -A INPUT -d 192.168.36.104 -p tcp --dport 80 -m iprange --src-range 192.168.36.90-192.168.36.101 -j REJECT
指明源MAC地址
适用于:PREROUTING, FORWARD,INPUT链
例题:指明源MAC地址,可以通过icmp协议访问本机
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -p icmp -m mac --mac-source 00:0C:29:5A:43:B7 -j ACCEPT
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -j REJECT
对报文中的应用层数据做字符串模式匹配检测
例题1:对访问的地址进行限制
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.100 -p tcp --dport 80 -m string --algo bm --string "mage" -j REJECT
例题2:对web站点页面中任何包含magedu的字符串的页面进行规则限制
请求报文中不会包含mage,一半来讲只包含访问某个页面,那么请求内容无非包含了请求某个链接而已。
响应报文中会封装页面的内容信息,因此网页内容会出现在响应报文中,而不是请求报文。
所以,对web页面内容进行规则限制需要在OUTPUT链进行规则设定[root@CentOS7-2 ~]#iptables -A OUTPUT -d 192.168.36.100 -p tcp --sport 80 -m string --algo bm --string "magedu" -j REJECT
例题3:拒绝含有“OOXX”字样的报文进入主机
[root@CentOS7-2 ~]#iptables -A INPUT -m string --algo bm --string "OOXX" -j REJECT
根据将报文到达的时间与指定的时间范围进行匹配
例题1:禁止192.168.36.0/24网段主机在08:00~18:00时间段内访问主机80端口
[root@CentOS7-2 ~]#iptables -A INPUT -s 192.168.36.0/24 -d 192.168.36.104 -p tcp --dport 80 -m time --timestart 08:00 --timestop 18:00 --kerneltz -j DROP
例题2:周六日不能访问80端口
[root@CentOS7-2 ~]#iptables -A OUTPUT -p tcp --dport 80 -m time --weekdays 6,7 -j DROP
使用connlimit扩展模块,可以限制每个IP地址同时链接到server端的连接数量,注意:不需要指定IP,此模块默认就是针对“每个客户端IP”,即对单IP的并发连接数限制。
例题1:每个IP地址最多只能占用两个ssh链接远程到本机
[root@CentOS7-2 ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 2 -j
REJECT
例题2:24网段的IP地址限制server端ssh最多连接10个
[root@CentOS7-2 ~]#iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 10 --connlimit-mask 24 -j REJECT
限制单位时间内流入的包的数量,基于收发报文的速率做匹配
例题:每分钟生成放行10个icmp包
[root@CentOS7-2 ~]#iptables -t filter -I INPUT -p icmp -m limit --limit-burst 3 --limit 10/minute -j ACCEPT
[root@CentOS7-2 ~]#iptables -t filter -A INPUT -p icmp -j REJECT
conntrack机制:追踪本机上的请求和响应之间的关系
状态有如下几种:
例题1:让已经建立的连接允许通过
[root@node2 ~]# iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
例题2:开启连接追踪放行响应的报文
[root@node2 ~]# iptables -I CLASS -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@LVS ~]#iptables -I FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT
[root@LVS ~]#iptables -I FORWARD -d 192.168.36.0/24 -p icmp --icmp-type 0 -j ACCEPT
[root@LVS ~]#iptables -I FORWARD -s 192.168.36.0/24 -p icmp --icmp-type 8 -j ACCEPT
[root@LVS ~]#iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@LVS ~]#iptables -vnL
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)pkts bytes target prot opt in out source destination0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED91 7644 ACCEPT icmp -- * * 192.168.36.0/24 0.0.0.0/0 icmptype 816 1344 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
SNAT解决局域网访问互联网,本地网络中的主机通过某一特定的地址访问外部网络,实现地址伪装。请求报文:修改源IP---POSTROUTING
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 ! –d 10.0.1.0/24 -j MASQUERADE
DNAT解决内网私有地址可以被互联网访问, 指数据包从网卡发送出去的时候,修改数据包中的目的IP,表现为如果你想访问A,可是因为网关做了DNAT,把所有访问A的数据包的目的IP全部修改为B,那么,你实际上访问的是B。请求报文:修改目的IP---PREROUTING
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8080
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22
转:https://blog.51cto.com/12980155/2399305