在红帽 RHEL7 系统中,firewalld 服务取代了 iptables 服务,但依然可以使用 iptables 命令来管理内核的 netfilter。其实 Iptables 服务 与 Firewalld 服务都不是真正的防火墙,它们都知识用来定义防火墙规则功能的 “防火墙工具”,将定义好的规则交由内核中的 netfilter 即网络过滤器来读取,从而真正实现防火墙功能。
Iptables 命令
iptables 命令用于创建数据过滤与 NAT 规则,主流的 Linux 系统都会默认启用 iptables 命令,但其参数较多且规则策略相对比较复杂。
规则链与策略
在 iptables 命令中设置暑假过了或处理设举报的策略叫做规则,将多个规则合成一个规则链。
iptables 命令中常见的控制类型:
- ACCEPT:允许通过
- LOG:记录日志信息,然后传给下一条规则继续匹配
- REJECT:拒绝通过,必要时会给出回应
- DROP:直接丢出,不给出任何回应
而规则链则依据处理数据包的位置不同而进行分类,主要有以下几种规则链:
- PREROUTING:在进行路由选择前处理数据包
- INPUT:处理入站的数据包
- OUTPUT:处理出站的数据包
- FORWARD:处理转发的数据包
- POSTROUTING:在进行路由选择后处理数据包
Iptables 中的规则表是用于容纳规则链,规则表默认是允许状态的,那么规则链就是设置被禁止的规则;反之如果规则表是禁止状态的,那么规则链就是设置被允许的规则。
主要有以下几种规则表:
- raw 表:确定是否对该数据包进行状态跟踪
- mangle 表:为数据包设置标记
- nat 表:修改数据包中的源、目标 IP 地址或端口
- filter 表:确定是否放行该数据包 (过滤)
规则表的先后顺序:raw -> mangle -> nat -> filter
规则链的先后顺序:
- 入站顺序:PREROUTING -> INPUT
- 出站顺序:OUTPUT -> POSTROUTING
- 转发顺序:PREROUTING -> FORWARD -> POSTROUTING
注意事项:
- 没有指定规则表则默认指 filter 表
- 不指定规则链则指表内所有规则链
- 在规则链中匹配规则时会依次检查,匹配即停止 (LOG 例外),若没有匹配项则按链的默认状态处理
iptables 基本的命令参数
iptables 命令用于管理防火墙的规则策略,格式为:iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
iptables 常用参数:
参数 | 作用 |
---|---|
-P | 设置规则链默认策略:iptables -P INPUT (DROP | ACCEPT ) |
-F | 清空规则链 |
-L | 查看规则链 |
-A | 在规则链的末尾加入新规则 |
-I num | 在规则链的头部加入新规则 |
-D num | 删除某一条规则 |
-s | 匹配 源地址 IP/MASK,加叹号 “ ! ” 表示除这个 IP 外 |
-d | 匹配目标地址 |
-i 网卡名称 | 匹配从这块网卡流入的数据 |
-o 网卡名称 | 匹配从这块网卡流出的数据 |
-p | 匹配协议,如 tcp、udp、icmp |
–dport num | 匹配目标端口号 |
–sport num | 匹配源端口号 |
例子:
① 将 INPUT 链的默认策略设置为拒绝:
Iptables -P INPUT DROP
② 允许所有的 ping 操作:
iptables -I INPUT -p icmp -j ACCEPT
③ 在 INPUT 链的末尾加入一条规则,允许所有未被其他规则匹配上的数据包
iptables -t filter -A INPUT INPUT -j ACCEPT
注:默认就是 filter 表,故不加 -t filter 也可。
④ 仅允许来自 192.168.10.0/24 域的用户连接本机的 ssh 服务
iptables -I INPUT -s 192.168.10.0/24 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j REJECT
注:防火墙会按照顺序匹配规则,故允许的规则应该在拒绝的规则上面。
⑤ 不允许任何用户访问本机的 12345 端口
iptables -I INPUT -p tcp --dport 12345 -j REJECT
iptables -I INPUT -p udp --dport 12345 -j REJECT
⑥ 拒绝其他用户从 eno16777736 网卡访问本机 http 服务的数据包
iptables -I INPUT -i eno16777736 -p tcp --dport 80 -j REJECT
⑦ 禁止用户访问 www.baidu.com
iptables -I FORWARD -d www.baidu.com -j DROP
⑧ 禁止 IP 地址是 192.168.10.10 的用户上网
iptables -I FORWARD -s 192.168.10.10 -j DROP
SNAT 与 DNAT
SNAT
SNAT 即源地址转换技术,能够让多个内网用户通过一个外网地址上网。
使用 Iptables 防火墙即可实现 SNAT 源地址转换,根据需求命令如下:
iptables -t nat -A POSTROUTING -s 内网网段地址 -o 外网接口名称 -j SNAT --to-source 外网接口的IP地址
。
若外网 IP 地址不稳定,可以使用 MASQUERADE (动态伪装),能够自动的寻找外网地址并改为当前正确的外网 IP 地址,如:
iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
DNAT
DNAT 即 目的地址转换技术,能够让外网 IP 用户访问局域网内不同的服务器。
iptables -t nat -A PREROUTING -i 内网接口名称 -d 外网接口IP地址 -j DNAT --to-destination 内网 IP 地址
例子:互联网中的客户机访问到内网 192.168.10.6 这台提供网站服务的主机:
iptables -t nat PREROUTING -i eno16777736 -d 61.240.149.149 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.6
Firewalld 防火墙
Firewalld 服务时红帽 RHEL 7 系统中默认的防火墙管理工具,特点是拥有运行时配置与永久配置选项,且能够支持动态更新,以及 “zone” 的区域功能概念,使用 图形化工具 firewall-config 或 文本管理工具 firewall-cmd。
区域概念与作用
防火墙的网络区域定义了网络连接的可信等级。区域规则有:
区域 | 默认规则策略 |
---|---|
trusted | 允许所有的数据包 |
home | 拒绝流入的数据包,除非与输出流量数据包相关,或是 ssh、mdns、ipp-client、samba-client 与 dhcpv6-client 服务则允许 |
internal | 等同于 home 区域 |
work | 拒绝流入的数据包,除非与输出流量数据包相关,或是 ssh、ipp-client 与 dhcpv6-client 服务则允许 |
public | 拒绝流入的数据包,除非与输出流量数据包相关,或是 ssh、dhcpv6-client 服务则允许 |
external | 拒绝流入的数据包,除非与输出流量数据包相关或是 ssh 服务则允许 |
dmz | 拒绝流入的数据包,除非与输出流量数据包相关或是 ssh 服务则允许 |
block | 拒绝流入的数据包,除非与输出流量数据包相关 |
drop | 拒绝流入的数据包,除非与输出流量数据包相关 |
简单的说就是用户预先准备了几套规则集合,我们可以根据场景的不同选择合适的规则集合,而默认区域是 public。
字符管理工具 firewall-cmd
字符管理工具 firewall-cmd 的命令参数有:
参数 | 作用 |
---|---|
–get-default-zone | 查询默认的区域名称 |
–set-default-zone=<区域名称> | 设置默认的区域,永久生效 |
–get-zones | 显示可用的区域 |
–get-services | 显示预先定义的服务 |
–get-active-zones | 显示当前正在使用的区域与网卡名称 |
–add-source= | 将来源于此 IP 或 子网的流量导向指定区域 |
–remove-source= | 不在将此 IP 或 子网的流量导向指定区域 |
–add-interface=<网卡名称> | 将来源于该网卡的所有流量都导向某个指定区域 |
–change-interface=<网卡名称> | 将某个网卡与区域做关联 |
–list-all | 显示当前区域的网卡配置参数、资源、端口以及服务等信息 |
–list-all-zones | 显示所有区域的网卡配置参数、资源、端口以及服务等信息 |
–add-service=<服务名> | 设置默认区域允许该服务的流量 |
–add-port=<端口号/协议> | 允许默认区域允许该端口的流量 |
–remove-service=<服务名> | 设置默认区域不再允许该服务的流量 |
–remove-port=<端口号/协议> | 允许默认区域不再允许该端口的流量 |
–reload | 让永久生效的配置规则立即生效,覆盖当前的 |
注:Firewalld 服务有两份规则策略配置记录:
- RunTime:当前正在生效的
- Permanent:永久生效的
例子:
① 启动 / 关闭应急状况模式,阻断所有网络连接,一切服务的请求也都被拒绝
firewall-cmd --panic-on
firewall-cmd --panic-off
② 允许 https 服务流量通过 public 区域,要求立即生效且永久有效
firewall-cmd --permanent --zone=public --add-service=https
firewall-cmd --reload
③ 不再允许 http 服务流量通过 public 区域,要求立即生效且永久生效
firewall-cmd --permanent --zone=public --remove-service=http
firewall-cmd --reload
④ 允许 8080 与 8081 端口流量通过 public 区域,要求立即生效且永久有效
firewall-cmd --permanent --zone=public --add-port=8080-8081/tcp
firewall-cmd --reload
⑤ 将 eno16777728 网卡的与其修改为 external,重启后生效
firewall-cmd --permanent --zone=external --change-interface=eno16777728
⑥ 设置福规则,拒绝 192.168.10.0/24 网段用户访问 ssh 服务:
Firewalld 服务的福规则用于对服务、端口、协议进行更详细的配置,规则的优先级最高。
firewall-cmd --permanent --zone=public --add-rich-rule="rule family="ipv4" source address="192.168.10.0/24" service name="ssh" reject"
图形管理工具 firewall-config
执行 firewall-config 命令可以进入防火墙图形化管理工具,此处略。
服务的访问控制列表
Tcp_wrappers (即 Transmission Control Protocol Wrappers) 是一款基于 IP 层的 ACL 访问控制列表浏览监控程序,它能够根据来访主机地址与本机目标服务程序做允许或拒绝规则。控制列表修改后会立即生效,系统会先检查允许规则,如果匹配允许则直接放行浏览,若拒绝规则中匹配则直接拒绝,都不匹配默认也会放行。
允许名单:/etc/hosts.allow
拒绝名单:/etc/hosts.deny
端口转发
端口转发功能可以将原本到某端口的数据包转发到其他端口,格式为:
firewall-cmd --permanent --zone=<区域> --add-forward-port=port=<源端口号>:proto=<协议>:toport=<目标端口号>:toaddr=<目标IP地址>
例子:
将访问 192.168.10.10 主机 888 端口的请求转发至 22 端口:
firewall-cmd --permanent --zone=public --add-forward-port=port=888:proto=tcp:toport=22:toaddr=192.168.10.10