1、iptables的相关概念:前端
一、Firewall:防火墙,隔离工具;工做于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则做匹配检测,对于可以被规则匹配到的报文做出相应处理的组件web
二、在Linux的内核中使用netfilter构架实现防火墙功能算法
三、iptables是Linux系统中为用户提供的netfilter管理工具,用于实现对Linux内核中防火墙的管理bash
四、netfilter/iptables的典型应用:服务器
做为主机防火墙实现外部网络与主机之间的访问控制
网络
做为网络防火墙提供外部网络与内部网络的访问控制并发
2、iptables服务管理:app
CentOS 6:负载均衡
service iptables {start|stop|restart|status}dom
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
3、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
3、iptables的功能结构:
功能<--链(四表五链):
raw:PREROUTING, OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT],]OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
4、iptables的匹配规则:
组成部分:根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动做做出处理;
匹配条件:
基本匹配条件
扩展匹配条件
处理动做:
基本处理动做
扩展处理动做
自定义处理机制
iptables的链:内置链和自定义链
内置链:对应于hook function(五个链)
自定义链:用于内置链的扩展和补充,可实现更灵活的规则管理机制
5、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:地址假装;
...
自定义链:
示例:
一、开放本机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
二、禁止本机被非172.16.0.0/16网络中的主机进行ping请求;
~]# iptables -I INPUT ! -s 172.16.0.0/16 -p icmp --icmp-type 8 -j DROP
三、开放本机的dns服务给全部主机;
~]# iptables -I INPUT -d 172.16.17.71 -p udp --dport 53 -j ACCEPT
显式扩展:必须显式地指明使用的扩展模块进行的扩展;
一、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
二、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
三、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
四、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
五、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
六、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
七、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;
一、限制本地主机的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
二、在工做时间,即周一到周五的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
三、开放本机的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
四、拒绝TCP标志位所有为1及所有为0的报文访问本机;
~]# iptables -t filter -A INPUT -d 172.16.17.71 -p --tcp-flags ALL ALL -j DROP
五、容许本机ping别的主机;但不开放别的主机ping本机;
~]# iptables -A INPUT ! -d 172.16.17.71 -p icmp --icmp-type 8 -j ACCEPT