linux防火墙
防火墙的核心是数据报文过滤
工作在主机或者网络的边缘,对进出的数据报文进行检查,监控,并且能够根据事先定义的匹配条件和规则做出相应的动作的组件,机制或者系统
linux一般都是作为服务器系统来使用,对外提供一些基于网络的服务
通常我们都需要对服务器进行一些网络访问控制,类似防火墙的功能
常见的访问控制包括:哪些ip可以访问服务器、可以使用哪些协议、哪些接口,是否通过数据包进行修改等
如:服务器可能受到来自某个ip攻击,这时就需要禁止所有来自ip的访问
linux内核集成了网络控制功能。通过netfilter模块来实现
linux内核通过netfilter模块实现网络访问控制功能在用户 层我们可以通过iptables程序对netfilter进行控制管理。iptables 是一个应用层的应用程序,它通过 Netfilter 放出的接口来对存放在内核内存中的 XXtables(Netfilter的配置表)进行修改。这个XXtables由表tables、链chains、规则rules组成,iptables在应用层负责修改这个规则文件。类似的应用程序还有 firewalld 。
netfilter可以对数据进行允许、丢弃、修改操作
netfilter支持通过以下方式对数据包进行分类:
源ip地址
目标ip地址
使用接口
使用协议(TCP UDP ICMP)
端口号
连接状态 (new established related invalid)
iptables service 首先对旧的防火墙规则进行了清空,然后重新完整地加载所有新的防火墙规则,而如果配置了需要 reload 内核模块的话,过程背后还会包含卸载和重新加载内核模块的动作,而不幸的是,这个动作很可能对运行中的系统产生额外的不良影响,特别是在网络非常繁忙的系统中。
如果我们把这种哪怕只修改一条规则也要进行所有规则的重新载入的模式称为静态防火墙的话,那么 firewalld 所提供的模式就可以叫做动态防火墙,它的出现就是为了解决这一问题,任何规则的变更都不需要对整个防火墙规则列表进行重新加载,只需要将变更部分保存并更新到运行中的 iptables 即可,它具备对 IP v4 和 IP v6 防火墙
设置的支持。
应用层 (通过人机交互实现各种服务) 系统调用 用户层
——————————————————————————————
内核接口层
TCP/UDP ip_tables 内核模块
网络层 ip hook 回调函数点 Netfilter
数据链路层
———————————————————————————— ——
物理层 硬件/驱动层
五元组 (保障网络安全)
源ip 数据报文从哪来
目ip 数据报文从哪去
源端口 1--1024预定义端口
目的端口
传输协议
(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容)
内核通过钩子函数实现(hook function)
五个位置的钩子函数:
-
- INPUT链:当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
- OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
- FORWARD链:当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
- PREROUTING链:在对数据包作路由选择之前,应用此链中的规则,如DNAT。
- POSTROUTING链:在对数据包作路由选择之后,应用此链中的规则,如SNAT。
filter表 数据包过滤
主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter
nat表 地址转换
主要用于修改数据包的IP地址、端口号等信息(网络地址转换SNAT、DNAT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过
这个表一次。
mangle表 报文重构
拆解报文,作出修改并重新封装的功能
raw表 原始报文
是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。(关闭nat表中的连接追踪机制)在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING
4个表的优先级由高到低的顺序为:raw-->mangle-->nat-->filter
例:如果PREROUTING链上,即有mangle表,也有nat表,那么先由mangle处理,然后由nat表处理
RAW表只使用在PREROUTING链和OUTPUT链上,因为优先级最高,从而可以对收到的数据包在连接跟踪前进行处理。一但用户使用了RAW表,在某个链上,RAW表处理完后,将跳过NAT表和MANGLE表处理,即不再做地址转换和数据包的链接跟踪处理了.
防火墙的核心是数据报文过滤
网络模块由内核实现,而过滤的实现必须在内核中,而用户是无法直接访问内核,更别说把过滤规则放置到内核中,
因此在TCP/IP协议栈上,选取了几个不同的位置,开放给用户空间的应用程序,该应用程序可以通过系统调用将规则
发送到指定的内核位置。
功能
可以保护易受攻击的服务
控制内外网的访问
集中管理内网安全性
提高网络保密性和私有性
记录网络的使用状态,提供规划依据
工作流程:网口数据包由底层的网卡NIC接收,通过数据链路层的解包之后(去除数据链路帧头),就进入了TCP/IP协议栈(本质就是一个处理网络数据包的内核驱动)和Netfilter混合的数据包处理流程中了。数据包的接收、处理、转发流程构成一个有限状态向量机,经过一些列的内核处理函数、以及Netfilter Hook点,最后被转发、或者本次上层的应用程序消化掉。
动作
ACCEPT 接受数据包
DROP 丢弃数据包
REJECT 丢弃数据包并向发送者返回错误消息
命令格式:
-
- -A:新增一条规则,到该规则链列表的最后一行
- -I:插入一条规则,原本该位置上的规则会往后顺序移动,没有指定编号则为1
- -D:从规则链中删除一条规则,要么输入完整的规则,或者指定规则编号加以删除
- -R:替换某条规则,规则替换不会改变顺序,而且必须指定编号。
- -P:设置某条规则链的默认动作
- -nL:-L、-n,查看当前运行的防火墙规则列表
-
- [-i|o 网卡名称]:i是指定数据包从哪块网卡进入,o是指定数据包从哪块网卡输出
- [-p 协议类型]:可以指定规则应用的协议,包含tcp、udp和icmp等
- [-s 源IP地址]:源主机的IP地址或子网地址
- [--sport 源端口号]:数据包的IP的源端口号
- [-d目标IP地址]:目标主机的IP地址或子网地址
- [--dport目标端口号]:数据包的IP的目标端口号
-m:extend matches,这个选项用于提供更多的匹配参数,如:
-
- -m state --state ESTABLISHED,RELATED
- -m tcp --dport 22
- -m multiport --dports 80,8080
- -m icmp --icmp-type 8
安装iptables
#yum install iptables-sevices
Systemctl stop firewalld
案例讲解:
#iptables -L (协议状态)
#iptables-save
Yum install iptbales-services
[root@localhost ~]# systemctl start iptables.service
1、搭建web服务,并且能够访问
#开放web服务端口
[root@mail html]# iptables -I INPUT -p tcp --dport 80 -j ACCEPT
#列出规则表中的编号
#iptables -L --line-numbers
#删除刚刚添加的规则,并进行测试
[root@mail html]# iptables -D INPUT 1
2、禁止所有人ssh远程登陆该服务器
[root@mail html]# iptables -I INPUT -p tcp --dport 22 -j REJECT
#删除刚刚添加的规则,并进行测试
[root@mail html]# iptables -D INPUT 1
3、禁止某个主机地址ssh远程登陆该服务器
#拒绝144主机访问服务器的22端口
[root@mail ~]# iptables -I INPUT -p tcp -s 192.168.171.144 --dport 22 -j REJECT
#开启服务器的web服务,并用144客户端进行访问
[root@mail html]# iptables -I INPUT -p tcp -s 192.168.171.144 --dport 80 -j ACCEPT
#查看所有规则
Netstat -lntup | grep 80 查看开放的端口
案例练习:
1、添加iptables规则禁止用户访问域名为www.baidu.com的网站
iptables -I FORWARD -d www.baidu.com -j DROP
2、添加iptables规则禁止用户访问ip地址为20.20.20.20的网站
iptables -I FORWARD -D 20.20.20.20 -j DROP
3、添加iptables规则禁止IP地址为192.168.171.144的客户机上网
iptables -I FORWARD -s 192.168.171.144 -j DROP
4、添加iptables规则禁止192.168.171.0子网所有的客户机上网
iptables -I FORWARD -s 192.168.171.0/24 -j DROP
5、禁止192.168.171.0子网所有客户机使用ftp协议下载
iptables -I FORWARD -s 192.168.171.0/24 -p tcp --dport 21 -j DROP
6、禁止192.168.171.0子网所有客户机使用telnet协议连接远程计算机
iptables -I FORWARD -s 192.168.171.0/24 -p tcp --dport 23 -j DROP
7、强制所有的客户机访问192.168.171.1这台web服务器
iptables -t nat -I PREROUTING -i eht0 -p tcp --dport 80 -j DNAT --to-destination 192.168.171.1:80
8、禁止internat上的计算机通过ICMP协议ping到nat服务器的ppp0接口,但允许内网的客户机通过ICMP协议ping通
iptables -I INPUT -i ppp0 -p icmp -j DROP
-i eth0:从这块网卡流入的数据
流入一般用在INPUT和PREROUTING上
-o eth0:从这块网卡流出的数据
流出一般在OUTPUT和POSTROUTING上
9、发布内网192.168.171.143主机的web服务,internet用户通过访问防火墙的IP地址即可访问该主机的web服务
iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.171.143:80
10、发布内网192.168.171.143主机的终端服务,internat用户通过访问防火墙的IP地址访问该主机的终端服务
iptables -t nat -I PREROUTING -p tcp --dport 3389 -j DNAT --to-destination 192.168.171.143:3389
示例:
#开放常用的端口
iptables -A INPUT -p TCP --dport 80 -j ACCEPT
iptables -A INPUT -p TCP --sport 80 -j ACCEPT
iptables -A INPUT -p TCP --dport 25 -j ACCEPT
iptables -A INPUT -p TCP --sport 25 -j ACCEPT
iptables -A INPUT -p TCP --dport 110 -j ACCEPT
iptables -A INPUT -p TCP --sport 110 -j ACCEPT
iptables -A INPUT -p TCP --dport 143 -j ACCEPT
iptables -A INPUT -p TCP --sport 143 -j ACCEPT
#SSH
iptables -A INPUT -p TCP --dport 59687 -j ACCEPT
iptables -A INPUT -p TCP --dport 9900 -j ACCEPT
iptables -A INPUT -p UDP --sport 53 -j ACCEPT
iptables -A INPUT -p TCP --sport 53 -j ACCEPT
#antispam
iptables -A INPUT -p TCP --sport 6220 -j ACCEPT
iptables -A INPUT -p TCP --sport 6610 -j ACCEPT
iptables -A INPUT -p TCP --sport 6611 -j ACCEPT
#SSL
iptables -A INPUT -p TCP --dport 995 -j ACCEPT
iptables -A INPUT -p TCP --dport 993 -j ACCEPT
iptables -A INPUT -p TCP --dport 465 -j ACCEPT
iptables -A INPUT -p TCP --dport 443 -j ACCEPT
#NTP date
iptables -A INPUT -p UDP --sport 123 -j ACCEPT
#snmp
iptables -A INPUT -i eth0 -p udp -s 125.76.229.215 --dport 161 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s 60.195.249.83 --dport 161 -j ACCEPT
iptables -P FORWARD DROP
iptables -A INPUT -j REJECT
iptables -P OUTPUT ACCEPT
#防止同步包洪水(Sync Flood)
iptables -A FORWARD -p tcp --syn -m limit --limit 1/s -j ACCEPT
#防止各种端口扫描
iptables -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
#Ping洪水攻击(Ping of Death)
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
#屏蔽 SYN_RECV 的连接
iptables -A INPUT -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT
FirewallD 使用服务(service) 和区域(zone)来代替 iptables 的规则(rule)和链(chain)。
/usr/lib/firewalld service ssh.xml
默认情况下,有以下的区域(zone)可用:
-
- drop – 丢弃所有传入的网络数据包并且无回应,只有传出网络连接可用。
- block — 阻塞区:拒绝所有传入网络数据包并回应一条主机禁止的 ICMP 消息,只有传出网络连接可用。
- public — 只接受被选择的传入网络连接,用于公共区域。
- external —外部区 用于启用了地址伪装的外部网络,只接受选定的传入网络连接。
- dmz — DMZ 隔离区,外部受限地访问内部网络,只接受选定的传入网络连接。
- work — 对于处在你工作区域内的计算机,只接受被选择的传入网络连接。
- home — 对于处在你家庭区域内的计算机,只接受被选择的传入网络连接。
- internal —内部网络 对于处在你内部网络的计算机,只接受被选择的传入网络连接。
- trusted — 受信任区所有网络连接都接受。
预定义服务/添加端口
1 直接编辑配置文件/etc/firewalld/
2 使用firewall-config图形工具
通过这个图形工具,可以更改和检查firewalld内存中的配置(Runtime),也可以修改磁盘上的持久配置(Permanent)
3 使用firewall-cmd命令
预定义服务
使用firewall-config来启动图形界面查看预定义服务,在有条件的情况下推荐使用
预定义服务可以通过查看firewalld.service(5)man手册
也可以通过查看目录了解更详细,该目录下面的禁止编辑
[root@localhost ~]# ls /usr/lib/firewalld/services/
也可以查看该目录下的,该目录下的可以编辑
[root@localhost ~]# ls /etc/firewalld/services/
#使用命令查看所有支持的服务
[root@localhost ~]# firewall-cmd --get-services
#添加服务
[root@mail ~]# firewall-cmd --add-service=http
#设置服务超时时间,即服务的开启时间,单位秒
[root@mail ~]# firewall-cmd --add-service=http --timeout=10
熟练和习惯使用tab进行选项补全和参数补全
#启用紧急模式(所有的 规则出入都拒绝)
[root@mail ~]# firewall-cmd --panic-on
#禁用紧急模式
[root@mail ~]# firewall-cmd --panic-off
#查询紧急模式状态
[root@mail ~]# firewall-cmd --query-panic
#查看当前区域
[root@mail ~]# firewall-cmd --get-default-zone
#查看所有支持的区域
[root@mail ~]# firewall-cmd --get-zones
#设置trusted区域为当前区域
[root@mail ~]# firewall-cmd --set-default-zone=trusted
#根据接口查询区域
[root@mail ~]# firewall-cmd --get-zone-of-interface=eno16777736
#添加当前源地址
[root@mail ~]# firewall-cmd --add-source=192.168.171.1/24
#添加一个端口
[root@mail ~]# firewall-cmd --add-port=8080/tcp
#删除源地址
[root@mail ~]# firewall-cmd --remove-source=192.168.171.1/24
#删除端口
[root@mail ~]# firewall-cmd --remove-port=8080/tcp
#以上都为运行时生效
#永久生效
#添加规则
[root@mail ~]# firewall-cmd --permanent --add-service=http
#重新加载
[root@mail ~]# firewall-cmd --reload
#列出所支持的ICMP类型
[root@mail ~]# firewall-cmd --get-icmptypes
#列出所有区域的详细信息
[root@mail ~]# firewall-cmd --list-all-zones
#添加ssh服务进行测试
[root@mail ~]# firewall-cmd --permanent --add-service=ssh
#列出指定区域的规则
[root@mail ~]# firewall-cmd --zone=trusted --list-all
#启用伪装功能,但因为内核限制,只支持ipv4
[root@mail ~]# firewall-cmd --add-masquerade
#添加禁止icmp报文
[root@mail ~]# firewall-cmd --add-icmp-block=echo-request
永久模式不直接影响运行时状态,只有在重启服务或者重载时生效
运行模式,直接模式不保存规则,在重载或者重启服务后必须再次提交,传递的参数和iptable一致
#添加一个列表
[root@mail ~]# firewall-cmd ----direct permanent --add-chain ipv4 raw blacklist
#给列表添加一个规则
[root@mail ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw PREROUTING 0 -s 192.168.171.0/24 -j blacklist
#定义列表的动作
[root@mail ~]# firewall-cmd --direct --permanent --add-rule ipv4 raw blacklist 1 -j DROP
rich rule
图形界面
命令行界面
#添加一个富规则
firewall-cmd [--zone=zone] --add-rich-rule='rule' [--timeout=timeval]
#删除一个富规则
firewall-cmd [--zone=zone] --remove-rich-rule='rule'
#查询一个富规则
firewall-cmd [--zone=zone] --query-rich-rule='rule'
富规则的格式:
rule [family="rule family"]
[ source address="address" [invert="True"] ]
[ destination address="address" [invert="True"] ]
[ element ]
[ log [prefix="prefix text"] [level="log level"] [limit
value="rate/duration"] ]
[ audit ]
编辑配置文件/etc/firewalld/firewalld.conf
Lockdown=yes
#重载
firewall-cmd --reload
#启用imaps服务
firewall-cmd --add-service=imaps
端口管理
#查询所有可用端口
semanage port -l
semanage port -a -t nfs_port_t -p tcp 8080
iptables raw表_海哥学运维-CSDN博客_iptables raw
指定规则操作表
指定规则表中的
某一个链