一、Firewall防火墙
1.Firewall:防火墙,隔离工具;
工作于主机或网络边缘,对于进出本主机或本网络的报文根据事先定义的检查规则作匹配检测,对于能够被规则匹配到的报文作出相应处理的组件;
(1)分类
分类一:主机防火墙(访问主机本身)、网络防火墙(多网卡实现请求转发)
分类二:软件防火墙(纯软件逻辑,如kernel代码)、硬件防火墙(硬件层设计上专为防火墙设置结合软件辅助)
(2)防火墙工具发展
ipfw (firewall framework):防火墙框架,命令行工具,将写的柜子通过内核调用送往TCP/IP协议栈
ipchains (firewall framework):用户控件写规则工具,升级版本,链状IP处理
iptables(netfilter框架):内核2.4之后;netfilter工作在kernel;iptables是rulesuntil编写规则检查语法的工具
特点:可以配置有状态的防火墙指定并记住为发送或接收数据包所创建的连接的状态
3.防火墙(服务)启停
CentOS6:
service iptables {start|stop|restart|status}
start:读取事先保存的规则,并应用到netfilter上;
stop:清空netfilter上的规则,以及还原默认策略等;
status:显示生效的规则;
restart:清空netfilter上的规则,再读取事先保存的规则,并应用到netfilter上;
默认的规则文件:/etc/sysconfig/iptables
CentOS 7(建议不使用firewall):关闭即可使用iptables方式管理
systemctl start|stop|restart|status firewalld.service
systemctl disable firewalld.service
systemctl stop firewalld.service
二、iptables/netfilter包过滤型防火墙
1.iptables实现功能:hook function:钩子函数
input接收、output本机发送、forward本机转发、prerouting路由之前、postrouting路由发生之后
2.表:功能划分(表的优先级由低到高如下)
filter |
包过滤,防火墙; |
nat |
network address translation网络地址转换;用于修改源IP、目标IP或者端口; |
mangle |
拆解报文,做出修改,并重新封装起来; |
raw |
关闭nat表上启用的连接追踪机制; |
3.链:必须大写
链:数据包传播路径,规则的检查清单,可以由一条或多条规则组成
当数据包到达一个链时,iptables就会从链中第一条规则开始检查,查看该数据包是否满足规则所定义的条件,决定是否按预定义的方法处理该数据包,如果包头不符合链中的规则,iptables就会根据该链的默认策略来处理数据包。
(1)内置链:对应于hook function
PREROUTING刚进入本机、INPUT送往、FORWARD转发、OUTPUT输出、POSTROUTING离开本机报文
INPUT |
过滤所有目标地址是本机的数据包(对进入本机数据包的过滤) |
OUTPUT |
过滤所有本机产生的数据包(对源地址的数据包的过滤) |
FORWARD |
过滤所有进过本机的数据包(源地址和目标地址都不是本机的数据包) |
POSTROUTING |
在数据包离开防火墙时改变数据包的源地址 |
PREROUTING |
数据包到达防火墙时改变数据包的目标地址 |
(2)自定义链:
需要用户自定义并指明调用,用于内置链的扩展和补充,实现灵活规则管理机制;
(3)表所包含的链
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,[INPUT,]OUTPUT,POSTROUTING
filter:INPUT,FORWARD,OUTPUT
(4)链检查顺序
链:链上的规则次序,即为检查的次序;
1) 同类规则(访问同一应用),匹配范围小的放上面;
2) 不同类的规则(访问不同应用),匹配到报文频率较大的放在上面;
3) 将那些可由一条规则描述的多个规则合并起来;
4) 设置默认策略;
4.报文流向
流入本机:PREROUTING--> INPUT
由本机流出:OUTPUT--> POSTROUTING
转发:PREROUTING--> FORWARD --> POSTROUTING
5.规则组成部分
根据规则匹配条件来尝试匹配报文,一旦匹配成功,就由规则定义的处理动作作出处理;
匹配条件:基本匹配条件、扩展匹配条件
处理动作:基本处理动作、扩展处理动作、自定义处理机制
三、iptables命令
iptables[-t table] {-A|-C|-D} chain rule-specification
iptables[-t table] -I chain [rulenum] rule-specification
iptables[-t table] -R chain rulenum rule-specification
iptables[-t table] -D chain rulenum
iptables[-t table] -S [chain [rulenum]]
iptables[-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables[-t table] -N chain
iptables[-t table] -X [chain]
iptables[-t table] -P chain target
iptables[-t table] -E old-chain-name new-chain-name
注释:
rule-specification= [matches...] [target]
match= -m matchname [per-match-options]
target= -j targetname [per-target-options]
规则格式:iptables [-t table] COMMAND chain [-m matchname [per-match-options]]-j targetname [per-target-options]
iptables [-t 表] [操作命令] [链] [[- m] 规则匹配] [-j 目标动作]
注意:链名和目标动作一定要大写
1. -t table
指明表明,类型raw、mangle、nat、filter,默认为filter,可以省略
2.COMMAND
(1)链管理
-N:new,自定义一条新的规则链;
-X:delete,删除自定义的规则链;
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT接受、 DROP丢弃、REJECT拒绝
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除;
(2)规则管理
-A:append,追加;
-I:insert,插入,要指明位置,省略时表示第一条;
-D:delete,删除;指明规则序号或规则本身;
-R:replace,替换指定链上的指定规则;
-F:flush,清空指定的规则链;
-Z:zero,置零;
iptables的每条规则都有两个计数器:匹配到的报文的个数、匹配到的所有报文的大小之和;
(3)查看
-L:list,列出指定鏈上的所有规则;
-n:numberic,以数字格式显示地址和端口号;
-v:verbose,详细信息;-vv,-vvv
-x:exactly,显示计数器结果的精确值;
--line-numbers:显示规则的序号;
3.chain:
PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
4.匹配条件:
(1)基本匹配条件:无需加载任何模块,由iptables/netfilter自行提供;
[!] -s, --source address[/mask][,...]:检查报文中的源IP地址是否符合此处指定的地址或范围;
[!] -d, --destinationaddress[/mask][,...]:检查报文中的目标IP地址是否符合此处指定的地址或范围;
[!] -p, --protocol protocol,IP报文首部的协议
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah,sctp, mh or "all",一般常用{tcp|udp|icmp}
[!] -i, --in-interface name:数据报文流入的接口(网卡);只能应用于PREROUTING、INPUT和FORWARD链;
[!] -o, --out-interface name:数据报文流出的接口(网卡);只能应用于FORWARD、OUTPUT和POSTROUTING链;
(2)扩展匹配条件:需要加载扩展模块,方可生效;
显式扩展:必须要手动加载扩展模块,[-m matchname [per-match-options]];
隐式扩展:不需要手动加载扩展模块;对协议的扩展,所以使用-p指明了协议,就表示已经指明了要扩展的模块;
-p {tcp|udp|icmp} --***
tcp:
[!]--source-port, --sport port[:port]:匹配报文的源端口;可以是端口范围;
[!]--destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
[!]--tcp-flags mask comp
mask指必须要指明的标志位,用逗号隔开,例如 SYN,ACK,FIN,RST
comp必须唯一的标志位,用逗号隔开,例如SYN
例如:“--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, --sport port[:port]:匹配报文的源端口;可以是端口范围;
[!]--destination-port,--dport port[:port]:匹配报文的目标端口;可以是端口范围;
icmp:
[!] --icmp-type {type[/code]|typename} # --icmp-type后可以指明请求,也可以用代码表示
echo-request:8 请求
echo-reply:0 响应
5.处理动作:-j targetname
-jtargetname [per-target-options]
ACCEPT:允许数据包通过
DROP:丢弃数据包
REJECT:拒绝数据包,同时给发送者发送没有接受的通知
RETURN:结束当前返回调用链;
REDIRECT:端口重定向;
LOG:记录日志;
MARK:做防火墙标记;
DNAT:目标地址转换;
SNAT:源地址转换;
MASQUERADE:地址伪装;关闭
...
自定义链:
四、显式扩展匹配条件
必须显式地指明使用的扩展模块进行的扩展;格式:-m 扩展模块 --***
使用帮助:(CentOS 6)maniptables、 (CentOS 7)man iptables-extensions
1.multiport扩展
以离散方式定义多端口匹配;最多指定15个端口;
[!]--source-ports,--sports port[,port|,port:port]...:指定多个源端口;
[!]--destination-ports,--dports port[,port|,port:port]...:指定多个目标端口;
[!]--ports port[,port|,port:port]...:指明多个端口;
实例:~]# iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.67 -p tcp -mmultiport --dports 22,80 -j ACCEPT
2.iprange扩展
指明连续的(但一般不脑整个网络)ip地址范围;
[!]--src-range from[-to]:源IP地址;
[!]--dst-range from[-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}:字符串匹配检测算法;
bm:Boyer-Moore
kmp:Knuth-Pratt-Morris
[!]--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扩展
根据将报文到达的时间与指定的时间范围进行匹配;
--datestartYYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--datestopYYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestarthh:mm[:ss]
--timestophh: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 --dport80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -jDROP
5.connlimit扩展
根据每客户端IP做并发连接数数量匹配;
--connlimit-upton:连接的数量小于等于n时匹配;
--connlimit-aboven:连接的数量大于n时匹配;
实例:~]# iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -mconnlimit --connlimit-above 2 -j REJECT
6.limit扩展
基于收发报文的速率做匹配;令牌桶过滤器机制;
--limitrate[/second|/minute|/hour|/day]
--limit-burstnumber
实例:~]# iptables -I INPUT -d 172.16.100.67 -p icmp --icmp-type 8 -mlimit --limit 3/minute --limit-burst 5 -j ACCEPT
~]# iptables -I INPUT 2 -p icmp -j REJECT
7.state扩展
根据”连接追踪机制“去检查连接的状态,内核中的netfilter记录实现:[!] --state state
conntrack机制:追踪本机上的请求和响应之间的关系;状态有如下几种:
NEW:新发出请求;连接追踪模板中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求;
ESTABLISHED:NEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信状态;
RELATED:相关联的连接;如ftp协议中的数据连接与命令连接之间的关系;
INVALID:无效的连接;
UNTRACKED:未进行追踪的连接;
实例:~]# iptables -A INPUT -d172.16.100.67 -p tcp -m multiport --dports 22,80 -m state --stateNEW,ESTABLISHED -j ACCEPT
~]# iptables -A OUTPUT -s 172.16.100.67 -p tcp -m multiport --sports22,80 -m state --state ESTABLISHED -j ACCEPT
调整连接追踪功能所能够容纳的最大连接数量:/proc/sys/net/nf_contrack_max
已经追踪到到的并记录下来的连接:/proc/net/nf_conntrack
不同的协议的连接追踪时长:/proc/sys/net/netfilter/
iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除;当模板满载时,后续的连接可能会超时
解決方法一般有两个:
(1)加大nf_conntrack_max 值
vi/etc/sysctl.conf
net.ipv4.nf_conntrack_max=
net.ipv4.netfilter.nf_conntrack_max=
(2) 降低 nf_conntrack timeout时间
vi/etc/sysctl.conf
net.ipv4.netfilter.nf_conntrack_tcp_timeout_established=
net.ipv4.netfilter.nf_conntrack_tcp_timeout_time_wait=
net.ipv4.netfilter.nf_conntrack_tcp_timeout_close_wait=
net.ipv4.netfilter.nf_conntrack_tcp_timeout_fin_wait=
五、网络防火墙:NAT服务器
1.nat: network addresstranslation,网络地址转换
NAT将局域网内每台计算机的私网IP地址转换成一个公网合法的IP地址,使局域网计算机能访问Internet资源,节约地址空间。NAT和防火墙技术结合,把局域网内部的IP隐藏起来不被公网容易访问,能够有效避免来自外部网路的***。
需要开启内核路由核心转发功能:/etc/sysctl.conf = 1
snat:source nat
dnat:destination nat
pnat:port nat
(1)snat:POSTROUTING, OUTPUT;让本地网络中的主机通过某一特定地址访问外部网络时;
(2)dnat:PREROUTING;把本地网络中的某一主机上的某服务开放给外部网络中的用户访问时;
2.nat表的target:
(1)SNAT
--to-source[ipaddr[-ipaddr]][:port[-port]]
--random
(2)DNAT
--to-destination[ipaddr[-ipaddr]][:port[-port]]
(3)MASQUERADE
源地址转换:当源地址为动态获取的地址时,MASQUERADE可自行判断要转换为的地址;
--to-portsport[-port]
--random
(4)REDIRECT:端口重定向;
3.示例
SNAT示例:
~]#iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j SNAT --to-source172.16.100.67
MASQUERADE示例:
~]#iptables -t nat -A POSTROUTING -s 192.168.12.0/24 -j MASQUERADE
DNAT示例:
~]#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
REDIRECT示例:
~]# iptables -t nat -A PREROUTING -I eth0 -ptcp -s 192.168.0.0/24 --dport 80 -j REDIRECT --to-ports 443
六、iptables规则优化
1.规则优化原则
服务器端规则设定:任何不允许的访问,应该在请求到达时给予拒绝;
(1)可安全放行所有入站的状态为ESTABLISHED状态的连接;
(2)可安全放行所有出站的状态为ESTABLISHED状态的连接;
(3)谨慎放行入站的新请求
(4)有特殊目的限制访问功能,要于放行规则之前加以拒绝;
2.自定义链:
自定义链:需要被调用才能生效;自定义链最后需要定义返回规则;返回规则使用的target叫做RETURN;
3.保存规则:
规则有效期:使用iptables命令定义的规则,手动删除之前,其生效期限为kernel存活期限;
(1)保存规则至指定的文件:
CentOS6:
~]# service iptables save 默认将规则保存至/etc/sysconfig/iptables文件中;
~]#iptables-save > /PATH/TO/SOME_RULES_FILE
CentOS7:
~]#iptables-save > /PATH/TO/SOME_RULES_FILE
(2)重新载入预存规则文件中规则:
~]# iptables-restore < /PATH/FROM/SOME_RULES_FILE
CentOS 6转用: ~]# service iptables restart
(3)自动生效规则文件中的规则:
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
4.CentOS 7:引入了新的iptables前端管理工具firewalld
管理管理工具:firewalld-cmd, firewalld-config
七、开放被动模式的ftp服务
1.装载ftp连接追踪的专用模块:
~]#modproble nf_conntrack_ftp
2.放行命令连接(假设Server地址为172.16.100.67):
~]#iptables -A INPUT -d 172.16.100.67 -p tcp --dport 21 -m state --stateNEW,ESTABLISHED -j ACCEPT
~]#iptables -A OUTPUT -s 172.16.100.67 -p tcp --sport 21 -m state --stateESTABLISHED -j ACCEPT
3.放行数据连接(假设Server地址为172.16.100.67):
~]#iptables -A INPUT -d 172.16.100.67 -p tcp -m state --state RELATED,ESTABLISHED-j ACCEPT
~]#iptables -I OUTPUT -s 172.16.100.67 -m state --state ESTABLISHED -j ACCEPT