Linux中的火墙策略
1 netfilter简介
Natfilter 是集成到linux内核协议栈中的一套防火墙系统,用户可通过运行在用户空间的工具来把相关配置下发给Netfilter 。
Netfilter 提供了整个防火墙的框架,各个协议基于Netfilter 框架来自己实现自己的防火墙功能。每个协议都有自己独立的表来存储自己的配置信息,他们之间完全独立的进行配置和运行。
- Netfilter 中包含一些表(table),不同的表用来存储不同功能的配置信息。
- 每个table 里有多个chain,chain表示对报文的拦截处理点。
- 每个chain包含一些用户配置的rule,一条rule包含了一个或多个匹配规则(match)和一个执行动作(target)。如果报文符合匹配规则后,需要根据该执行动作(target)来处理报文。
2 火墙管理工具的切换
在rhel8中默认使用的是firewalld
(1)iptables——>firewalld
(2)firewalld——>iptables
3 iptables的使用
(1)iptables的下载:dnf install iptables-services.x86_64 -y
(2)启动iptables服务:systemctl start iptables.service
(3)查看iptables的状态:systemctl status iptables.service
(4)火墙策略的永久保存
- iptables策略记录文件:
/etc/sysconfig/iptables
- 两种永久保存策略
1.手动指定路径及文件名: iptales-save > /etc/sysconfig/iptables
2. 自动保存策略到火墙策略记录文件:service iptables save
4 火墙默认策略
4.1 iptables默认的3张表
(1)filter表
- 三个链:INPUT、FORWARD、OUTPUT
- 作用:过滤数据包 内核模块:iptables_filter
(2)Nat表
- 三个链:PREROUTING、POSTROUTING、OUTPUT
- 作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
(3)Mangle表
- 五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
- 作用:修改数据包的服务类型
4.2 iptables默认的5条链
链(chains)是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一 条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据 该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定 义的默认策略来处理数据包。
规则链 | 功能 |
---|---|
INPUT | 进来的数据包应用此规则链中的策略 |
OUTPUT | 外出的数据包应用此规则链中的策略 |
FORWARD | 转发数据包时应用此规则链中的策略 |
PREROUTING | 转发数据包时应用此规则链中的策略(所有的数据包进来的时侯都先由这个链处理) |
POSTROUTING | 对数据包作路由选择后应用此链中的规则(所有的数据包出来的时侯都先由这个链处理) |
5 iptables命令
iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
iptables规则设定后立即生效
5.1 iptables的参数
-t ##指定表名称
-n ##不做解析
-L ##查看
-A ##添加策略
-p ##协议
--dport ##目的地端口
-s ##来源
-j ##动作
ACCEPT ##允许
DROP ##丢弃
REJECT ##拒绝
SNAT ##源地址转换
DNAT ##目的地地址转换
-N ##新建链
-E ##更改链名称
-X ##删除链
-D ##删除规则
-I ##插入规则
-R ##更改规则
-P ##更改默认规则
(1)查看规则表的信息
iptables -t filter -L
:查看filter表的规则信息
iptables -t filter -nL
:查看filter表的信息不做解析
(2)刷新表的规则
- 刷新nat表的规则:
iptables -t nat -F
- 刷新所有表的规则:
iptables -F
(3)添加表的规则
iptables -A INPUT -s 172.25.254.144 -p tcp --dport 22 -j DROP
## -A 插入规则 -s 来源 -p 协议 --dport 目的地端口 -j动作
##没有指定表时默认对filter表操作
测试结果:
(4)插入表的规则
-
插入规则
iptables -I INPUT 1 -s 172.25.254.144 -p tcp --dport 22 -j REJECT
144主机的测试结果:
(5)修改表中链的规则
iptables -R INPUT 1 -s 172.25.254.144 -p tcp --dport 22 -j REJECT
## 该主机拒绝172.25.254.144访问22端口,即拒绝172.25.254.144远程连接该主机
测试结果:
(6)设置默认策略:默认策略一般只有两种(DROP|ACCEPT)
iptables -P INPUT DROP
:把默认规则给拒绝了,并且没有定义哪个动作,所有关于外界连接都被拒绝了
测试:
- 新建链:
iptables -N linux
- 修改规则链的名称:
iptables -E linux westos
- 删除链:
iptables -X westos
5.2 数据包状态
-
添加一条入站规则,对进来的包的状态进行检测,已经建立tcp连接的包以及该连接相关的包允许通过:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT #### RELATED:建立过连接的 #### ESTABLISHED:正在连接的 #### NEW:新的
-
允许回环接口访问:
iptables -A INPUT -i lo -m state --state NEW -j ACCEPT
-
允许防火墙本机对外开放TCP端口22
iptables -A INPUT -p tcp --dport 22 -m state --state NEW -j ACCEPT
-
防火墙拒绝所有的访问:
iptables -A INPUT -j REJECT
5.3 nat设置路由转换
在任何一个IP数据包中,都会有Source IP Address与Destination IP Address这两个字段,数据包所经过的路由器也是根据这两个字段是判定数据包是由什么地方发过来的,它要将数据包发到什么地方去。iptables的DNAT与SNAT就是根据这个原理,对Source IP Address与Destination IP Address进行修改。
图中正菱形的区域是对数据包进行判定转发的地方。在这里,系统会根据IP数据包中的destination ip address中的IP地址对数据包进行分发。如果destination ip adress是本机地址,数据将会被转交给INPUT链。如果不是本机地址,则交给FORWARD链检测。
5.3.1 双网卡主机的配置
- 网卡enp1s0:
- 网卡enp8s0:
(1)SNAT:源网络地址转换,SNAT就是重写包的源IP地址。
- SNAT 只能用在nat表的POSTROUTING链里:
iptables -t nat -A POSTROUTING -o enp1s0-j SNAT --to-source 172.25.254.20
, 告诉系统把即将要流出本机的数据的source ip address修改成为172.25.254.20
(2)DNAT:目的网络地址转换,重写包的目的IP地址:iptables -t nat -A PREROUTING -i enp1s0 -j DNAT --to-dest 1.1.1.1
(3)确认打开内核路由转发功能:sysctl -a | grep ip_forward
5.3.2 单网卡主机的配置
(1)单网卡主机的网卡配置文件
(2)设置单网卡主机的网关和ip
5.3.3 测试
(1)单网卡主机测试:
可以ping通真机,单网卡主机登陆真机时,在真机上查看登陆过真机的设备,显示的是172.25.254.20主机登陆
(2)真机测试:
真机可以ping通单网卡主机,而且当真机登陆172.25.254.20时,实际登陆的主机是1.1.1.1
6 firewalld
- 锁定 iptables服务:
systemctl mask iptables.service
- 开启systemctl服务:
start firewalld.service
6.1 firewalld的域
域 | 作用 |
---|---|
trusted | 接受所有的网络连接 |
trusted | 用于家庭网络,允许接受ssh mdns ipp-client samba-client dhcp-client |
work | 工作网络 ssh ipp-client dhcp-client |
public | 公共网络 ssh dhcp-client |
dmz | 军级网络 ssh |
block | 拒绝所有 |
drop | 丢弃,所有数据全部丢弃无任何回复 |
internal | 内部网络 ssh mdns ipp-client samba-client dhcp-client |
external | ipv4网络地址伪装转发 sshd |
关于firewalld的设定原理及数据存储
/etc/firewalld/firewalld.conf
:火墙配置文件/lib/firewalld
:火墙模块目录
6.2 firewalld的管理命令
(1) 查看火墙状态:firewall-cmd --state
(2) 查看当前火墙中生效的域:firewall-cmd --get-active-zones
(3)查看默认域:firewall-cmd --get-default-zone
(4)查看默认域中的火墙策略:firewall-cmd --list-all
(5)查看指定域的火墙策略:firewall-cmd --list-all --zone=work
(6)设定默认域:firewall-cmd --set-default-zone=trusted
(7) 查看所有可以设定的服务:firewall-cmd --get-services
(8) 在火墙中添加http服务:firewall-cmd --permanent --add-service=http
- 重新加载防火墙:
firewall-cmd --reload
- 查看默认域中的火墙策略:
firewall-cmd --list-all
(9)移除防火墙中的cockpit 服务:firewall-cmd --permanent --remove-service=cockpit
- 重新加载防火墙:
firewall-cmd --reload
(10)指定数据来源访问指定域:firewall-cmd --permanent --add-source=1.1.1.0/24 --zone=block
- 重新加载防火墙:
firewall-cmd --reload
- 查看默认域中的火墙策略:
firewall-cmd --list-all
- 查看当前火墙中生效的域:
firewall-cmd --get-active-zones
(11)删除自定义域中的数据来源:firewall-cmd --permanent --remove-source=1.1.1.0/24 --zone=block
- 重新加载防火墙:
firewall-cmd --reload
- 查看默认域中的火墙策略:
firewall-cmd --list-all
(12)添加指定域的网络接口:firewall-cmd --permanent --add-interface=ens1 --zone=public
- 重新加载防火墙:
firewall-cmd --reload
- 查看当前火墙中生效的域:
firewall-cmd --get-active-zones
(13)更改网络接口到指定域:firewall-cmd --permanent --change-interface=ens1 --zone=block
- 重新加载防火墙:
firewall-cmd --reload
- 查看当前火墙中生效的域:
firewall-cmd --get-active-zones
(14)删除指定域的网络接口 :firewall-cmd --permanent --remove-interface=ens1 --zone=block
- 重新加载防火墙:
firewall-cmd --reload
- 查看当前火墙中生效的域:
firewall-cmd --get-active-zones
6.2 firewalld的高级规则
(1)添加高级规则
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -s 172.25.254.44 -p tcp --dport 22 -j REJECT
- 查看规则:
firewall-cmd --direct --get-all-rules
- 测试:172.25.254.44主机不能连接该主机
(2)删除高级规则
firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -s 172.25.254.44 -p tcp --dport 22 -j REJECT
- 查看规则:
firewall-cmd --direct --get-all-rules
6.3 nat设置路由转换
双网卡主机
(1)SNAT
- 打开地址伪装功能:
firewall-cmd --permanent --add-masquerade
- 重新家在防火墙:
firewall-cmd --reload
(2)DNAT:目的网络地址转换
firewall-cmd --permanent --remove-forward-port=port=22:proto=tcp:toaddr=1.1.1.1
### --permanent 是此条命令永久生效,不会随firewall的重启而失效
### --add-forward-port 添加端口转发操作
### port=20 被转发端口为20端口
### proto=tcp 转发协议为tcp协议
### toaddr=1.1.1.1 转发目标ip 不设置则为默认的本机ip
(3)测试:
- 真机可以ping通ip为1.1.1.1的主机
- 真机远程登录到172.25.254.20时,自动跳转登陆到目的主机1.1.1.1