linux中的iptables火墙优化策略
一、基本命令
iptables命令 | 解释 |
---|---|
-t | 指定表名称 |
-n | 不做解析 |
-L | 查看 |
-A | 添加策略 |
-p | 协议 |
–dport | 目的地端口 |
-s | 来源 |
-j | 动作 |
ACCEPT | 允许 |
DROP | 丢弃 |
REJECT | 拒绝 |
SNAT | 源地址转换 |
DNAT | 目的地地址转换 |
-N | 新建链 |
-E | 更改链名称 |
-X | 删除链 |
-D | 删除规则 |
-I | 插入规则 |
-R | 更改规则 |
-P | 更改默认规则 |
-o | 指定输出网络设备 |
-i | 指定输入设备 |
SNAT:用的是POSTROUTING,在路由之后做,参数用-o表示出口
DNAT:用的是PREROUTING,在路由之前做,参数用-i表示进入口
此外,prerouting 和postrouting 也经常用于NAT配置网关机进行网络地址转换使用,这时候有一下规律:
POSTROUTING是源地址转换(SNAT),要把你内部网络上受防火墙保护的ip地址转换成你本地的公网地址才能让它们上网。
PREROUTING是目的地址转换(DNAT),要把别人的公网IP换成你们内部的IP,才让访问到你们内部受防火墙保护的服务器。
二、火墙的切换
firewalld----->iptables
dnf install iptables-services.x86_64 --allowerasing
systemctl disable firewalld.service
systemctl mask firewalld.service
systemctl enable --now iptables.service
三、iptables的使用及火墙使用规则
(1)、名词解释
input 输入
output 输出
forward 转发(经过内核)
postrouting 路由之后
prerouting 路由之前
(2)、表格解释
filter | 经过内核处理的数据 | 包括input,output,forward |
---|---|---|
nat | 不经过内核处理(地址转换和地址伪装部分) | 包括input,output,postrouting ,prerouting |
mangle | 包含全部内容 | 对内容做补充说明 |
(3)、iptables使用方式
如果不指名表格默认都fitter表
1)、基本命令
1、基本命令
service iptables save
保存当前规则到永久文件
永久文件的保存地址为/etc/sysconfig/iptables
每次重启iptables后都会重新读取iptables的永久文件的规则
iptables
-t ##指定表名称
-n ##不做解析
-L ##查看
-A ##添加策略
-p ##指定协议
--dport ##指定目的地端口
-s ##指定来源
-j ##指定动作
ACCEPT ##允许
DROP ##丢弃
REJECT ##拒绝
SNAT ##源地址转换
DNAT ##目的地地址转换
-F ##清空表中策略
-N ##新建链
-E ##更改链名称
-X ##删除链
-D ##删除规则
-I ##插入规则
-R ##更改规则
-P ##更改默认规则
常用组合命令如下:
iptables -nL 查看链条规则(默认为filter表)
iptables -t filter -L 查看filter表链接情况
iptables -t filter -nL 查看链接情况,不做地址解析
iptables -F 清除所有规则,重启iptables服务后可恢复正常
iptables-save 保存当前iptables设置
iptables -t nat -nL 查看nat表
iptables -A INPUT -j REJECT 添加一个新的input链
iptables -D INPUT 1 删除第一个链接
iptables -A INPUT -p tcp --dport 22 -j ACCEPT 添加tcp协议的22端口
2)、具体使用方法
2、刷掉所有的规则,重启iptables
iptables -nL
iptables -F
iptables -nL
systemctl restart iptables.service 重启iptables服务
iptables -nL
刷掉所有规则后,没有保存在永久文件中,所以重启后会还原
3、添加链条,删除链条
添加在input中添加一条链
删除刚刚这条链条
4、刷掉所有的规则,设置拒绝所有人访问
此时我们的ssh连接不上
5、设置访问端口
在filter表的INPUT链中添加拒绝所有访问请求的策略,接着再添加规则,接受通过tcp的22端口(ssh远程连接默认使用22端口)
此时还是连接拒绝,因为iptables的读取规则是从上到下读取的
现在在第一行的位置,插入一条规则,内容是允许tcp的22端口接入
再次ssh连接发现成功
6、利用-R更改,对ip来源高级设定
对于之前的前两条规则,更改链接:允许172.25.42网段链接,拒绝172.254.14网段链接
iptables -R INPUT 1 -s 172.25.42.0/24 -p tcp --dport 22 -j ACCEPT
iptables -R INPUT 2 -j REJET
iptables -nL
按照现在的读取顺序来说,172.25.42.xx/24网段的可以ssh连接,其他网段的不能连接
结果发现以真机(172.25.42.250)可以连接本机172.25.42.100
将此台虚拟机更改ip为172.25.25.100,将另外一台机器设置为172.25.25.200后访问发现
虽然都是同一网段,但是访问失败
将第一条规则更改为允许172.25.25.200访问
结果发现172.25.25.200可以用ssh进行连接
记得将本虚拟机的ip还原为172.25.42.100
7、更改默认规则
iptables -P INPUT DROP 可以链接,但是丢弃掉全部请求
iptables -P INPUT ACCEPT 接受请求
8、新建一个链:
iptables -N westos 新建westos链
iptables -E westos westos1 更名为westos1
iptables -X westos1 删除westos1
四、优化火墙状态处理
(1)、数据请求状态
RELATED | 建立过链接的 |
---|---|
ESTABLISHED | 建立过链接的 |
NEW | 新链接的 |
(2)、加快数据请求火墙处理
为了优化处理速度,加快筛选过滤速度,对数据包状态进行编辑,加快火墙助理
1 iptables -F 去掉现有火墙策略
2 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 接受所有建立过连接、正在连接的数据包
3 iptables -A INPUT -m state --state NEW -i LO -j ACCEPT 接受所有来自本机回环接口的新的数据包
4 iptables -A INPUT -m state --state NEW -p tcp --dport 22 -j ACCEPT 接受所有来自对于tcp的22端口的数据包
5 iptables -A INPUT -m state --state NEW -j REJECT 拒绝其他其他新的数据包
iptables-save
结果是:优化后的火墙,对于第一次访问的数据进行第4条判断,再次访问时进行第2条的判断,加快过滤速度
五、iptables的NAT桥接
(1)、实验环境
实验环境
真实主机
:ip为172.25.254.250
双网卡主机westosa(虚拟机)
:ip1为172.25.42.100,ip2为172.25.254.100
单网卡主机westosb(虚拟机)
:ip为172.25.42.200
双网卡主机westosa
单网卡主机westosb
流程图
SNAT:用的是POSTROUTING,在路由之后做,参数用-o表示出口
DNAT:用的是PREROUTING,在路由之前做,参数用-i表示进入口
(2)、SNAT源地址转换
想要实现单网卡主机(172.25.42.200)和真实主机172.25.254.250的互通,可以用双网卡主机的内核做地址转换(地址伪装)。用双网卡主机的172.25.42.100的ens3网卡接收对来自于单网卡主机172.25.42.200的数据包,然后双网卡主机ens3网卡将数据经过内核转换给172.25.254.200的ens8网卡,并将数据的源地址更改为双网卡的172.25.254.200地址。
因为SNAT源地址转换是在路由之后POSTROUTING链中进行的,即我们需要双网卡的nat表的POSTROUTING链中添加策略
1、进行双网卡主机westosa设定
因为是路由之后,所以更改双网卡主机的数据包的ens8网卡,将传递给真机的数据包更改源地址为ens8
POSTROUTING,在路由之后做,参数用-o表示出口
iptables -t nat -A POSTROUTING -o ens8 -j SNAT --to-source 172.25.254.100 路由后操作POSTROUTING,将en3网卡输出的ip都伪装为172.25.254.100
sysctl -a |grep ip_forward 图1、查看路由功能是否开启
vim /etc/sysctl.conf 图2、打开路由功能
sysctl -p 使得内核路由功能生效
iptables -t nat -nL 图3、查看当前的SNAT
图1
图2
2、单网卡主机westosb设定
将单网卡的网关设置为双网卡主机ens8网卡的ip172.25.42.100
,这样可以使得数据可以与双网卡主机的ens3网卡进行通信,然后通过ens8网卡和外界进行连接
实验结果1:单网卡主机(172.25.42.200)能与不同网段的主机(172.25.254.250)通过双网卡主机路由直接ping通
实验结果2:单网卡主机(172.25.42.200)能与不同网段的主机(172.25.254.250)通过双网卡主机路由进行ssh连接,w -i 可以查看到,当前的ssh连接是通过172.25.42.100路由转发的。
实验结果3:此时我们的真机不能访问到westosb,因为数据的流向是单向的,只能从westosb到真机。要实现在这个的话也可以用DANT去做
(3)、DNAT目的地地址转换
为了实现真实主机
在路由之前做,参数用-i表示进口做
DNAT:用的是PREROUTING,在路由之前做,参数用-i表示进入口
DNAT目的地地址转换是在路由之前PREROUTING链中进行的,即我们需要在nat表的PREROUTING链中添加策略,指定对所有从ens8接口输入的数据用DNAT转换其目的地地址为westosb为172.25.42.200
1、在双网卡主机中进行操作
更改DNAT
iptables -F
iptables -t nat -F
iptables -t nat -A PREROUTING -i ens8 -j DNAT --to-dest 172.25.42.200
2、实验结果
实验结果发现虽然连接的是westosa(172.25.254.100),但是访问到的是westosb(172.25.42.200)
六、firewall
(1)、firewall的开启
systemctl disable --now iptables.service
systemctl unmask firewalld.service
systemctl enable --now firewalld.service
systemctl mask iptables.service
(2)、firewalld的模式
trusted | 信任模式:接受所有连接 |
---|---|
home | 家庭网络:允许ssh,mdns, ipp-client, samba-client, dhcp-client |
work | 工作网络:允许ssh, ipp-client, dhcp-client |
public | 公共模式:ssh,dhcp-client |
dmz | 军工级:ssh |
block | 拒绝所有 |
drop | 丢弃,所有的连接都不回复 |
intter | 内部网络:ssh,mdns,ipp-client,samba-client |
external | ipv4网络地址伪装发送 sshd |
(1)设定信任模式时
(2)设定public模式时
(3)设定block模式
(3)、firewalld的文件及其设定原理
- 更改firewalld状态后,配置文件
/etc/firewalld/firewalld.conf
内容会改变 - 封装的各个firewalld状态文件的子配置文件地址
/usr/lib/firewall/
- 各个软件运用时,火墙的运用模块:
/usr/lib/firewalld/services/
- 火墙添加永久允许模时,配置文件更改地址:cd /etc/firewalld/zones/
(4)、 firewalld的管理命令
firewall-cmd --state | ##查看火墙状态 |
---|---|
firewall-cmd --get-active-zones | ##查看当前火墙中生效的域 |
firewall-cmd --get-default-zone | ##查看默认域 |
firewall-cmd --list-all | ##查看默认域中的火墙策略 |
firewall-cmd --list-all --zone=work | ##查看指定域的火墙策略 |
firewall-cmd --set-default-zone=trusted | ##设定默认域 |
firewall-cmd --get-services | ##查看所有可以设定的服务 |
firewall-cmd --permanent --remove-service=cockpit | ##移除服务 |
firewall-cmd --reload | 重启服务 |
firewall-cmd --permanent --add-source=172.25.254.0/24 --zone=block | ##指定数据来源访问指定域 |
firewall-cmd --reload | |
firewall-cmd --permanent --remove-source=172.25.254.0/24 --zone=block | ##删除自定域中的数据来源 |
firewall-cmd --permanent --remove-interface=ens224 --zone=public | ##删除指定域的网络接口 |
firewall-cmd --permanent --add-interface=ens224 --zone=block | ##添加指定域的网络接口 |
firewall-cmd --permanent --change-interface=ens224 --zone=public | ##更改网络接口到指定域 |
(5)、编写一个火墙服务文件
1.拷贝其中一个文件,取名为westos.xml
cp /usr/lib/firewalld/services/ssh.xml /usr/lib/firewalld/services/westos.xml
2.更改其中内容
vim /usr/lib/firewalld/services/westos.xml
3.重启火墙,查看火墙中的westos文件
systemctl restart firewalld.service
firewall-cmd --get-services | grep westos
4.火墙添加westos文件,移除文件
firewall-cmd --permanent --remove-service=westos
七、firewalld的高级使用
(1)、对单独ip访问设置不同的域
firewall-cmd --permanent --add-source 172.25.0.0/24 --zone=trusted 此ip访问时,设置为信任域
firewall-cmd --reload
firewall-cmd --permanent --remove-source 172.25.0.0/24 --zone=trusted 移除
firewall-cmd --reload
(2)、对不同网卡进行不同域的设置
firewall-cmd --permanent --remove-interface=ens9 --zone=public
firewall-cmd --permanent --remove-interface=ens8 --zone=public
firewall-cmd --permanent --add-interface=ens8 --zone=trusted
firewall-cmd --reload
firewall-cmd --list-all
firewall-cmd --list-all --zone=trusted
firewall-cmd --permanent --change-interface=ens8 --zone=public 修改回来
此时ens3的ip地址的aphche不可以被访问到(未添加http服务)
此时ens8的ip地址的aphche不可以被访问到(信任模式)
八、firewalld的桥接
(1)、SNAT
双网卡主机
firewall-cmd --permanent --add-masquerade 开启地址伪装
firewall-cmd --reload
单网卡
单网卡(172.25.14.100)网关设置为双网卡的同网段(172.25.254.200)即可连接不同网段主机
(2)、DNAT
目的地地址转接
双网卡主机
[root@service ~] firewall-cmd --permanent --add-forward-port=port=22:proto=tcp:toaddr=172.25.254.214 将登陆本机的ip转接到172.25.14.200
success
[root@service ~] firewall-cmd --reload
success
结果:ssh-l访问双网卡主机时会伪装转接到单网卡主机上