Li Jinli
不必因昨天的眼泪、湿了今天的太阳。

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。

posted on 2020-11-20 13:30  lijinli  阅读(198)  评论(0)    收藏  举报