Iptables防火墙
介绍
iptables和netfilter是一套Linux防火墙工具,共同合作完成系统防护工作。iptables 是一个包过滤防火墙,可以对包进行封装、过滤、重定向或者网络地址转换、地址伪装、透明代理、访问控制、连接跟踪等功能,iptables是一个免费开源的软件,工作在用户空间;底层是netfilter,工作在内核空间,是内核的一部分。iptables 在用户空间的插入、修改、删除等操作最终都会作用到netfilter,netfilter 触发相应的回调函数(hook 机制)执行相应的防护动作。
分类
iptables根据保护范围可分为主机防火墙(Filter)和网络防火墙(Nat)
四表(table)五链(chain)
四表:
- Filter:iptables默认表;负责过滤数据包;内核模块iptable_filter
- Nat:负责网络地址转换;内核模块iptable_nat
- Mangle:负责修改数据包头部信息;内核模块iptables_mangle
- Raw:负责对数据包进行状态跟踪;内核模块iptables_raw
五链:
- INPUT:负责处理进来的数据包
- OUTPUT:负责处理出去的数据包
- FORWARD:负责转发数据包
- PREROUTING:负责目标地址转换
- POSTROUTING:负责源地址转换
表链关系
Filter:INPUT、FORWARD、OUTPUT
Nat:PREROUTING、POSTROUTING、OUTPUT
Mangle:INPUT、FORWARD、OUTPUT、PREROUTING、POSTROUTING、OUTPUT
Raw:PREROUTING、OUTPUT
表应用顺序
Raw>>>Mangle>>>Nat>>>Filter
链应用顺序
- 入站数据
如访问自身Web服务流量。先经过PREROUTING链处理(是否修改数据包地址),再进行路由选择,接着经过INPUT链(是否允许通过)到达程序
- 转发数据
如经过网关的流量。先经过PREROUTING链处理,再路由选择,接着经过FORWARD链(是否转发或丢弃),然后经过POSTROUTING链(是否修改数据包地址)
- 出站数据
如自身访问外部的流量。先经过OUTPUT链处理,接着经过POSTROUTING链
规则
管理员预先设定的条件,iptables根据定义的条件来处理数据包
命令
iptable -t 表名 选项 链名 匹配条件 -j 动作
表:即四表
选项
-P | 设置默认策略:iptables -P INPUT (DROP |
-L | 查看规则链 |
-F | 清空规则链 |
-I | 在规则链的前面加入新规则 |
-A | 在规则链的末尾加入新规则 |
-D | 删除某一条规则 |
-R | 替换某条规则 |
匹配条件
-s IP/MASK | 匹配源地址 |
-d IP/MASK | 匹配目标地址 |
-i 网卡名 | 匹配从指定网卡流入的数据 |
-o 网卡名 | 匹配从指定网卡流出的数据 |
-p | 匹配协议,如TCP、UDP、ICMP |
--dport 端口号 | 匹配目标端口号 |
--sport 端口号 | 匹配来源端口号 |
动作
ACCEPT | 放行数据包,进行完此处理动作后,不再对比其它规则,直接跳往下一个规则链 |
REJECT | 拦截数据包,并传送数据包通知对方可以传送的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 |
DROP | 丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。 |
REDIRECT | 将包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。 这个功能可以用来实作通透式porxy 或用来保护 web 服务器。 |
MASQUERADE | 改写数据包来源 IP为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨号连接时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。 |
LOG | 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其规则 |
SNAT | 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则 |
DNAT | 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼 |
MIRROR | 镜像数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包送回,进行完此处理动作后,将会中断过滤程序 |
QUEUE | 中断过滤程序,将数据包放入队列,交给其它程序处理 |
RETURN | 结束在目前规则链中的过滤程序,返回主规则链继续过滤 |
MARK | 将数据包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则 |
配置
#安装iptables
[root@wenzi ~]#yum -y install iptables-services
[root@wenzi ~]#rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service
/usr/libexec/initscripts/legacy-actions/ip6tables
/usr/libexec/initscripts/legacy-actions/ip6tables/panic
/usr/libexec/initscripts/legacy-actions/ip6tables/save
/usr/libexec/initscripts/legacy-actions/iptables
/usr/libexec/initscripts/legacy-actions/iptables/panic
/usr/libexec/initscripts/legacy-actions/iptables/save
/usr/libexec/iptables
/usr/libexec/iptables/ip6tables.init
/usr/libexec/iptables/iptables.init
[root@m01 ~]# rpm -ql iptables
/usr/sbin/iptables
/usr/sbin/iptables-save
/usr/sbin/iptables-restore
iptables配置文件:/etc/sysconfig/iptables
iptables服务配置文件:/usr/lib/systemd/system/iptables.service
iptables命令:/usr/sbin/iptables
iptables规则:/usr/sbin/iptables-save
恢复:/usr/sbin/iptables-restore
FIrewalld防火墙
内核模块:netfilter
RHEL6中是iptables,RHEL7中是firewalld
区域zone
介绍
过滤规则的集合。每个zone单独对应一个xml配置文件,位于/usr/lib/firewalld/services目录。自定义zone需要新建 zone名.xml文件,然后向其中添加规则。每个zone都有一个默认的处理行为,包括default、ACCEPT、REJECT、DROP
类型
firewalld 将网卡对应到不同的区域zone;最终一个区域的安全程度取决于管理员在此区域中设置的规则;可以根据网络规模,使用一个或多个区域,但是任何一个活跃区域至少需要关联源地址或接口
trusted(信任区域) | 允许所有网络流量连接,即使没有开放任何服务,那么使用此 zone 的流量照样通过 |
public(公共区域) | 默认的 zone,部分公开,不信任网络中其他计算机,只放行特定服务 |
external(外部区域) | 允许与 ssh 预定义的服务传入流量,其余均拒绝。默认将通过此区域转发的 IPv4 传出流量进行地址伪装,可用于为路由器启用了伪装功能的外部网络 |
home(家庭区域) | 允许与 ssh、ipp-client、mdns、samba-client 或 dhcpv6-client 预定义的服务传入流量,其余均拒绝 |
internal(内部区域) | 默认值时与 home 区域相同 |
work(工作区域) | 允许与 ssh、ipp-client、dhcpv6-client 预定义的服务传入流量,其余均拒绝 |
dmz(隔离区域也称为非军事区域) | 允许与 ssh 预定义的服务传入流量,其余均拒绝 |
block(限制区域) | 任何流入的包都被拒绝,返回 icmp-host-prohibited 报文(ipv4)或 icmp6-adm-prohibited 报文(ipv6)。只允许由该系统初始化的网络连接 |
drop(丢弃区域) | 任何流入的包都被丢弃,不做任何响应,只允许流出的数据包 |
常用的firewall-cmd命令选项
- firewall-config 使用图形界面
- --reload 重新加载配置,修改 firewalld 配置后需执行此命令
- --get-default-zone 显示当前默认区域
- --set-default-zone= 设置默认区域,= 后面跟区域
- --get-active-zones 显示当前正在使用的区域及其对应的网卡接口
- --get-zones 显示所有可用的区域
- --get-zone-of-interface= 显示指定接口绑定的区域,= 后面跟网口
- --zone= --add-interface= 为指定接口绑定区域
- --zone= --change-interface= 为指定的区域更改绑定的网络接口
- --zone= --remove-interface= 为指定的区域删除绑定的网络接口
- --get-zone-of-source=[/] 显示指定源地址绑定的区域
- --zone= --add-source=[/] 为指定源地址绑定区域
- --zone= --change-source=[/] 为指定的区域更改绑定的源地址
- --zone= --remove-source=[/] 为指定的区域删除绑定的源地址
- --list-all-zones 显示所有区域及其规则
- --zone= --list-all 显示所有指定区域的所有规则,省略 --zone= 时表示仅对默认区域操作
- --zone= --list-services 显示指定区域内允许访问的所有服务
- --zone= --add-service= 为指定区域设置允许访问的某项服务
- --zone= --remove-service= 删除指定区域已设置的允许访问的某项服务
- --zone= --list-ports 显示指定区域内允许访问的所有端口号
- --zone= --add-port=[端口号]/[协议名] 为指定区域设置允许访问的某个或某段端口号(包括协议名)
- --zone= --remove-port=[端口号]/[协议名] 删除指定区域已设置的允许访问的端口号(包括协议名)
- --zone= --list-icmp-blocks 显示指定区域内拒绝访问的所有 ICMP 类型
- --zone= --add-icmp-block= 为指定区域设置拒绝访问的某项 ICMP 类型
- --zone= --remove-icmp-block= 删除指定区域已设置的拒绝访问的某项 ICMP 类型
- firewall-cmd --get-icmptypes 显示所有 ICMP 类型
实验
web服务器 192.168.29.141 客户端 192.168.29.1
#检查firewalld是否开启
[root@wenzi ~]#systemctl status firewalld.service
● firewalld.service - firewalld - dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled; vendor preset: enabled)
Active: active (running) since Sun 2023-07-09 04:22:46 CST; 6s ago
Docs: man:firewalld(1)
Main PID: 1483 (firewalld)
Tasks: 2 (limit: 4840)
Memory: 30.0M
CGroup: /system.slice/firewalld.service
└─1483 /usr/libexec/platform-python -s /usr/sbin/firewalld --nofork --nopid
#安装httpd
[root@wenzi ~]#yum -y install httpd
[root@wenzi ~]#systemctl start httpd.service
[root@wenzi ~]#systemctl status httpd.service
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
Active: active (running) since Sun 2023-07-09 04:25:00 CST; 36s ago
Docs: man:httpd.service(8)
Main PID: 2076 (httpd)
Status: "Running, listening on: port 80"
Tasks: 213 (limit: 4840)
Memory: 33.5M
CGroup: /system.slice/httpd.service
├─2076 /usr/sbin/httpd -DFOREGROUND
├─2078 /usr/sbin/httpd -DFOREGROUND
├─2079 /usr/sbin/httpd -DFOREGROUND
├─2080 /usr/sbin/httpd -DFOREGROUND
└─2081 /usr/sbin/httpd -DFOREGROUND
#查看当前默认区域
[root@wenzi ~]#firewall-cmd --get-default-zone
public
#查看所有可用区域
[root@wenzi ~]#firewall-cmd --get-zones
block dmz drop external home internal public trusted work
#查看当前正在使用的区域及对应的网卡接口
[root@wenzi ~]#firewall-cmd --get-active-zones
public
interfaces: ens160
使用客户端访问web服务,无法访问主页
方式一、将使用的区域设定为trusted
[root@wenzi ~]#firewall-cmd --set-default-zone=trusted
success
[root@wenzi ~]#firewall-cmd --reload
success
[root@wenzi ~]#firewall-cmd --get-active-zones
trusted
interfaces: ens160
客户端再次访问,访问成功
方式二、放行80端口
#查看已放行端口
[root@wenzi ~]#firewall-cmd --list-ports
#查看public中规则
[root@wenzi ~]#firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
#放行80端口
[root@wenzi ~]#firewall-cmd --zone=public --add-port=80/tcp --permanent
success
[root@wenzi ~]#firewall-cmd --reload
success
[root@wenzi ~]#firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client ssh
ports: 80/tcp
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
客户端再次访问,访问成功
三、放行http服务
[root@wenzi ~]#firewall-cmd --zone=public --add-service=http --permanent
success
[root@wenzi ~]#firewall-cmd --reload
success
[root@wenzi ~]#firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens160
sources:
services: cockpit dhcpv6-client http ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
客户端再次访问,访问成功