包过滤型防火墙是一种网络安全设备或软件,它工作在 2、3、4 层,通过检查网络数据包的源地址、目标地址、协议、端口等信息,根据预定义的规则来决定是否允许数据包通过或拒绝它们。
① 包过滤防火墙无法过滤内部网络的数据包;
② 所有互联网的数据包软件都应经过防火墙的过滤,可能造成网络流量的拥挤。
iptables 使用四个主要表来组织和分类防火墙规则,分别是 filter 表、nat 表、mangle 表和 raw 表。
● filter 表:处理数据包的基本过滤和访问控制,用于确定是否允许或拒绝数据包通过防火墙;
● nat 表:用于网络地址转换,配置网络地址转换规则,在内部网络和外部网络之间进行 IP 地址转换;
● mangle 表:用于修改数据包的 IP 头信息;
● raw 表:用于配置规则以绕过连接跟踪机制。
iptables 使用五个主要链来组织和分类规则,分别是 INPUT,OUTPUT, FORWARD,PREROUTING, POSTROUTING。
● INPUT 链: INPUT 链处理进入系统的数据包,即入站数据包;
● OUTPUT 链: OUTPUT 链处理从系统发送的数据包,即出站数据包;
● FORWARD 链: FORWARD 链处理系统用作路由器时转发的数据包;
● PREROUTING 链: PREROUTING 链用于在数据包进入系统之前修改目的地址;
● POSTROUTING 链: POSTROUTING 链用于在数据包离开系统之前修改源地址。
① 入站数据流向:
从外网到达防火墙的数据包,先由 PREROUTING 链处理,再进行路由选择,判断该数据包应该发往何处,如果数据包的目标主机是本机,数据包将被传给INPUT 链进行处理,之后再交给本机的应用程序;
② 转发数据流向:
如果数据包的目标地址是其它外部地址,数据包将被传递给 FORWARD 链进行处理,然后再交给 POSTROUTING链;
③ 出站数据流向:
防火墙本机向外部地址发送的数据包,首先被OUTPUT 链处理,之后进行路由选择,然后传递给 POSTROUTING 链进行处理。
iptables -t 表名 管理选项 [链名] [匹配条件] [-j 控制类型]
● iptables: 配置防火墙规则的命令行工具 ;-t 表名: -t 用于指定要操作的表名称,不写表名则默认是 filter 表。
● 管理选项: 这是用于指定要执行的管理操作的选项:
① 添加规则:
-A:向规则链末尾添加规则(Append)
-I:在规则链的开头或指定位置插入规则(Insert)
② 查看规则:
-L:列出规则链中的规则(List)
-n:以数字形式显示地址、端口等信息
-v:以更详细的方式显示规则信息
③ 操作规则:
-D:从规则链删除规则(Delete)
-R:替换规则链中的规则(Replace)
-F:清除规则链中的所有规则(Flush)
-X:删除用户定义的链(Delete chain)
-P:为指定的链设置默认规则
● [链名]:指定要操作的规则链的名称。
● [匹配条件]:指定规则应该匹配的条件,例如源 IP 地址、目标 IP 地址、协议、端口等。
● -j 控制类型:指定匹配条件后执行的操作类型,常见的控制类型:
-j ACCEPT:接受数据包;
-j DROP:丢弃数据包;
-j REJECT:拒绝并发送拒绝消息给发送者;
-j LOG:记录数据包信息。
在 filter 表的 INPUT 链插入一个丢弃 icmp 的规则,禁止本机被 ping。
① 定义规则之前,其他主机能够 ping 通:
② 在 132 上定义规则:
iptables -t filter -I INPUT -p icmp -j REJECT
其他主机 ping 132,查看效果:
③ 删除规则:
iptables -t filter -D INPUT -p icmp -j REJECT
① 协议通用匹配:匹配网络数据包中的传输协议
例:iptables -I INPUT -p icmp -j DROP
② 地址通用匹配:定义 IP 地址的匹配规则
例:iptables -I INPUT -s 192.168.198.133 -j REJECT(拒绝源 IP 地址为 192.168.198.133 的数据包)
③ 物理接口通用匹配:
例:iptables -I INPUT -i eth33 -j DROP(拒绝经过物理接口 eth33 的所有数据包进入系统)
① 端口匹配:匹配个别端口的控制类型:
● iptables -I INPUT -s 192.168.198.133 -p tcp --dport 80 -j ACCEPT
接受特定主机且目标端口为 80 TCP 数据包(允许133访问132的 http 资源)
● iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
在 INPUT 链中插入一条规则,允许FTP数据传输。
② ICMP 匹配:
--icmp-type 选项用于指定ICMP协议中不同类型的数据包。
--icmp-type 8 对应的是 ICMP Echo Request,表示发出一个请求来测试目标主机是否可达。
--icmp-type 0 对应的是 ICMP Echo Reply,表示目标主机已收到Echo Request 并成功响应。
● iptables -A INPUT -p icmp --icmp-type 8 -j DROP:阻止其他主机发送Ping请求给本机(自己可以ping别人,别人不可以ping自己)
● iptables -A INPUT -p icmp --icmp-type 0 -j DROP:阻止传入的 ICMP Echo Reply 数据包(自己不可以 ping 别人,别人可以 ping 自己)
① 多端口匹配:
-m multiport --sports ; -m multiport --dports
● iptables -A INPUT -p tcp -m multiport --dport 80,20,21 -j DROP:
阻止传入目的端口为80、20或21的TCP数据包
② ip 地址匹配(可自定义匹配的 ip 地址范围):
iptables -I INPUT -p tcp -m iprange --src-range 192.168.198.130-192.168.198.140 -j ACCEPT
SNAT,即源网络地址转换(Source Network Address Translation),是一种网络地址转换技术,用于修改数据包的源 IP 地址。
① 配置环境:
A:192.168.198.129(VMnet10)网关:192.168.198.132
B:ens33:192.168.198.132(VMnet10);ens38:192.168.48.128(WMnet8)
C:192.168.48.50(WMnet8)网关:192.168.48.128
② 启动路由转发功能:
A、C 配置相应的网关
B 配置路由转发:
echo "net.ipv4.ip_forward = 1" >>/usr/lib/sysctl.d/50-default.conf
echo 1 > /proc/sys/net/ipv4/ip_forward (重启)
② 删除C的网关,在B上配置 SNAT:
iptables -t nat -A POSTROUTING -s 192.168.198.0/24 -o ens38 -j SNAT --to-source 192.168.48.128
这个命令的目的是将位于 192.168.198.0/24 子网中的数据包,通过名为 "ens38" 的网络接口发送到外部网络时,将它们的源地址替换为 192.168.48.128
③ 检验效果:
在 A 主机上登录 C 的网站:
在 C 上查看访问日志:cat /var/log/httpd/access_log
MASQUERADE 是 iptables 中一种NAT操作,用于修改数据包的源地址。能够进行动态IP地址分配,无需配置静态NAT规则。
iptables -t nat -A POSTROUTING -s 192.168.198.0/24 -o ens38 -j MASQUERADE
DNAT用于修改传入数据包的目标IP地,DNAT将数据包的目标IP地址更改为预定义的目标地址。
iptables -t nat -A PREROUTING -i ens38 -d 192.168.48.128 -p tcp --dport 80 -j DNAT --to-destination 192.168.198.129
firewalld 是一个用于配置和监控防火墙规则的系统守护进程,firewalld 支持划分区域 zone,每个 zone 可以设置独立的防火墙规则。
● trusted: 信任区域,允许所有经过的流量通过,通常用于内部或受信任的网络环境;
● home/internal: 仅允许SSH流量通过,这个区域只允许SSH连接,用于加强内部或家庭网络的安全性;
● work: 仅允许SSH、ipp-client和dhcpv6-client流量通过,这个区域允许更多类型的流量,通常用于工作网络环境;
● public: 默认区域,仅允许SSH和dhcpv6-client流量通过,这个区域是系统的默认区域,通常用于公共网络环境;
● block: 拒绝所有经过的流量;
● drop: 拒绝所有经过的流量,且不进行ICMP错误回应。
富规则包含了更多的信息和条件,以更精细地定义允许或拒绝哪些网络连接。通过定义详细的规则,可以确保只有经过授权的流量能够通过防火墙,从而增加网络的安全性。
yum install -y httpd
echo web1 > /var/www/html/index.html
systemctl start httpd
systemctl start firewalld
firewall-cmd --get-default-zone(观察默认区域)
firewall-cmd --list-all-zone(列出所有区域)
firewall-cmd --set-default-zone=trusted
firewall-cmd --reload
流量已经从默认的public区域,转移到trusted区域,该区域默认放行所有流量,再次访问网站,成功。
还原默认区域:firewall-cmd --set-default-zone=public
firewall-cmd --permanent --add-service=http --zone=public
(--permanent标志用于将防火墙规则永久性地添加到防火墙配置中)
firewall-cmd --reload
查看默认区域:firewall-cmd --list-all --zone=public
删除规则: firewall-cmd --permanent --remove-service=http --zone=public