Linux包过滤防火墙
- netfilter
- 称为Linux防火墙的“内核态”
- 位于Linux内核 中的包过滤功能体系
- iptables
- “用户态”
- 位于/sbin/iptables,
- 包过滤的工作层次
- 主要是网络层,针对IP数据包
- 体现在对包内的IP地址、端口等信息的处理上
iptables的表、链结构
- 规则链
- 规则的作用:对数据包进行过滤或处理
- 链的作用:容纳各种防火墙规则
- 链的分类依据:处理数据包的不同时机
- 默认包括5种规则链
- INPUT:处理入站数据包
- OUTPUT:处理出站数据包
- FORWARD:处理转发数据包
- POSTROUTING链:在进行路由选择后处理数据包
- PREROUTING链:在进行路由选择前处理数据包
- 规则表
- 表的作用:容纳各种规则链
- 表的划分依据:与防火墙规则的作用相似
- 默认包括4个规则表
- raw表:确定是否对该数据包进行状态跟踪
- mangle表(流量整形表):为数据包设置标记
- nat表:修改数据包中的源、目标IP地址或端口
- filter表:确定是否放行该数据包(过滤)
- 规则表之间的顺序
- raw->mangle->nat->filter
- 规则链之间的顺序
- 入站:PREROUTING->INPUT
- 出站:OUTPUT->POSTROUTING
- 转发:PEROUTING->FORWARD->POSTROUTING
- 规则链内的匹配顺序
- 按顺序依次检查,匹配立即停止(LOG策略除外)
- 如找不到相匹配的规则,则按改链的默认策略处理
规则分类
匹配条件
1、通用匹配
-
- 协议匹配
- 地址匹配
- 接口匹配
2、隐含匹配
-
- 端口匹配
- icmp类型匹配
- 应答reply
- 请求request---8
- 不可达unreachable---3
3、显示匹配
-
- 多端口
- IP范围
- mac地址
- 状态匹配
iptables和firewalld的异同点
相同点:
firewalld 与 iptables 都是 Linux 中防火墙的管理程序,但其实其角色主要为对于防火墙策略的管理,真正的防火墙执行者是位于内核中的 Netfilter
不同点:
iptables 仅能通过命令行进行配置;而 firewalld提供了图形接口,类似windows防火墙的操作方式
iptables 每一个单独更改意味着清除所有旧的规则,并从 /etc/sysconfig/iptables 中读取所有新的规则;而 firewalld 在有规则变动后,可以仅仅运行规则中的不同之处,即在 firewalld 运行时间内,改变设置时可以不丢失现行链接
iptables 的配置文件在 /etc/sysconfig/iptables 中;而 firewalld 的配置文件在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件中
iptables 没有守护进程,并不能算是真正意义上的服务;而 firewalld 有守护进程
一:NAT 转发软路由
开启 NAT 转发之后,只要本机可以上网,不论是单网卡还是多网卡,局域网内的其他机器可以将默认网关设置为已开启 NAT 转发的服务器 IP ,即可实现上网。
# vim /etc/sysctl.conf
net.ipv4.ip_forward=1
## 重载网络配置生效
# sysctl -p
---------------------
# 开启 NAT 转发
firewall-cmd --permanent --zone=public --add-masquerade
firewall-cmd --zone=public --add-port=80/tcp --permanent //检查是否允许 NAT 转发
NAT设置完成
二:端口转发
端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定 ip 的话就默认为本机,如果指定了 ip 却没指定端口,则默认使用来源端口。
# 将80端口的流量转发至8080
firewall-cmd --add-forward-port=port=80:proto=tcp:toport=8080
# 将80端口的流量转发至192.168.0.1
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1
# 将80端口的流量转发至192.168.0.1的8080端口
firewall-cmd --add-forward-port=proto=80:proto=tcp:toaddr=192.168.0.1:toport=8080
富语言举例:
添加拒绝某个IP访问ssh端口
firewall-cmd --add-rich-rule "rule family=ipv4 source address=10.0.10.1 service name='ssh' drop"
禁止响应ping
firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop'
查询是否有某个规则
firewall-cmd --query-rich-rule='rule family=ipv4 protocol value=icmp drop'
移除规则
firewall-cmd --remove-rich-rule='rule family=ipv4 protocol value=icmp drop'
拒绝来自public区域中IP地址为192.168.0.11的所有流量
firewall-cmd --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.0.11/32 reject'
将源192.168.2.2地址加入白名单,以允许来自这个源地址的所有连接
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'
允许来自192.168.0.0/24地址的TFTP协议的IPv4连接,并且使用系统日志每分钟记录一次
firewall-cmd --add-rich='rule family="ipv4" source address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept'
在192.168.1.0/24子网的dmz区域中,接收端口7900--1905的所有TCP包
firewall-cmd --zone=dmz --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-1905 protocol=tcp accept'
firewalld中理解直接规则:
将iptables的规则直接插入到firewall的管理区域当中,这种方式写的规则叫做直接规则