防火墙,顾名思义,是用于防止一些可能造成的威胁对操作系统造成破坏,为了保护系统而采取的一种防护措施,将威胁挡在防火墙外;iptables,防火墙命令,用于编写netfilter规则,将其送入内核空间,当报文从内或外传输时,对内核空间的规则进行匹配,由上到下,匹配到的第一条规则后,就不再匹配下面的规则,防火墙的这种匹配方式称之为首项匹配;防火墙有几种分类方式一种是软硬件防火墙,对应用程序和底层硬件的防护;一种是主机防火墙,以及网络防火墙;主机防火墙是一种局限于当前主机的防火墙,主要针对于该主机的报文的输入输出,对其进行匹配筛选;网络防火墙则是通过外网,服务器,内网三者或者更多之间所构建的一种防火墙机制,比较来说,网络防火墙在企业工作中可能更加常用;
netfilter:位于Linux内核中的防火墙组件;防火功能实现的主体;
iptables:专门为netfilter编写规则的用户空间中的应用程序工具;
在iptables命令中有五种chain(链),INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTINGG
INPUT:当前主机的从用户空间到达内核空间的入口;
OUTPUT:当前主机从内核空间到用户空间的入口;
FORWARD:当金星主机转换,即当前主机作为另外两台主机的中转时使用,通常可用于设置局域网与外网之间的服务器,对内外网设置域的转换,通过中转FORWARD设置内网的防火墙;
PREROUTING:是目的地址转换(DNAT),要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的服务器。
POSTROUTING:是源地址转换(SNAT),要把你内部网络上受防火墙保护的ip地址转换成你本地的公网地址才能让它们上网。
iptables中有四个表,分别是:filter,mangle,nat,raw
filter:过滤防火墙,常用于本机的防火墙设置,允许那个端口访问或者允许哪些主机访问等;
mangle:拆解报文并对封装格式进行修改,然后再重新封装报文;
nat:进行网络地址转换;SNAT,DNAT,还可以进行端口的转换;
raw:关闭nat表上启用的连接追踪的机制;
各表的优先级次序(从高到低):
raw --> mangle --> nat --> filter
各表包含哪些链:
raw:PREROUTING,OUTPUT
mangle:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
nat:PREROUTING,OUTPUT,POSTROUTING,INPUT
filter:INPUT,FORWARD,OUTPUT
数据报文的流向:
流入本机访问某进程的数据报文:
PREROUTING --> INPUT
由本机某进程发送出去的数据报文:
PREROUTING --> OUTPUT --> POSTROUTING
经由本机转发的数据报文:
PREROUTING --> FORWARD --> POSTROUTING
iptables基本命令:书写需要匹配的规则,当规则一旦被匹配就不会再往下寻找匹配的规则;规则书写主要是两个部分,1.匹配条件,2.动作;
匹配条件有基本匹配以及扩展匹配两种;
基本匹配即对IP地址以及端口号,协议类型等匹配;
扩展匹配则是在对基本匹配的基础上扩展,对功能模块进行匹配;
动作:常用的动作有ACCEPT接受,DROP拒绝,REJECT拒绝(并通知对方我拒绝了你)
规则的通用编写格式:
iptables [-t table] COMMAND CHAIN [-m matchname [per-match-options]] -j targetname [per-target-options]
-t table:指定使用哪个表,需要对自己所要书写的规则有一个明确的定位,确定使用那种表上的哪条链;
COMMAND:iptables的操作选项;
链操作选项:
-P:设置默认策略,即设置一个链中的规则全部不匹配后的操作,通常不采用设置默认链的方 式,而是在链的尾部插入一条DROP规则;
-F:清空链上的规则,若不指定具体那个表的那条链,则清空filter表的所有规则;
-X:删除自定义链,删除的自定义链引用次数必须为0才能删除成功;
-N:创建自定义链;
示例:
#iptables -P INPUT DROP
#iptables -F
#iptables -N wjq
#iptables -X wjq
规则的操作选项:
-A:在链的尾部插入一条规则;
-I #:指定插入位置将规则插入到#处;若不指定默认插入到第一行;
-D #:删除规则;
-R:修改链的规则,需要指定修改链的位置;
示例:
#iptables -A INPUT -s 172.16.72.2 -d 172.16.72.4 -j ACCEPT
#iptables -I INPUT -s 172.16.72.2 -d 172.16.72.4 -j ACCEPT
#iptables -D INPUT 1
#iptables -R INPUT 2 -s 172.16.72.2
修改filter表中的INPUT链,将其修改为外部主机无法ping通该主机
讲规则插入到filter表中的INPUT链上,使外部主机能够ping通该网段主机
查看链的操作选项:
-L:列出指定表指定列上的所有规则;
-n:以数字化的形式显示;
-v:显示详细信息;
示例:
#iptables -nvL
基本匹配条件:
[!] -s 源IP:检查传输过来的报文的源IP地址是否匹配指定的规则的源IP;
[!] -d 目的IP:检查传输过来的报文的目的IP地址是否匹配指定的规则的目的IP;
示例:
设置源主机172.16.0.0/16网段的主机到目标主机172.16.72.6的规则
[!] -p 协议:协议如tcp,udp,icmp等;
tcp:
--dport port:指定tcp的源端口,查看传输报文的源端口是否匹配;
--sport port:指定tcp的目的端口,查看传输报文的目的端口是否匹配;
--tcp-flag mask comp:
mask:要检查的标志位,如URG,ACK,PSH,RST,SYN,FIN;
comp:标志位置1的列表,不在该列表中的标志位为0;
示例:
所有主机都可以访问目标主机172.16.72.6的22号端口
当前主机可以访问自身的web站点中的内容
udp:
--dport port:指定udp的源端口,查看传输报文的源端口是否匹配;
--sport port:指定udp的目的端口,查看传输报文的目的端口是否匹配;
icmp:
--icmp-type:
8:request,外部主机ping该主机时的请求;
0:reply,本主机ping外部主机是的回复;
示例:
设置阻止外部主机ping通当前主机
[!] -i:检查数据报文入站的接口是否对应此条件中指定的接口;
[!] -o:检查数据报文出站的接口是否对应此条件中指定的接口;
扩展匹配条件:
-m multiport:多端口匹配,可以一次匹配多个端口,最多达到15个端口;
[!] --dports port[,port|,port:port]
[!]--sports port[,port|,port:port]
示例:对多端口设置规则
-m iprange:设置源IP或目的IP的指定范围;
[!] --src-range:源IP的指定范围;
如:172.16.72.0-172.16.72.10
[!]--dst-range:目的IP的指定范围;
示例:设置由源地址172.16.72.0至172.16.72.10的主机可以访问本主机的22,80,445端口
-m time:设置报文访问的时间,可以设置在几点到几点之间 是否能够访问,星期几,几月这些时 间都可以通过扩展模块设置;
--timestart HH:MM:SS:开始时间如9点,09:00:00;
--timestop HH:MM:SS:结束时间;
[!] --weekdays [1,2,3,4,5,6,7]:设置星期;
[!] --monthdays:设置月份;
示例:设置不能在周日访问22,80端口的规则
-m string:设置关键字匹配的扩展模块,当匹配某关键字时允许或拒绝访问,通常用于web站点访 问;
--string "PATTERN":匹配的关键字;
--algo {bm|kmp}:匹配关键字的算法;
示例:设置web站点关键字过滤,当遇到关键字admin,则拒绝访问
-m connlimit:根据每个客户端IP做并发连接数的匹配;,可以对ssh,ftp,telnet等进行连接数 的设定;
--connlimit-upto n:连接数数量小于等于n,此时规则应设置为允许;
--connlimit-above n:连接数数量大于n,此时规则应设置为拒绝;
示例:当23端口的telnet远程连接大于5时,拒绝访问
-m limit:设置报文访问速率;几分钟访问几次等;
--limit #[second|minute|hour|day]:设置访问频率;
--limit-burst #:设置初始访问数量,当这个访问数量执行完后,才开始进行访问频率的匹 配;
示例:限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒
-m state:设置连接追踪机制;
--state [ESTABLISHED|NEW|RELATED|INVALID|UNTRACKED]:
ESTABLISHED:已经建立起来的连接;
NEW:没有建立起来的连接
RELATED:与其他已建立的连接相关联的状态;关联态或衍生态;
INVALID:无法识别的状态;无效状态;
UNTRACKED:未追踪的连接;
state扩展几乎可以涵盖之前所有讲过的匹配规则,可以讲过这些规则浓缩;
通常state规则可以设置ESTABLISHED在第一条规则处,匹配那些已经建立起来的连接,再在规 则后面创建一个个状态为NEW的规则即可;
在使用state扩展配置ftp时,由于ftp是将端口随机衍生出两一个端口来作为主机访问端口,所 以需要RELATED的扩展,除此以外还需要对应的追踪模块nf_conntrack_ftp
可以使用modprobe命令装载,也可以直接在配置文件/etc/sysconfig/iptables-config文件中 写入IPTABLES_MODULES="nf_conntrack_ftp"
示例:
设置通用的ESTABLISHED状态,可以对所有已创建连接的端口协议等允许访问
设置访问172.16.72.6web站点的第一次访问,即未连接的访问为允许,这样下次连接时的状 态即为ESTABLISHED
网络防火墙:
filter表中的FORWARD链规则设置;
nat表中的相关链的规则设置;
自定义链;
FORWARD链:
实现内网与外网之间的转发时使用中间服务器的FORWARD链进行防火墙过滤转发功能;
在FORWARD链上定义规则,要注意以下几个问题:
1.对于经由FORWARD链的数据,在做访问控制时要注意数据的流动方向;即源地址和目的地址, 源端口和目的端口;
2.如果可以启用连接追踪机制,建议将双方向的状态为
ESTABLISHED的数据直接放行,且将此规则放置于链的第一条;
3.必须在链的最后设置默认拒绝所有数据的规则,可以设置默认策略,也可以设置拒绝规则;
iptables网络防火墙练习:
1.给一台Linux安装三块网卡,提供三个网络接口;
2.内网中用户主机所在的网段为172.18.0.0/16,所有服务器所在的网段为172.16.0.0/16,外 部网络为192.168.100.0/24网段;服务器所在网络中,可以使用一台服务器实现多个服务,也可以 使用多台服务器分别实现各个服务,可自行根据你的计算机的性能来决定;并且为内部的所有主机 和服务器指定正确的网关;外部主机无需指定网关;
3.要求:
1) 内网用户可以访问所有服务器提供的所有服务(samba,ftp,dns,web(http)),但只有 172.18.18.18主机能够使用ssh和telnet协议访问所有内网服务器;
2) 内网用户可以访问外部网络;
3) 内网服务器不得主动访问任何其他网络中的任何主机,只能被访问;
4) 外网用户只能访问内网服务器的web服务;
三台主机,内网主机1,内网主机2,内网服务器,外网主机;
内网主机1:172.18.0.2
内网主机2:172.18.18.18
内网服务器:
三个网卡分别是
服务器网卡172.16.72.6
内网网卡:172.18.0.1
外网网卡:192.168.100.1
配置命令同上
外网主机:
外网网卡:192.168.100.2
配置命令同上
配置路由:
在内网主机
[root@localhost ~]# ip route add default via 172.18.0.1
在外网主机
[root@localhost ~]# ip route add default via 192.168.100.1
设置内网服务器路由转发功能
[root@localhost ~]# sysctl -w net.ipv4.ip_forward=1
[root@localhost ~]# sysctl -p
至此内网,内网服务器,外网之间可正常通信;可以在内网服务器上filter表上的FORWARD链 上进行相关配置;如
先设置内网服务器FORWARD的拒绝访问,在设置其可以通过该防火墙的相关服务信息;
这样内外网之间的通信就需要我们设置防火墙的相关规则才可通信;4
设置状态state在连接已建立,及相关衍生态的规则,一般这类规则都放在第一条,根据其使 用频率而定;
①内网用户可以访问外网
设置内网主机能够ping通外网主机,而外网主机无法ping通内网主机,在内网服务器的 FORWARD链上;
内网ping外网:
外网ping内网:
通过类似的规则可以使内网用户访问外网,而外网无法访问内网,如添加内网通过内网服务器 访问外网20,21,22,80端口的服务
[root@localhost ~]# iptables -I FORWARD 4 -s 172.18.0.0/16 -d 192.168.100.0/24 -m state --state NEW -j ACCEPT
②内网用户可以访问所有服务器提供的所有服务(samba,ftp,dns,web(http)),但只有 172.18.18.18主机能够使用ssh和telnet协议访问所有内网服务器;
[root@localhost ~]# iptables -I INPUT -s 172.18.0.0/16 -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -I INPUT 2 -s 172.18.0.0/16 -p tcp -m multiport -- dports 20,21,22,80,139,445 -m state --state NEW -j ACCEPT
[root@localhost ~]# iptables -I INPUT 3 -s 172.18.0.0/16 -p udp -m multiport -- dports 137,138 -m state --state NEW -j ACCEPT
[root@localhost ~]# iptables -A INPUT -j DROP
[root@localhost ~]# modprobe nf_conntrack_ftp
内网主机访问内网服务器的httpd:
内网主机访问内网服务器的ftp:
内网主机访问内网服务器的samba:
内网主机访问内网服务器的DNS:
在内网服务器中配置主DNS服务器区域数据:
/var/named/qhdlink.com.zone
chown named:named /var/named/qhdlink.com.zone修改权限
定义区域:
/etc/named.rfc1912.zones
修改主配置文件,使内网主机拥有访问内网主服务器中DNS的权限
修改allow-query{}
/etc/named.conf 将listen-on改为any,监听内网服务器的全部IP地址
将aliow-query也改为any,或将其改为172.18.0.0/16也可;
直接修改之前添加的udp端口,添上关于DNS的53端口
[root@localhost ~]# iptables -R INPUT 3 -s 172.18.0.0/16 -p udp -m multiport --dports 53,137,138 -m state --state NEW -j ACCEPT
内网主机访问内网服务器DNS:
172.18.18.18主机能够使用ssh和telnet协议访问所有内网服务器
对内网主机2设置静态路由指向服务器对于内网的IP 172.18.0.1
设置内网服务器防护墙;
[root@localhost ~]# iptables -R INPUT 6 -p tcp -m multiport --dports 22,23 -s 172.18.18.18 -m state --state NEW -j ACCEPT
访问结果:
③内网服务器不得主动访问任何其他网络中的任何主机,只能被访问;
[root@localhost ~]# iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -j DROP
④外网用户只能访问内网服务器的web服务;
[root@localhost ~]# iptables -I INPUT 2 -s 192.168.100.0/24 -m state --state ESTABLISHED -j ACCEPT
[root@localhost ~]# iptables -I INPUT 3 -s 192.168.100.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT
外网访问内网服务器web:
内网服务器整体防火墙配置:
filter INPUT链:
filter FORWARD链:
filter OUTPUT链:
nat表:
iptables防火墙中的nat表主要适用于进行内网与外网通信的源地址转换SNAT以及目的地址转换 DNAT的操作;
在对nat表配置相关规则时,需要明确讲规则插入到哪个链中;
CentOS 7中的nat表有四条链:POSTROUTING,PREROUTING,INPUT,OUTPUT
CentOS 6中nat表有三条链:PREROUTING,POSTROUTING,OUTPUT
SNAT:源地址转换,将内网源地址转换为可以在外网中使用的IP地址,通常用于一个局域网对外部 表现为一个IP地址;在进行源地址转换时需要先查找路由表看是否有对应的路由条目,若无则无 法转发,所以SNAT的实现需要先查找路由表,在POSTROUTING链上编写规则;
注意:在内网服务器上进行源地址转换时,转换的地址,必须在该主机上事先存在;
在内网服务器上添加SNAT转换的IP地址:172.16.72.50/16
编写SNAT转换规则:当源主机为172.18.0.0/16网段的IP时,转换IP地址为172.16.72.50
在内网主机172.18.18.18处ping 192.168.100.2,再在内网服务器的对应192.168.100.1的外网接 口的设备处抓包;
由上图可见,当172.18.18.18主机ping 192.168.100.2时,经过内网服务器,并在内网服务器进 行IP地址的转换,转换为172.16.72.50;
MASQUERADE:
针对于动态IP地址进行的源地址伪装,自动选取内核中存在的IP地址作为伪装;
--to-ports port[-port]
抓包查看:
当前内网服务器的IP地址有:172.16.72.6,172.10.0.1,192.168.100.1
由图可见,两组数据,源地址转换的IP地址都不同;
DNAT:目的地址转换,将外网的公告地址转换为能访问内网的IP地址;在路由之前就完成地址转 换,将此类规则配置在PREROUTING链上;
设置外网ping在外网活动的IP172.16.72.50,在内网服务器处,172.16.72.50被转换为内网的源 地址172.18.18.18.
在外网主机192.168.10.2处ping 172.16.72.50,再在内网服务器的对应172.18.18.0.0/16的外网 接口的设备处抓包;
由上图可见,外网主机ping 172.16.72.50后,172.16.72.50被转换为172.18.18.18;
iptables规则保存和读取:iptables规则对于系统的重要性不言而喻,而当我们做出了一些错误的 规则部署时,我们需要一个可以将以前规则保存起来的功能,这样就可以有效的保障防火墙的运 行,不至于产生大的危险;
iptables-save:规则保存命令
使用方法:采用输出重定向的方式
iptables-save > /PATH/TP/FILE
iptables-restore:规则读取命令
使用方法:采用输入重定向的方式
iptables-restore < /PATH/TO/FILE
CentOS 7 与CentOS 6的命令使用一致
注意:可以使用crontab的任务调度的形式,在指定时间内恢复一次防火墙的规则,这样,即便是 遭到大的破环也可以恢复系统的正常运行;
也可使用如下方式:
service iptables save
默认会将当前生效的所有规则直接送往/etc/sysconfig/iptables文件中保存
service iptables restore|restart
直接将/etc/sysconfig/iptables中保存的规则载入;
SELinux:使美国安全局NSA对于强制访问控制的实现,是最杰出的安全子系统;
SELinux安全系统是工作于内核当中,在开发出来时,因为windows系统的内核不是开源的,属于企业的机密,所以美国安全局就无法基于windows使用SELinux,而Linux从开发之初就是开源,美国安全局基于Linux开发的这款安全系统,所以也称之为SELinux;
SELinux的安全级别有四种A,B,C,D,A级别为最高,但目前很少有企业对系统的防护达到了A级别,通常达到B级别已经是很完善的防护系统了;A级别需要的是全程监控,即硬件生产的时候监控,运送的时候监控,组装的时候监控,即让这套防护系统的完成都处于监控下,一丝不苟地完成;
基于SELinux的访问控制机制有两种,一种是自主访问控制机制DAC,即针对某个特定的用户和组进行性的权限设置;一种是强制访问控制机制MAC,这种机制不是针对于用户去访问,而是针对于发起操作的进程与进程所需要操作的文件之间的类型是否相同,相同则可以访问操作,不同则不允许,这就要引出一个新的概念Sandbox沙箱;
Sandbox沙箱会根据所要操作的文件的类型和沙箱中的进程的类型匹配才可以载入到沙箱,在进行这些操作时会查看策略库,策略库中是一条条的规则,是进程能不能操作文件的关键,每一次操作文件的时候都会去查看策略库中的规则,若可匹配,且可以载入到沙箱,则可以操作;为了加强规则的匹配效率,需要讲规则编译成二进制内容;
SELinux为每个文件都设置了安全标签,安全用来标记文件,用来与进程之间操作时比对其类型是否匹配,安全标签有四个字段,其中最重中的就是文件类型字段;
user-identify:role:domain|type:sencitivity
user-identify:SELinux用户身份标识;
role:角色;
domain|type:域(进程),类型(文件);进程的域和文件的类型能够匹配的上才能访问;
sencitivity:敏感度,如s0;
ls --context:显示当前路径下的带有安全标签的文件详细信息;
ps auxZ:列出当前进程,包括进程对应的域;
SELinux几种工作模式:
enforcing - SELinux security policy is enforced.
permissive - SELinux prints warnings instead of enforcing.
disabled - No SELinux policy is loaded.
enforcing:强制状态,表示SELinux已运行,并且按照进程与文件之间的类型进行限制;
permissive:宽容状态,SELinux已运行,但是对于进程与文件不匹配的情况只会发出警告而没有 实际行动;
disabled:关闭SELinux状态;
getenforce:查看当前SELinux状态;
setenforce {0|1}:设置当前SELinux状态,0为permissive状态,1为enforcing状态;
由图可知,我们平常使用httpd是将SELinux关闭访问,我们所创建的DocumentRoot的文件类型为 default_t,而正常的httpd进程所对应的文件的类型为httpd_sys_script_t;但这种情况下我们能访 问就是因为我们开启了permissive状态;而当我们开启了SELinux的enforcing时就无法正常访问;
想要在SELinux开启的状态下访问httpd的web站点,只需要修改web站点的文件属性即可,这个时 候就需要chcon命令;
chcon [option] context_type FILEPATH
-t context_type:修改的属性;
-R:递归修改;
--reference=filepath:按指定的文件类型修改;
可以使用restorecon命令还原某文件或目录的安全上下文为默认值;
restorecon
-R:递归;
规则库:SELinux中的策略库都是以二进制代码的形式表示,想要对其操作,只能对布尔型的规则 库进行操作,对规则库进行修改,就可以在SELinux为enforcing状态下实现我们想要实现的一些服 务,如ftp,samba,nfs等;
查看规则库:
getsebool -a:显示所有已经生效的布尔型规则;
setsebool -P:写入策略文件,使更改永久生效;
想要使规则开启只需将规则置1即可;
开启ftp服务:
将前两个规则开启:
开启nfs服务:
正常启动即可
开启samba服务:
samba配置信息
启动smb,nmb
service smb start
service nmb start
在客户端主机挂载共享目录:
访问挂载后的共享目录:
在samba主机配置SELinux的读写布尔规则:
再次访问: