众所周知,相较于企业内网,外部的公网环境更加恶劣,罪恶丛生。在公网与企业内网之间充当保护屏障的防火墙虽然有软件或硬件之分,但主要功能都是依据策略对穿越防火墙自身的流量进行过滤。防火墙策略可以基于流量的源目地址、端口号、协议、应用等信息来定制,然后防火墙使用预先定制的策略规则监控出入的流量,若流量与某一条策略规则相匹配,则执行相应的处理,反之则丢弃。这样就可以保证仅有合法的流量在企业内网和外部公网之间流动了。
rhel7.0之前的版本用的是iptables
rhel7.0之后的版本是iptables与firewall都用
RHEL 7系统中集成了多款防火墙管理工具,其中firewalld(Dynamic Firewall Manager of Linux systems,Linux系统的动态防火墙管理器)服务是默认的防火墙配置管理工具,它拥有基于CLI(命令行界面)和基于GUI(图形用户界面)的两种管理方式
相较于传统的防火墙管理配置工具,firewalld支持动态更新技术并加入了区(zone)的概念。简单来说,区域就是firewalld预先准备了几套防火墙策略集合(策略模板),用户可以根据生产场景的不同而选择合适的策略集合,从而实现防火墙策略之间的快速切换。
firewalld中常用的区域名称及策略规则
区域 | 默认规则及策略 |
---|---|
trusted(信任) | 可接受所有的网络连接 |
home(家庭) | 用于家庭网络,仅接受ssh,msdns,ipp-client,samba-client,dhcpv6-client服务连接 |
internal(内部) | 用于内部网络,仅接受ssh,msdns,ipp-client,samba-client,dhcpv6-client服务连接 |
work(工作) | 用于工作区,仅接受ssh ipp-client或dhcpv6-client服务连接 |
public(公共) | 在公共区域内使用,仅接受ssh或dhcpv6-client服务连接 |
external(外部) | 出去的ipv4网络连接通过此区域伪装和转发,仅接受ssh服务连接 |
dmz(非军事区) | 仅接受ssh服务连接 |
block(限制) | 拒绝所有网络连接 |
drop(丢弃) | 任何接受的网络数据包都被丢弃,并没有任何回复 |
firewall-config ##图形界面管理防火墙
1:选择运行时(Runtime)模式或永久(Permanent)模式的配置。
2:可选的策略集合区域列表。
3:常用的系统服务列表。
4:当前正在使用的区域。
5:管理当前被选中区域中的服务。
6:管理当前被选中区域中的端口。
7:开启或关闭SNAT(源地址转换协议)技术。
8:设置端口转发策略。
9:控制请求icmp服务的流量。
10:管理防火墙的富规则。
11:管理网卡设备。
12:管理源(ip网段)
13:被选中区域的服务,若勾选了相应服务前面的复选框,则表示允许与之相关的流量。
图形界面修改端口转发:
设定永久生效并开启masquerade地址伪装:
在port forwarding添加端口转发
添加http服务
重新加载防火墙
测试:
在真机打开浏览器输入172.25.254.84:5543
火墙状态的查看,开启,关闭:
systemctl start firewalld ##开启火墙
systemctl stop firewalld ##关闭火墙
systemctl enable firewalld ##火墙开机启动
systemctl stop firewalld ##火墙开机关闭
systemctl status firewalld ##查看火墙状态
管理火墙的域信息:
firewall-cmd --get-default-zone ##查看当前默认域
firewall-cmd --set-default-zone= ##设置默认域,此命令是永久更改,立即生效
firewall-cmd --get-zones ##查看可以使用的域
firewall-cmd --get-active-zones ##查看所有正在使用的域及接口和源信息
firewall-cmd --get-services ##查看所有可添加的服务
firewall-cmd --add-service= --zone= ##添加某域某服务的流量
firewall-cmd --remove-service= --zone= ##禁止某域某服务的流量
查看指定域的所有配置:
firewall-cmd --list-all ##查看默认域的所有配置(接口,源,服务,端口)
firewall-cmd --zone=work --list-all ##查看指定的work域的信息
firewall-cmd --list-all-zones ##列出所有域的所有配置
firewall-cmd --zone= --remove-source=172.25.254.83 ##从指定域中删除用于路由来自83主机的所有流量规则
firewall-cmd --zone= --add-source=172.25.254.83 ##将来自83主机的所有流量路由到指定域
firewall-cmd --add-interface= --zone= ##将来自该接口的所有流量到指定域
firewall-cmd --change-interface= --zone= ##将接口已有区域与其它区域关联
firewall-cmd --remove-interface= ##删除
firewall-cmd --add-port= /tcp ##添加某域某端口的流量
firewall-cmd --remove-port= /tcp ##禁止某域的某服务的流量
查看火墙工作状态:
firewall-cmd --state ##查看火墙状态
火墙重新加载:
firewall-cmd --reload ##丢弃runtime配置并应用permanent配置
firewall-cmd --permanent --complete --reload ##状态信息将丢失,当防火墙有问题时可以使用
firewall-cmd 表示临时设置,firewall-cmd --permanent 表示永久设置(需要reload操作)
配置文件添加服务:
cd /etc/firewalld/zones
vim public.xml
systemctl restart firewalld
cd /usr/share/firewalld
cd /usr/lib/firewalld/services
vim http.xml
添加则需要重新复制一个配置文件
cp http.xml http8080.xml
vim http8080.xml
systemctl restart firewalld
filter
通过 firewall-cmd工具,可以使用–direct选项在运行时间里增加或者溢出链
目的:允许某一ip可以连接ssh或限制某一ip连接ssh
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.83 -j ACCEPT ##只允许83主机连接ssh
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 ! -s 172.25.254.83 -j ACCEPT ##感叹号表示“除过”
firewall-cmd --direct --add-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.83 -j REJECT ##限制83主机连接ssh
firewall-cmd --direct --get-all-rules ##查看规则
firewall-cmd --direct --remove-rule ipv4 filter INPUT 1 -p tcp --dport 22 -s 172.25.254.83 -j ACCEPT ##移除规则
firewalld的SNAT设置(原地址转换)
实验环境准备:
client虚拟机ip为1.1.1.1
server虚拟机作为路由器,具有两块网卡,一个ip为172.25.254.84(eth0),一个ip为1.1.1.2(eth1)
真机ip为172.25.254.13
设置步骤:
设置client虚拟机的网关为1.1.1.2
vim /etc/sysconfig/network
route -n
添加server虚拟机路由器地址伪装功能:
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
测试:
client虚拟机(1.1.1.1)ping真机(172.25.254.13)
client虚拟机(1.1.1.1)ssh连接真机(172.25.254.13),用w -i命令查看连接的是server路由器端口(172.25.254.84)
目的:
连接一台主机,通过端口转发设置发现连接的是另外一台主机
设置端口转发:
在server虚拟机(172.25.254.84)添加目的地址转换服务,将访问路由器的主机自动去访问1.1.1.1
firewall-cmd --add-forward-port=port=22:proto=tcp:toport=22:toaddr=1.1.1.1 ##添加
测试:
用真机(172.25.254.13)ssh连接路由器server(172.25.254.84),发现连接的主机是client(1.1.1.1)
删除DNAT设置:
firewall-cmd --remove-forward-port=port=22:proto=tcp:toport=22:toaddr=1.1.1.1 ##删除
systemctl restart firewalld
在早期的Linux系统中,默认使用的是iptables防火墙管理服务来配置防火墙。尽管新型的firewalld防火墙管理服务已经被投入使用多年,但是大量的企业在生产环境中依然出于各种原因而继续使用iptables
防火墙会从上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止)。如果在读取完所有的策略规则之后没有匹配项,就去执行默认的策略。一般而言,防火墙策略规则的设置有两种:一种是“通”(即放行),一种是“堵”(即阻止)。当防火墙的默认策略为拒绝时(堵),就要设置允许规则(通),否则谁都进不来;如果防火墙的默认策略为允许时,就要设置拒绝规则,否则谁都能进来,防火墙也就失去了防范的作用。
iptables服务把用于处理或过滤流量的策略条目称之为规则,多条规则可以组成一个规则链,而规则链则依据数据包处理位置的不同进行分类,具体如下:
在进行路由选择前处理数据包(PREROUTING);
处理流入的数据包(INPUT);
处理流出的数据包(OUTPUT);
处理转发的数据包(FORWARD);
在进行路由选择后处理数据包(POSTROUTING)。
iptables服务动作术语中解释:
ACCEPT(允许流量通过)
REJECT(拒绝流量通过,会看到响应)
LOG(记录日志信息)
DROP(拒绝流量通过,不会看到响应)
相关软件: iptables-services
配置文件:/etc/sysconfig/iptables
实验环境准备:
systemctl stop firewalld ##关闭firewalld火墙
systemctl mask firewalld ##冻结火墙服务
systemctl disable firewalld ##火墙开机关闭
yum install ipatbles-services ##安装提供iptable管理的软件
systemctl start iptables ##开启服务
systemctl enable iptables ##开机自启
注意:如果执行不了iptables命令,请安装iptables命令插件
yum install system-config-firewall-base -y
iptable的查看:
iptables -L ##查看默认表filter的策略(没有真实ip),如需指定表,加-t参数
iptables -n ##不作解析
iptables -nL ##查看默认表,附带解析
iptables -t nat -nL ##查看指定表nat
iptables -F ##清除默认filter表中的所有策略,如需指定表,加-t参数
service iptables save ##保存对表的更改(如果在修改后不保存,在重启iptables服务后,更改失效)
iptable的管理:
iptables -P INPUT DROP ##此时设置INPUT为drop,所有主机不能输入数据,实验用ssh不能连接
iptables -P INPUT ACCEPT ##此时设置INPUT为accept,可以ssh连接
iptables -N westos ##新建链westos
iptables -E westos WESTOS ##将链westos名称修改为WESTOS
iptables -X WESTOS ##删除表WESTOS
iptables -t filter -A INPUT -s 172.25.254.1 -p tcp --dport 22 -j REJECT ##添加策略只允许主机1ssh连接,且插入位置默认为最后一条
-s ##数据来源 -p ##网络协议 --dport ##端口 -j ##动作
iptables -I INPUT -s 172.25.254.1 -p tcp --dport 22 -j ACCEPT ##添加只允许1ssh连接的策略,且插入位置默认为1,-I INPUT 3表示插入到第3条
iptables -D INPUT 3 ##删除第三条策略
iptables -A INPUT ! -s 172.25.254.1 -p tcp --dport 22 -j REJECT ##!表示除了的意思,插入策略,除了1都可以ssh访问
iptables -R INPUT 2 -j ACCEPT ##将第二条策略的动作修改为ACCEPT
防火墙优化:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -i lo -j ACCEPT
iptables -A INPUT -m state --state NEW -p tcp -dport 22 -j ACCEPT
iptables -A INPUT -m state --state new -j REJECT
service iptables save
iptables -nL
在iptables命令后添加-L参数查看已有的防火墙规则链:
在iptables命令后添加-F参数清空已有的防火墙规则链:
把INPUT规则链的默认策略设置为拒绝:
向INPUT链中添加允许ICMP流量进入的策略规则:
并尝试ping
删除INPUT规则链中刚刚加入的那条策略(允许ICMP流量),并把默认策略设置为允许:
将INPUT规则链设置为只允许指定网段172.25.254的主机访问本机的22端口,拒绝来自其他所有主机的流量:
在设置完上述INPUT规则链之后,我们使用IP地址在172.25.254.网段内的主机访问服务器(即前面提到的设置了INPUT规则链的主机)的22端口,效果如下:
然后,我们再使用1.1.1网段内的主机访问服务器的22端口(虽网段不同,但已确认可以相互通信),效果如下,就会提示连接请求被拒绝了:
向INPUT规则链中添加拒绝所有人访问本机12345端口的策略规则:
向INPUT规则链中添加拒绝172.25.254.13主机访问本机22端口(ssh服务)的策略规则:
用ip为13的主机测试ssh连接,被拒绝
实验环境准备:
重新安装iptables软件,初始化实验环境
查看内核的路由器功能是否开启:
sysctl -a | grep ip_forward
若是0则没有开启
vim /etc/sysctl.conf
加入:
net.ipv4.ip_forward=1
systemctl restart network
设置步骤:
iptables -t nat -nL
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.84
iptables -F
测试:
client虚拟机(1.1.1.1)通过server服务器的eth1(1.1.1.2)进入,从eth0(172.25.254.84)(172.25.254.13)
最后查看到连接真机172.25.254.13的主机是服务器的eth0端口(172.25.254.84)
w -i ##查看
如果ping不通真机,尝试在路由器端键入命令iptables -F
下图“X”的是之前firewalld地址转换实验,通过时间判断
设置步骤:
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-dest 1.1.1.1
测试:
此时真机(172.25.254.13)ssh连接路由器的eth0端(172.25.254.84),最后重看到ssh连接到的ip是client虚拟机(1.1.1.1)
ifconfig ##查看
END