主机防火墙(一般是软件防火墙):针对单个主机进行防护
网络防火墙(一般是硬件防火墙):作为网络的分界点,防护内网之外的攻击
无论是iptables还是firewalld都只是配置防火墙的工具,真正实现数据包连接和转发的是系统内核中的netfilter模块
iptables
规则链
iptables有5个规则链,如果流量经过规则链,就会从该链由上至下匹配遇到的第一条规则。
INPUT控制进入的流量
OUTPUT控制发出的流量
FORWORD控制转发的流量
POSTROUTING负责SNAT
PREROUTING负责DNAT
查看规则
#查看 INPUT OUTPUT FORWORD 规则
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
# 查看 POSTROUTING和PREROUTING snat和dnat 规则
[root@localhost ~]# iptables -L -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
设置规则
iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j ACCEPT
# 22是目标ssh端口, -s 192.168.1.0/24表示允许这个网段的机器来连接,其它网段的ip地址是登陆不了你的机器的。 -j ACCEPT表示接受这样的请求
# -A INPUT 添加到INPUT链中
# -s 源地址
# -p 协议
# --dport 表示目标端口
# -j 表示动作 ACCEPT表示接受 REJECT表示拒绝 DROP表示丢弃
# REJECT会回复拒绝,DROP不进行回复
更改默认规则
默认规则是ACCECP,允许所有流量通过
iptables -P INPUT DROP # 配置默认的不让进
iptables -P FORWARD DROP # 默认的不允许转发
iptables -P OUTPUT ACCEPT # 默认的可以出去
清空当前的所有规则和计数
iptables -F # 清空所有的防火墙规则
iptables -X # 删除用户自定义的空链
iptables -Z # 清空计数
firewalld
firewalld服务,实际上是将防火墙配置命令转换为iptables规则。
防火墙(iptables/firewalld)只能应用于内核管理的网卡。
Zone
firewalld提供了zone的概念,zone就是区域,firewalld将系统划分成多个zone。一个网卡只能属于一个zone,一个zone中可以有多个网卡。zone中的规则应用于该zone中的所有网卡。
firewall-cmd添加规则必须要指定zone。不指定zone的操作就是对缺省zone进行操作
Zone相关操作
# 查看缺省zone
firewall-cmd --get-default-zone
# 设置缺省zone
firewall-cmd --set-default-zone=public
# 列出zone中的网卡
firewall-cmd --list-interfaces --zone=public
# 移除zone中的网卡
firewall-cmd --remove-interface=ens33
# 添加网卡到zone中
firewall-cmd --add-interface=ens33
规则
规则生效时间
默认配置的规则是临时的,需要使用--permanent让规则永久生效
--permanent 表示该规则永久生效,但是不是立刻生效
# 重新加载规则
# 会让--permanent规则立刻生效,并清空临时规则
firewall-cmd --reload
# 将所有临时规则配置为永久规则
firewall-cmd --runtime-to-permanent
查看规则
# 查看所有zone的所有规则
firewall-cmd --list-all-zones
# 列出缺省zone的规则
# 如果一个zone里面没有网卡,那么这个zone就是非active状态
firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
规则类别和配置方法
service规则
# 列出service规则
firewall-cmd --list-services
# 添加service规则
firewall-cmd --add-service=http
# 去除service规则
firewall-cmd --remove-service=http
service和端口的对应关系,在/usr/lib/firewalld/services文件夹的xml文件里。
# 示例 ssh是service名称 port="22"是对应的端口号
[root@localhost ~]# cat ssh.xml
SSH
Secure Shell (SSH) is a protocol for logging into and executing commands on remote machines. It provides secure encrypted communications. If you plan on accessing your machine remotely via SSH over a firewalled interface, enable this option. You need the openssh-server package installed for this option to be useful.
port规则
# 查看端口规则
firewall-cmd --list-port
# 添加端口规则
firewall-cmd --add-port=3333/tcp
rich规则(富规则)
# 添加rich规则
firewall-cmd --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="6379" accept" --permanent
# 查看rich规则语法
man firewalld.richlanguage
SELinux
SELinux可以限制进程可以访问的资源。
SELinux的开启和关闭
# 查看SELinux的状态
# 默认SELinux是开启的,但是一般生产环境会将其禁用
[root@localhost ~]# getenforce
Enforcing
# 临时关闭
[root@localhost ~]# setenforce 0
[root@localhost ~]# getenforce
Permissive
# 实际上Permissive状态还是开启的,只是不对访问进行控制,但是会记录到日志中
# 日志文件位置:/var/log/audit/audit.log
# 临时开启,只有在Permissive状态下可以开启,disabled状态不能直接开启
[root@localhost ~]# setenforce 1
[root@localhost ~]# getenforce
Enforcing
# 永久关闭
# 更改配置文件后重启服务器
# 必须重启才能改成disabled,
# 从disabled更改为其他状态也要重启服务器,并且重启后系统会对所有文件重新成安全上下文,占用时间较长
[root@localhost ~]# vim /etc/selinux/config
SELINUX=disabled
安全上下文
安全上下文是控制进程对文件的访问权限的
查看SELinux安全上下文
# 查看文件的安全上下文
# 9位权限列后面有.表示存在SELinux上下文
[root@localhost html]# ll -lZ
-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 test
# 查看进程的安全上下文
[root@localhost html]# ps auxZ |grep httpd
system_u:system_r:httpd_t:s0 root 42322 0.0 0.5 224056 5000 ? Ss 00:25 0:00 /usr/sbin/httpd -DFOREGROUND
# 关注安全上下文倒数第二列,httpd_t进程只能访问上下文是httpd_sys_content_t的文件
默认安全上下文
在不同位置创建的文件安全上下文是不同的
查看默认安全上下文
# 如果没有默认安全上下文,会定义为unconfined_t
[root@localhost html]# semanage fcontext -l|grep httpd|head
/usr/.*\.cgi regular file system_u:object_r:httpd_sys_script_exec_t:s0
/opt/.*\.cgi regular file system_u:object_r:httpd_sys_script_exec_t:s0
/srv/([^/]*/)?www(/.*)? all files system_u:object_r:httpd_sys_content_t:s0
/srv/([^/]*/)?www/logs(/.*)? all files system_u:object_r:httpd_log_t:s0
更改默认安全上下文
# 添加默认安全上下文(永久生效)
semanage fcontext -a -t http_sys_content_t '/web(/.*)?'
# 临时更改安全上下文
chcon -t http_sys_content_t file
# 默认创建文件的时候可能会没有匹配到详细的安全上下文
# 重新生成安全上下文
restorecon -Rv logs/
# -v显示详细信息
# -R递归
# 在系统重启后重新生成所有安全上下文
touch /.autorelable
对端口进行设置
控制进程能否使用某些端口
# 查看端口
semanage port -l
# 给进程添加端口权限
semanage port -a -t http_port_t -p tcp 12345
# -a 添加
# -t 类型
# -p tcp/udp 端口号
SELinux的布尔值
布尔值控制进程能否进行某些行为
# 查看
[root@localhost html]# semanage boolean -l |head
SELinux boolean State Default Description
privoxy_connect_any (on , on) Allow privoxy to connect any
smartmon_3ware (off , off) Allow smartmon to 3ware
mpd_enable_homedirs (off , off) Allow mpd to enable homedirs
xdm_sysadm_login (off , off) Allow xdm to sysadm login
xen_use_nfs (off , off) Allow xen to use nfs
mozilla_read_content (off , off) Allow mozilla to read content
ssh_chroot_rw_homedirs (off , off) Allow ssh to chroot rw homedirs
mount_anyfile (on , on) Allow mount to anyfile
# 设置布尔值的开关
# 开启
setsebool -P smartmon_3ware on
# 关闭
setsebool -P smartmon_3ware off