一、iptables的相关概念:
1、Firewall:防火墙,隔离工具;工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件
2、在Linux的内核中使用netfilter构架实现防火墙功能
3、iptables是Linux系统中为用户提供的netfilter管理工具,用于实现对Linux内核中防火墙的管理
4、netfilter/iptables的典型应用:
作为主机防火墙实现外部网络与主机之间的访问控制
作为网络防火墙提供外部网络与内部网络的访问控制
二、iptables服务管理:
CentOS 6:
service iptables {start|stop|restart|status}
start:读取事先保存的规则,并应用到netfilter上;
stop:清空netfilter上的规则,以及还原默认策略等;
status:显示生效的规则;
restart:清空netfilter上的规则,再读取事先保存的规则,并应用到netfilter上;
默认的规则文件:/etc/sysconfig/iptables
CentOS 7:
systemctl start|stop|restart|status firewalld.service
systemctl disable firewalld.service
systemctl stop firewalld.service
三、iptables规则管理:
规则的有效期限:
使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限;
保存规则:保存规则至指定的文件:
CentOS 6:
~]# service iptables save
将规则保存至/etc/sysconfig/iptables文件中;下次开机时会自动读取此文件的规则
~]# iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS 7:
~]# iptables-save > /PATH/TO/SOME_RULES_FILE
重新载入预存规则文件中规则:
通用方法:
~]# iptables-restore < /PATH/FROM/SOME_RULES_FILE
CentOS 6:
~]# service iptables restart
自动生效规则文件中的规则:
(1) 用脚本保存各iptables命令;让此脚本开机后自动运行;
/etc/rc.d/rc.local文件中添加脚本路径;
/PATH/TO/SOME_SCRIPT_FILE
(2) 用规则文件保存各规则,开机时自动载入此规则文件中的规则;
/etc/rc.d/rc.local文件中添加:
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
三、iptables的功能结构:
功能<--链(四表五链):
raw:PREROUTING, OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT],]OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
四、iptables的匹配规则:
组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;
匹配条件:
基本匹配条件
扩展匹配条件
处理动作:
基本处理动作
扩展处理动作
自定义处理机制
iptables的链:内置链和自定义链
内置链:对应于hook function(五个链)
自定义链:用于内置链的扩展和补充,可实现更灵活的规则管理机制
五、iptables的语法格式:
iptables [-t table] COMMAND chain [-m matchname [per-match-options]] -j targetname [per-target-options]
使用帮助:
CentOS 6: man iptables
CentOS 7: man iptables-extensions
-t table:
raw, mangle, nat, [filter]默认
COMMAND:
链管理:
-N:new, 自定义一条新的规则链;
-X:delete,删除自定义的规则链;
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
REJECT:拒绝
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
规则管理:
-A:append,追加;
-I:insert, 插入,要指明位置,省略时表示插入为第一条;
-D:delete,删除;
(1) 指明规则序号;
(2) 指明规则本身;
-R:replace,替换指定链上的指定规则;
-F:flush,清空指定的规则链;
-Z:zero,置零;
iptables的每条规则都有两个计数器:
(1) 匹配到的报文的个数;
(2) 匹配到的所有报文的大小之和;
查看规则:
-L:list, 列出指定鏈上的所有规则;
-n:numberic,以数字格式显示地址和端口号;
-v:verbose,详细信息;
--line-numbers:显示规则的序号;
chain:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
匹配条件:
基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
-s:检查报文中的源IP地址是否符合此处指定的地址或范围;
-d:检查报文中的目标IP地址是否符合此处指定的地址或范围;
-p: {tcp|udp|icmp}
-i:数据报文流入的接口;只能应用于数据报文流入的环节,只能应用于PREROUTING,INPUT和FORWARD链;
-o:数据报文流出的接口;只能应用于数据报文流出的环节,只能应用于FORWARD、OUTPUT和POSTROUTING链;
扩展匹配条件: 需要加载扩展模块,方可生效;
隐式扩展:不需要手动加载扩展模块;因为它们是对协议的扩展,所以,但凡使用-p指明了协议,就表示已经指明了要扩展的模块;
tcp:
--source-port[:port]:匹配报文的源端口;可以是端口范围;
--destination-port[:port]:匹配报文的目标端口;可以是端口范围;
--tcp-flags mask comp
例如 SYN,ACK,FIN,RST
例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0;
--syn:用于匹配第一次握手,相当于”--tcp-flags SYN,ACK,FIN,RST SYN“;
udp:
--source-port[:port]:匹配报文的源端口;可以是端口范围;
--destination-port[:port]:匹配报文的目标端口;可以是端口范围;
icmp
--icmp-type {type[/code]|typename}
echo-request:8
echo-reply:0
显式扩展:必须要手动加载扩展模块, [-m matchname [per-match-options]];
处理动作:
-j targetname [per-target-options]
ACCEPT
DROP
REJECT
RETURN:返回调用链;
LOG:记录日志;
DNAT:目标地址转换;
SNAT:源地址转换;
MASQUERADE:地址伪装;
...
自定义链:
示例:
1、开放本机web服务器给非192.168.0.0/24网络中的主机访问;
~]# iptables -t filter -A INPUT ! -s 192.168.0.0/24 -d 172.16.17.71 -p tcp --dport 80 -j ACCEPT
2、禁止本机被非172.16.0.0/16网络中的主机进行ping请求;
~]# iptables -I INPUT ! -s 172.16.0.0/16 -p icmp --icmp-type 8 -j DROP
3、开放本机的dns服务给所有主机;
~]# iptables -I INPUT -d 172.16.17.71 -p udp --dport 53 -j ACCEPT
显式扩展:必须显式地指明使用的扩展模块进行的扩展;
1、multiport扩展
以离散方式定义多端口匹配;最多指定15个端口;
[!] --source-ports[,port|,port:port]...:指定多个源端口;
[!] --destination-ports[,port|,port:port]...:指定多个目标端口;
[!] --ports port[,port|,port:port]...:指明多个端口;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -j ACCEPT
2、iprange扩展
指明连续的(但一般不包括整个网络)ip地址范围;
[!] --src-range [-to]:源IP地址;
[!] --dst-range [-to]:目标IP地址;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 80 -m iprange --src-range 172.16.100.5-172.16.100.10 -j DROP
3、string扩展
对报文中的应用层数据做字符串模式匹配检测;
--algo {bm|kmp}:字符串匹配检测算法;
[!] --string pattern:要检测的字符串模式;
[!] --hex-string pattern:要检测的字符串模式,16进制格式;
~]# iptables -A OUTPUT -s 172.16.100.67 -d 172.16.0.0/16 -p tcp --sport 80 -m string --algo bm --string "gay" -j REJECT
4、time扩展
根据将报文到达的时间与指定的时间范围进行匹配;
Possible values are Mon, Tue, Wed, Thu, Fri, Sat, Sun, or values from 1 to 7
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss]
--timestop hh:mm[:ss]
[!] --monthdays day[,day...]
[!] --weekdays day[,day...]
--kerneltz:使用内核上的时区,而非默认的UTC;
~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
5、connlimit扩展
根据每客户端IP做并发连接数数量匹配;
--connlimit-upto n:连接的数量小于等于n时匹配;
--connlimit-above n:连接的数量大于n时匹配;
~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT
6、limit扩展
基于收发报文的速率做匹配(令牌桶过滤器);
--limit rate[/second|/minute|/hour|/day] 平均速率 rate为具体的速率
--limit-burst number 峰值速率
~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT ~]# iptables -I INPUT 2 -p icmp -j REJECT
7、state扩展
根据“连接追踪机制”去检查连接的状态;
[!] --state state
conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
INVALID:无效的连接;
UNTRACKED:未进行追踪的连接;
调整连接追踪功能所能够容纳的最大连接数量:
/proc/sys/net/nf_contrack_max
已经追踪到到的并记录下来的连接:
/proc/net/nf_conntrack
不同的协议的连接追踪时长:
/proc/sys/net/netfilter/
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时
连接追踪的副作用:
连接追踪功能有最大连接数量限制,虽然可以通过调整参数增加其记录的追踪记录,但是当有大量的连接发往服务器时,会导致有大量的内存空间需要用来保存连接追踪记录,且容易造成内存碎片,久而久之会导致服务器性能下降
注意:前端的负载均衡器不要启用连接追踪机制
~]# iptables -A INPUT -d 172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports 22,80 -m state --state ESTABLISHED -j ACCEPT
如何使用自定义链:
自定义链:需要被调用才能生效;自定义链最后需要定义返回规则;
引用计数不为0的自定义链不能够被重命名,也不能被删除;只能清空其内的规则并解除调用状态,方可重命名或删除
返回规则使用的target叫做RETURN;
~]# iptables -N icmp ~]# iptables -E icmp in-icmp ~]# iptables -A in-icmp -d 172.16.17.71 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT ~]# iptables -A INPUT -d 172.16.17.71 -p icmp -j in-icmp ~]# iptables -A in-icmp -j RETURN //如果in-icmp中的规则匹配不到,则返回由调用链的规则匹配
netfilter: nat table
nat: network address translation
snat: source nat
dnat: destination nat
pnat: port nat
snat:POSTROUTING, OUTPUT
让本地网络中的主机通过某一特定地址访问外部网络时;
dnat:PREROUTING
把本地网络中的某一主机上的某服务开放给外部网络中的用户访问时;
nat表的target:
SNAT:
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source 172.16.100.67
DNAT:
--to-destination [ipaddr[-ipaddr]][:port[-port]]
~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77 ~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 80 -j DNAT --to-destination 192.168.12.77:8080 ~]# iptables -t nat -A PREROUTING -d 172.16.100.67 -p tcp --dport 22012 -j DNAT --to-destination 192.168.12.78:22
MASQUERADE:
源地址转换:当源地址为动态获取的地址时,MASQUERADE可自行判断要转换为的地址;
--to-ports port[-port]
--random
~]# iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE
练习:INPUT和OUTPUT默认策略为DROP;
1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
~]# iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 80 -m state --state NEW -m limit --limit 100/second -m time ! --weekdays Mon -j ACCEPT ~]# iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 80 -m state --state ESTABLISHED -j ACCEPT ~]# iptables -t filter -A OUTPUT-s 172.16.17.71 -p tcp --sport 80 -m state --state ESTABLISHED -m string --algo kmp ! --string "admin" -j ACCEPT
2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
~]# iptables -t filter -R INPUT 2 -d 172.16.17.71 -s 172.16.0.0/16 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -m time --weekdays Mon,Tus,Wed,Thu,Fri --timestart 08:00:00 --timestop 18:00:00 -j ACCEPT ~]# iptables -t filter -R INPUT 3 -d 172.16.17.71 -s 172.16.0.0/16 -p tcp -m state --state RELATED -m limit --limit 5/min -j ACCEPT ~]# iptables -t filter -A INPUT -d 172.16.17.71 -s 172.16.0.0/16 -p tcp -m state --state ESTABLISHED -j ACCEPT ~]# iptables -t filter -A OUTPUT -d 172.16.0.0/16 -s 172.16.17.71 -p tcp -m state --state ESTABLISHED -j ACCEPT
3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的学号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
~]# iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 22 -m state --state NEW -m iprange --src-range 172.16.17.1-172.16.17.100 -m limit --limit 2/min -j ACCEPT ~]# iptables -t filter -A INPUT -d 172.16.17.71 -p tcp --dport 22 -m state --state ESTABLISHED -m iprange --src-range 172.16.17.1-172.16.17.100 -j ACCEPT ~]# iptables -t filter -A OUTPUT -s 172.16.17.71 -p tcp --sport 22 -m iprange --dst-range 172.16.17.1-172.16.17.100 -m state --state ESTABLISHED -j ACCEPT
4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
~]# iptables -t filter -A INPUT -d 172.16.17.71 -p --tcp-flags ALL ALL -j DROP
5、允许本机ping别的主机;但不开放别的主机ping本机;
~]# iptables -A INPUT ! -d 172.16.17.71 -p icmp --icmp-type 8 -j ACCEPT