13.4 linux的防火墙
13.4.1 SElinux
selinux是linux系统特有的安全机制,这种机制限制太多,配置繁琐,安装完系统,一般要关闭它。临时关闭selinux的方法为:

如果想要永久关闭需要更改配置文件/etc/selinux/config,需要把SELINUX=enforcing改成SELINUX=disabled。更改完该配置文件重启系统方可生效。可以使用getenforce命令获得当前selinux的状态。默认会输出enforcing,临时关闭selinux后在使用这个命令会输出permissive

13.4.2 netfilter
之前的centos版本的防火墙为netfilter,centos7的防火墙为firewalld。关闭firewalld,开启之前的iptables。
l 关闭firewalld服务
l 禁止firewalld服务开机启动
l 安装iptables-services,这样就可以使用之前版本的iptables了
l 让它开机启动
l 启动iptables服务



现在就可以使用之前版本的iptables了,centos上默认没有iptables的规则,这个没啥用,反倒有影响,所以我们先清除规则,然后把清除后的规则保存一下。

-nvL表示查看规则,-F表示清除当前规则(临时清除),再使用service iptables save命令保存一下规则。
1.netfilter的5个表
l filter表主要用于过滤包,该表内建三个链:INPUT,OUTPUT,FORWARD。INPUT作用于进入本机的包,OUTPUT链作用于本机送出的包,FOEWARD作用于跟本机无关的包。
l nat表主要用于网络地址转换,有三个链:PREROUTING链的作用是在包刚刚到达防火墙时改变它的目的地址(如果需要),OUTPUT链改变本地产生的包的目的地址,POSTROUTING链是在包即将离开防火墙时改变其源地址。
l mangle表主要用于给数据包做标记,然后根据标记去操作相应的包。
l raw表可以实现不追踪某些数据包
l security表用于强制访问控制(MAC)的网络规则
2.netfilter的5个链
l PREROUTING:数据包进入路由表之前
l INPUT:通过路由表后目的地为本机
l FOREARDING:通过路由表后,目的地不为本机
l OUTPUT:由本机产生,向外转发
l POSTROUTIONG:发送到网卡接口之前
表和链对应关系如图:

3.iptables基本语法
(1)查看规则以及清除规则
|
-t:后面跟表名,如果不加,则打印filter表的相关信息 |
|
-nvL:查看该表的规则 |
|
-n:不针对ip反解析主机名 |
|
-L:表示列出 |
|
-v:表示列出的信息更加详细 |
|
-F:把所有规则全部删除,如果不加-t指定表,默认只清除filter表的规则 |
|
-Z:表示把包以及流量计数器置零 |
(2)增加/删除一条规则
|
-A/-D:表示增加/删除一条规则 |
|
-I:插入一条规则,与-A一样 |
|
-p:表示指定协议,可以是tcp,udp,icmp |
|
--dport:必须跟-p一起用,表示指定目标端口 |
|
--sport:必须跟-p一起用,表示指定源端口 |
|
-s:表示指定源ip(可以是一个ip段) |
|
-d:表示指定目的ip(可以是一个ip段) |
|
-j:后面跟动作,其中ACCEPT表示允许包,DROP表示丢掉包,REJECT表示拒绝包。 |
|
-i:表示指定网卡 |
插入一条规则,把来自1.1.1.1的所有数据包丢掉:

删除刚刚插入的规则(删除规则时,必须和插入的规则一致,只有-I和-D不一样):

把来自2.2.2.2并且是tcp协议到本机80端口的数据包丢掉:

把发送到10.0.1.14的22端口的数据包丢掉:

把来自192.168.1.0/24这个网段且作用在eth0上的包放行:

想删除某条规则,但又不容易掌握创建时的规则,可以先查看iptables规则:

然后删除某一条规则,使用此命令:(-D后面依次跟链名,规则nmu号)

iptables -P表示预设策略,-P后面跟链名,策略内容或为DROP,或为ACCEPT(默认)。如果在连接远程服务器,执行这个命令会断开。策略一旦设定后,只有使用命令iptables -P INPUT ACCEPT才能恢复成原始状态。
#iptables -P INPUT DROP
如何设定iptables规则(例):
需求:只针对filter表,预设策略INPUT链DROP,其他两个链ACCEPT,然后针对192.168.188.0/24开通22端口,对所有网段开放80端口,对所有网段开通21端口。
写成脚本形式:
1 #cat /usr/local/sbin/iptables.sh 2 #! /bin/bash 3 ipt=“/usr/sbin/iptables” 4 $ipt -F 5 $ipt -P INPUT DROP 6 $ipt -P OUTPUT ACCEPT 7 $ipt -P FORWARD ACCEPT 8 $ipt -A INPUT -s 192.168.188.0/24 -p tcp –dport 22 -j ACCEPT 9 $ipt -A INPUT -p tcp –dport 80 -j ACCEPT 10 $ipt -A INPUT -p tcp –dport 21 -j ACCEPT
完成脚本编写后,直接运行/bin/sh /usr/local/sbin/iptables.sh即可。
关于icmp的包有一个常见的应用:

这里—icmp-type要跟-p icmp一起使用。这个8指的是能在本机ping通其他机器,二其他机器不能ping通本机。
4.nat表的应用
假设机器上有两块网卡eth0和eth1,其中eth0的ip为10.0.2.68,eth1的ip为192.168.1.1。eth0连接了因特网,eth1没有连接。有另一台机器(192.168.1.2)和eth1互通,如何设置才能让连接eth1的这台机器连接因特网,和10.0.2.68互通呢?
1 echo1 “1” > /proc/sys/net/ipv4/ip_forward //打开路由转发功能 2 3 iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASOUERADE //对nat表做ip转发,-o选项后跟设备名,表示出口的网卡;MASOUERADE表示伪装
5.保存和备份iptables规则
咱们设定的防火墙规则只保存在内存中,没有保存到某个文件中,系统重启后以前设定的规则就没有了,所以设定好规则后要先保存:

有时需要清除防火墙的所有规则,可以使用iptables -F,但最好还是停止防火墙服务,防火墙就失效了,但是一旦重新设定规则,防火墙服务会自动开启,停止防火墙服务:
1 #service iptables stop
备份防火墙规则的方法:
1 #sh /usr/local/sbin/iptables.sh 2 3 #iptables-save > myipt.rule
先执行一下刚才的iptables脚本,将它重定向到一个文件里。想要恢复这些规则,使用命令:
1 #iptables-restore < myipt.rule
13.4.3 firewalld
关闭iptables,打开firewalld

firewalld有两个基础概念,分别是zone和service,每一个zone里面有不同的iptables规则,默认有九个zone,centos7默认的zone为public。获取系统所有的zone,命令如下:

查看系统默认的zone:

9个zone:
l drop(丢弃):任何接收的网络数据包都被丢弃,没有任何回复。仅能有发送出去的网络连接。
l block(限制):任何接收的网络连接都被IPv4的icmp-host-prohibited 信息和IPv6的icmp6-adm-prohibited信息所拒绝。
l public(公共):在公共区域内使用,不能相信网络内的其他计算机不会对你的计算机造成危害,只能接收经过选取的连接。
l external(外部):特别是为路由器启用了伪装功能的外部网。你不能信任来自网络的其他计算,不能相信它们不会对你的计算机造成危害,只能接收经过选择的连接。
l dmz(非军事区):用于你的非军事区内的计算机,此区域内可公开访问,可以有限地进入你的内部网络,仅仅接收经过选择的连接。
l work(工作):用于工作区。你可以基本相信网络内的其他计算机不会危害你的计算机。仅仅接受经过选择的连接。
l home(家庭):用于家庭网络。你可以基本信任网络内的其他计算机不会危害你的计算机。仅仅接收经过选择的连接。
l internal (内部):用于内部网络。你可以基本上信任网络内的其他计算机不会威胁你的计算机。仅仅接受经过选择的连接。
l trusted(信任):可接受所有的网络连接。
关于zone的命令:
设定默认的zone为work

查看指定网卡所在的zone

给指定网卡设置zone

针对网卡更改zone

针对网卡删除zone

查看系统所有网卡所在的zone

其实,之所以有九种zone,是因为每一个zone里面都使用了不同的service,service就是针对一个服务(端口)做的iptables规则。
列出当前系统所有的service:

这些service都是由一个个配置文件定义的,配置文件的模板在/usr/lib/firewalld/services/目录下,真正生效的配置在/etc/firewalld/services目录下面(默认为空)。
查看当前zone下有哪些service

查看指定zone下有哪些service

13.5 linux系统的任务计划
13.5.1 命令crontab
crontab命令的常用选项:
l -u:表示指定某个用户,不加-u则为当前用户
l -e:表示指定计划任务
l -l:表示列出计划任务
l -r:表示删除计划任务


这里使用crontab -e来编写任务计划,实际上是使用vim工具打开了crontab的配置文件(/var/spool/cron/root,不能直接编辑此文件),我在里面编写了01 10那一行的内容。
这一行表示在6月5日(这一天必须是星期三)的10点01分执行命令:echo “ok” > /root/cron.log
crontab配置文件
基本格式: * * * * * command
分 时 日 月 周 命令
第一列表示分钟1-59,每分钟用*或者*/1表示
第二列表示小时1-23,0表示零点
第三列表示日期1-31
第四列表示月份1-12
第五列表示星期0-6,0表示星期天
第六列表示要运行的命令
crontab -l:查看已经设定的任务计划

crontab -r:删除任务计划(删除全部),如果想只删除一条计划,可以使用-e选项进入crontab进行编辑

13.5.2 cron练习题
(1)每天22点28分清除/var/log/show.log这个文件,配置并验证:


(2)每周日3点执行/bin/sh /usr/local/sbin/backup.sh

(3)每月14日4点10分执行/bin/sh /usr/local/sbin/backup_month.sh

(4)每隔8小时执行ntpdate time.windows.com

(5)每天的1点,12点,18点执行/bin/sh /usr/local/sbin/test.sh

(6)每天的9点到18点执行/bin/sh /usr/local/sbin/test2.sh


每隔八小时就是用全部小时除以8,应该是0,8,16三个数。当遇到多个数时,需要用逗号隔开。时间段可以用n-m表示。
查看crond服务是否启动,启动状态显示为active(running),未启动显示为inactive(dead):

13.6 Linux系统服务管理
13.6.1 chkconfig服务管理工具
使用命令chkconfig --list列出所有的服务及其每个级别的开启状态

其中0为shutdown动作,1为重启至单用户模式,6为重启,2为无NFS支持的多用户模式,3表示完全多用户模式,4保留给用户自定义,5表示图形登陆方式。
更改某级别下的开启状态:

--level指定级别,后面是服务名,然后是off或on,--level后面可以指定多个级别,比如--level 345,还可以省略级别,默认是针对2,3,4,5操作的

chkconfig也可以把某个服务加入系统服务或者删除,命令为“chkconfig –add/del 服务名”,此功能常用于把自定义的启动脚本加入到系统服务当中。



13.6.2 systemd服务管理
列出系统所有服务

与服务相关的命令
|
systemctl enable crond.service |
让某个服务开机启动(.service可以省略) |
|
systemctl disable crond.service |
不让开机启动 |
|
systemctl status crond.service |
查看服务状态 |
|
systemctl start crond.service |
启动某个服务 |
|
systemctl stop crond.service |
停止某个服务 |
|
systemctl restart crond.service |
重启某个服务 |
|
systemctl is-enabled crond |
查看某个服务是否开机启动 |
系统所有unit,分为以下类型:
l service:系统服务
l target:多个unit组成的组
l device:硬件设备
l mount:文件系统挂载点
l automount:自动挂载点
l path:文件或路径
l scope:不是由systemd启动的外部进程
l slice:进程组
l snapshot:systemd快照
l socket:进程间通信的套接字
l swap:swap文件
l timer:定时器
以上每种类型的为文件都为一个unit,这些unit组成了系统的各个资源。
与unit相关命令:
|
systemctl list-units |
列出正在运行的unit |
|
systemctl list-units --all |
列出所有的unit |
|
systemctl list-units --all --state=inactive |
列出所有inactive的unit |
|
systemctl list-units --all --type=service |
列出所有状态的service |
|
systemctl list-units --type=service |
列出状态为active的service |
|
systemctl is-active crond.service |
查看某个unit是否active |
系统为了方便管理用target来管理unit,查看当前系统所有的target:

查看一个target包含的所有unit:

查看系统默认的target:

设置默认的target:

service,unit,target之间的关系:
(1)一个service属于一种unit
(2)多个unit一起组成了一个target
(3)一个target里面包含了多个service,可以查看文件/usr.lib/systemd/system/sshd.service里面【install】部分的内容,它就定义了该service属于哪一个target。
浙公网安备 33010602011771号