一、前言
Linux 下的的防火墙功能是非常丰富的,作为 Linux 系统工程师有必要了解一下。防火墙一般分为硬件防火墙和软件防火墙。但是,不管是硬件还是软件防火墙,它们都需要使用硬件来作为联机介质,也需要使用软件来设定安全规则。
二、Linux 的防火墙
2.1 selinux
安全增强型 Linux(Security-Enhanced Linux)简称 SELinux,它是一个 Linux 内核模块,也是 Linux 的一个安全子系统。SELinux 主要由美国国家安全局开发。2.6 及以上版本的 Linux 内核都已经集成了 SELinux 模块。SELinux 的结构及配置非常复杂,而且有大量概念性的东西,要学精难度较大。很多 Linux 系统管理员嫌麻烦都把 SELinux 关闭了。
关闭 selinux 的方法为修改 /etc/selinux/config 文件,将 SELINUX=disabled,默认为 enforcing。
[root@ryan ~]# cat /etc/selinux/config # This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.
#SELINUX=enforcing
SELINUX=disabled
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected,
# mls - Multi Level Security protection.
SELINUXTYPE=targeted
保存配置文件后,重启 Linux 才能生效。临时关闭 selinux 的命令为:
# setenforce 0
可以使用 getenforce 命令获得当前 selinux 状态:
# getenforce
[root@ryan ~]# getenforce
Disabled
2.2 iptables
iptables 是 Linux 上特有的防火墙 netfilter 的机制,iptables 其实是 ip tables 的含义,也就是 IP 表的意思。iptables 是由4个表(table)和5个链(chain)组成。每个表的用途都不一样。在每个表中,又定义了多个链,通过这些链可以设置相应的规则和策略。
CentOS 7.x(RHEL7.x)之后,防火墙规则设置由 firewalld 服务进程默认管理,取代了 CentOS/RHEL 6.x 的 iptables 服务。
iptables 过滤流程图,如下:
4表5链,每个表所涉及到的链,如下:
4个表包括:
filter:数据包过滤,用于防火墙规则,最常用。
net:地址转换,用于网关路由器。
mangle:数据包修改(QOS),用于实现服务质量。
raw:高级功能,如:网址过滤。
5个规则链名包括:
INPUT链:处理输入数据包。
OUTPUT链:处理输出数据包。
PORWARD链:处理转发数据包。
PREROUTING链:用于目标地址转换(DNAT)。
POSTOUTING链:用于源地址转换(SNAT)。
动作包括:
accept:接收数据包。
DROP:丢弃数据包。
REDIRECT:重定向、映射、透明代理。
SNAT:源地址转换。
DNAT:目标地址转换。
MASQUERADE:IP伪装(NAT),用于ADSL。
LOG:日志记录。
实例
查看已添加的iptables规则
# iptables -nvL
默认查看filter表的规则,可以使用 -t 选项表名,来指定查看具体表的规则。如:
# iptables -t nat -nvL
开放指定的端口
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT #允许本地回环接口(即运行本机访问本机)
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #允许已建立的或相关连的通行
iptables -A OUTPUT -j ACCEPT #允许所有本机向外的访问
iptables -A INPUT -p tcp --dport -j ACCEPT #允许访问22端口
iptables -A INPUT -p tcp --dport -j ACCEPT #允许访问80端口
iptables -A INPUT -p tcp --dport -j ACCEPT #允许ftp服务的21端口
iptables -A INPUT -p tcp --dport -j ACCEPT #允许FTP服务的20端口
iptables -A INPUT -j reject #禁止其他未允许的规则访问
iptables -A FORWARD -j REJECT #禁止其他未允许的规则访问
比如常用的放行22端口:
# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
-A/-D:表示增加/删除一条规则(向后追加)。
-I:表示插入一条规则,则是效果跟 -A 类型(想前插入第一条位置)。
-p:表示指定协议,可以是 tcp、udp 或者 icmp。
--dport:跟 -p 一起使用,表示指定目标端口。
--sport:跟-p 一起使用,表示指定源端口。
-s:表示指定源 IP(可以是一个 IP 段)。
-d:表示指定目的 IP(可以是一个 IP 段)。
-j:后面跟动作,其中 ACCEPT 表示允许包,DROP 表示丢掉包,REJECT 表示拒绝包。
-i:表示指定网卡(不常用)。
屏蔽IP
iptables -I INPUT -s 123.45.6.7 -j DROP #屏蔽单个IP的命令
iptables -I INPUT -s 123.0.0.0/ -j DROP #封整个段即从123.0.0.1到123.255.255.254的命令
iptables -I INPUT -s 124.45.0.0/ -j DROP #封IP段即从123.45.0.1到123.45.255.254的命令
iptables -I INPUT -s 123.45.6.0/ -j DROP #封IP段即从123.45.6.1到123.45.6.254的命令是
删除已添加的iptables规则
将所有iptables以序号标记显示,执行:
iptables -L -n --line-numbers
比如要删除INPUT里序号为8的规则,执行:
iptables -D INPUT
三、Linux 系统的任务计划
Linux 中有些管理工作可以通过定期自动执行某一个脚本来完成,这就是 Linux 系统中的任务计划 cron 功能。crontab 命令被用来提交和管理用户的需要周期性执行的任务,与 Windows下的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动 crond 进程,crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
格式为:
crontab(选项)(参数)
Linux 任务计划功能都是通过 crontab 命令来完成的,常用选项如下:
-e:编辑该用户的计时器设置,编辑某个用户的crontab文件内容。如果不指定用户,则表示编辑当前用户的crontab文件;
-l:列出该用户的计时器设置,查看已经设定的任务计划使用 crontab -l 命令,显示某个用户的 crontab 文件内容,如果不指定用户,则表示显示当前用户的 crontab 文件内容。;
-r:删除该用户的计时器设置,从 /var/spool/cron 目录中删除某个用户(username)的 crontab 文件,如果不指定用户,则默认删除当前用户的 crontab文件;
-u<用户名称>:指定要设定计时器的用户名称。
参数:
crontab文件:指定包含待执行任务的 crontab 文件。
Linux下的任务调度分为两类:系统任务调度和用户任务调度。
系统任务调度:系统周期性所要执行的工作,比如写缓存数据到硬盘、日志清理等。在/etc目录下有一个crontab文件,这个就是系统任务调度的配置文件。
/etc/crontab 文件包括下面几行:
[root@ryan ~]# cat /etc/crontab
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/ # For details see man crontabs # Example of job definition:
# .---------------- minute ( - )
# | .------------- hour ( - )
# | | .---------- day of month ( - )
# | | | .------- month ( - ) OR jan,feb,mar,apr ...
# | | | | .---- day of week ( - ) (Sunday= or ) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
前四行是用来配置 crond 任务运行的环境变量,第一行 SHELL 变量指定了系统要使用哪个 shell,这里是bash,第二行PATH变量指定了系统执行命令的路径,第三行 MAILTO 变量指定了 crond 的任务执行信息将通过电子邮件发送给 root 用户,如果 MAILTO 变量的值为空,则表示不发送任务执行信息给用户,第四行的 HOME 变量指定了在执行命令或者脚本时使用的主目录。
用户任务调度:用户定期要执行的工作,比如用户数据备份、定时邮件提醒等。用户可以使用 crontab 工具来定制自己的计划任务。所有用户定义的 crontab 文件都被保存在 /var/spool/cron 目录中。其文件名与用户名一致,使用者权限文件如下:
/etc/cron.deny 该文件中所列用户不允许使用crontab命令
/etc/cron.allow 该文件中所列用户允许使用crontab命令
/var/spool/cron/ 所有用户crontab文件存放的目录,以用户名命名
crontab 文件的含义:用户所建立的 crontab 文件中,每一行都代表一项任务,每行的每个字段代表一项设置,它的格式共分为六个字段,前五段是时间设定段,第六段是要执行的命令段,格式如下:
minute hour day month week command 顺序:分 时 日 月 周
其中:
minute: 表示分钟,可以是从0到59之间的任何整数。
hour:表示小时,可以是从0到23之间的任何整数。
day:表示日期,可以是从1到31之间的任何整数。
month:表示月份,可以是从1到12之间的任何整数。
week:表示星期几,可以是从0到7之间的任何整数,这里的0或7代表星期日。
command:要执行的命令,可以是系统命令,也可以是自己编写的脚本文件。
在以上各个字段中,还可以使用以下特殊字符:
星号(*):代表所有可能的值,例如month字段如果是星号,则表示在满足其它字段的制约条件后每月都执行该命令操作。
逗号(,):可以用逗号隔开的值指定一个列表范围,例如,"1,2,5,7,8,9"
中杠(-):可以用整数之间的中杠表示一个整数范围,例如 "2-6" 表示 "2,3,4,5,6"
正斜线(/):可以用正斜线指定时间的间隔频率,相当于整除,例如 "0-23/2" 表示每两小时执行一次。同时正斜线可以和星号一起使用,例如 */10,如果用在minute字段,表示每十分钟执行一次。
crond 服务
/sbin/service crond start //启动服务
/sbin/service crond stop //关闭服务
/sbin/service crond restart //重启服务
/sbin/service crond reload //重新载入配置
/sbin/service crond status //查看crontab服务状态
四、抓包工具
4.1 tcpdump 工具
tcpdump命令是一款 sniffer 工具,它可以打印所有经过网络接口的数据包的头信息,也可以使用 -w 选项将数据包保存到文件中,方便以后分析。
格式:
tcpdump(选项)
监视指定网络接口的数据包
# tcpdump -nn -i eth0
-nn:直接以IP及port number显示,而非主机名与服务名称;
-c<数据包数目>:收到指定的数据包数目后,就停止进行倾倒操作;
-w<数据包文件>:把数据包数据写入指定的文件。
例如:
[root@ryan ~]# tcpdump -nn -i eth0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size bytes
::13.034947 IP 172.31..xx. > 124.89..xx.: Flags [P.], seq :, ack , win , length
::13.035049 IP 172.31..xx. > 124.89..xx.: Flags [P.], seq :, ack , win , length
::13.081450 IP 124.89..xx. > 172.31..xx.: Flags [.], ack , win , length
-nn 选项的作用是让第三列和第四列显示成 "IP+端口号" 的形式,如果不加 -nn 选项则显示为 "主机名+服务名称"。
监视指定主机和端口的数据包
# tcpdump -nn tcp and host xxx and port xxx -c 100 -w /tmp/1.cap
如果想要获取主机 210.27.48.1 接收或发出的 telnet 包,使用如下命令:
# tcpdump tcp port 23 host 210.27.48.1
4.2 wireshark 工具
使用 wireshark 可以分析数据包,可以通过编辑过滤表达式来达到对数据的分析。需要使用的命令为 tshark,它是一个网络协议分析器。它允许您从实况网络捕获分组数据,或者从先前保存的捕获文件读取数据包,或者将这些分组的解码形式打印到标准输出或将数据包写入文件。tshark 的本地捕获文件格式是PCAP格式,它也是TCPDUMP和各种其他工具使用的格式。
显示访问http请求的域名以及uri
tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
如下所示:
[root@ryan ~]# tshark -n -t a -R http.request -T fields -e "frame.time" -e "ip.src" -e "http.host" -e "http.request.method" -e "http.request.uri"
tshark: -R without - is deprecated. For single-pass filtering use -Y.
Running as user "root" and group "root". This could be dangerous.
Capturing on 'eth0'
"Jul 8, 2018 22:09:02.394273171 CST" 124.89.91.xx www.moonxy.com GET /wordpress/.html
其中:
"Jul 8, 2018 22:09:02.394273171 CST" 为请求时间;
124.89.91.xx 为源地址(访问者 IP);
www.moonxy.com 为请求的域名;
GET 为 http 请求类型;
/wordpress/350.html 为请求的路径;
实时打印当前http请求的url(包括域名)
tshark -s -i eth0 -n -f 'tcp dst port 80' -R 'http.host and http.request.uri' -T fields -e http.host -e http.request.uri -l | tr -d '\t'
如下所示:
[root@ryan ~]# tshark -s -i eth0 -n -f 'tcp dst port 80' -R 'http.host and http.request.uri' -T fields -e http.host -e http.request.uri -l | tr -d '\t'
tshark: -R without - is deprecated. For single-pass filtering use -Y.
Running as user "root" and group "root". This could be dangerous.
Capturing on 'eth0'
www.moonxy.com/wordpress/.html
www.moonxy.com/wordpress/wp-content/uploads///20180422134436_87982.png
www.moonxy.com/wordpress/wp-content/uploads///20180422134518_98463.png
www.moonxy.com/wordpress/wp-content/uploads///20180422134718_91938.png
www.moonxy.com/wordpress/wp-content/uploads///20180422134927_72555.png
www.moonxy.com/wordpress/wp-content/uploads///20180422134946_41004.png
www.moonxy.com/wordpress/wp-content/uploads///20180422134912_12773.png
www.moonxy.com/wordpress/.html
www.moonxy.com/wordpress/wp-content/uploads///20180422140632_57565.jpg