防火墙概念
是指设置在不同网络与网络安全域之间的一系列部件的组合,也是不同安全域之间信息的唯一出口。通过检测、限制并更改跨越防火墙的数据流,尽可能的对外屏蔽网络内部信息、结构和运行状态,且有选择的接受外部网络访问。
防火墙相关知识
软件级(类似于寄居架构):安装在操作系统之上的一个防火墙软件。
优点:
工作在应用层,功能强大。可以针对IP地址进行过滤,还可以针对用户名进行过滤,组进行过滤。
缺点:
工作在应用层,代理级的。对包的执行效率非常低。兼容性问题。安全漏洞问题。(后期的软件防火墙大部分用于“本地主机保护”)
常见的软件防火墙:
Windows:ISA 2012 天网 系统本身自带:Linux:iptables firewalld
硬件级(类似于原生架构):独立硬件,嵌入式应用程序。(这个操作系统本身就是防火墙)。不需要开启那么多功能和接口。只开启防火墙相对应的功能和接口,相对来说比较稳定。不会太卡,重启即可。
优点:
稳定、高效。根据数据包里的信息过滤。解决兼容性问题。安全漏洞问题较小。成本降低,根据用户群体需求提升性能。作为网络安全防护的主要设备。
缺点:
功能没有软件级那么强大
常见的硬件防火墙:
华为 思科 天融信 深信服 飞塔 浪潮 中新金盾
绿盟科技 Juniper 启明星辰 网康 NETGEAR
按功能分类
1)包过滤型防火墙
抓取通过设备的数据包,对数据流层的内容进行过滤。能够检查数据包中的服务端口、IP(目标、源)地址、MAC(目标、源)地址等信息。【在现在的防火墙技术中作为基本功能应用】
2)应用层防火墙
数据包分析功能工作在应用层,可以针对应用层的很多软件进行监听和防护。对信息类的数据进行监控分析,对传输的文件类型进行监控
3)包检测型防火墙
抓取用户的访问请求,预判用户的下一步动作,并对动作进行监听【判断是否是入侵行为,DDos攻击等】
4)网络行为管理防火墙
【在应用层+检测型防火墙基础上增加了更多分析和统计,记录功能】上网行为监控,域名访问记录、软件访问记录、搜索记录、论坛消息记录、QQ微信等软件聊天信息记录、电子邮件等5)华为称为下一代防火墙,是一款可以全面应对“应用层威胁”的高性能防火墙!
根据存放位置:
网络型
主机防火墙
Linux包过滤防火墙
iptables
:用户态,规则列表。为netfilter提供命令/规则的工具,由用户定义(位于/sbin/iptables)
firewalld
:用户态,规则列表。为netfilter提供命令/规则的工具,由用户定义【CentOS7默认的管理防火墙规则的工具】
netfilter
:内核态,内核模块。提供数据转发、丢弃等功能。执行规则。接受数据包、封装数据包、转发数据包、丢弃数据包。【系统内核对数据包的处理机制】
iptables/netfilter的最大优点是它可以配置有状态的防火墙(使用户可以完全控制防火墙配置和信息包过滤。从而制定自己的规则,只允许您想要的网络流量进入系统)
iptables
寄居架构:安装在操作系统之上,操作系统死亡,软件随之毁灭。抢夺操作系统的资源
原生架构:直接安装在硬件之上,本身就属于一款操作系统。可以随时分配调节系统资源
OSI 7层
应用层:操作系统之上
表示层
会话层
传输层
网络层
数据链路层
物理层
netfilter与iptables的关系
iptables防火墙规则
钩子函数:4表5链
规则: 表代表数据包的处理区域
; 链处理数据包的时机
5链:利用五种钩子函数存放过滤规则,叫做规则链
规则链:
✔ 规则的作用: 在链内设置规则,由规则负责对数据包过滤和处理
✔ 链的作用:容纳各种防火墙规则
✔ 链的分类依据:处理数据包的不同时机
默认包括5种规则链
✔ input:处理入站数据
✔ forward:处理转发的数据
✔ output:处理出站数据
✔ prerouting:路由之前检查(路由选择之前处理数据包,进行目标地址转换)
✔ postrouting:路由之后检查(路由选择之后处理数据包,进行源地址转换)。PAT prerouting:路由之前 postrouting:路由之后
4表:【规则链存放在表中,规则存放在规则链中】存放规则链的表叫做规则表 raw:原始的,未经分析的 Mangle:压碎 Nat:地址转换 Filter:过滤,筛选
✔ raw表:确定是否对数据包进行状态跟踪。 包括:prerouting、output链
✔ filter表:过滤表,决定是否放行数据包。 包括:input、forward、output链
✔ nat表:地址转换表。 包括:prerouting、output、postrouting链
✔ mangle表:为数据包做标记,数据包需要做什么。 包括:prerouting、input、forward、output、postrouting链
拓展:
✔ security表:security是跟selinux相关的MAC模式的安全过滤。
表的作用:容纳各种规则链
表和链的执行顺序
1、iptables数据流顺序(规则表之间的顺序)
raw→mangle→nat→filter
2、规则链之间的顺序
✔ 入站:prerouting→input(prerouting:路由之前检查(路由选择之前处理数据包,目标地址转换))
外界的数据包到达防火墙后,首先被prerouting链处理(是否修改地址等),然后进行路由选择,如果数据包的目标地址是本机,那么内核将数据包传递给input进行处理,然后交给上层应用程序
✔ 出站:output→postrouting(postrouting:路由之后检查(路由选择之后处理数据包,源地址转换))
防火墙本机向外部地址发送的数据包,首先内output处理,然后进行路由选择,再交给postrouting处理
✔ 转发:prerouting→forward→postrouting
外部数据包到达防火墙后,首先被prerouting链处理,然后进行路由选择~如果数据包的目标地址是其他外部地址,则内核交给forward链进行处理,最后交给postrouting链处理
3、规则链内的匹配顺序
按顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配的规则,则按该链的默认策略处理!
iptables命令语法
语法格式
iptables [-t 表名] 参数 [链名] [条件表达式] [-j 控制类型]
[表名]
:filter表 或 nat表(不加-t 表名选项,默认为filter表)
参数
:
-A:添加一条规则,添加在链的尾部
-I: 插入一条规则,插入对应的链(在链的开头或指定序号插入一条规则)
-C: 将规则添加到用户定义链之前对其进行检查
-D: 删除指定链中某条规则
-R: 替换链上的某条规则
-P: 定义某个链的默认规则
-N: 自定义一个新的空链
-X: 删除一个自定义的空链
-F:清空指定规则链,如果省略链,则可以实现删掉对应表的中所有链(常用)
-Z: 重置指定链中的所有规则计数器
-E: 重命名自定义的链,不改变链本身
-L: 显示指定表中的规则
-n:以数字形式显示主机地址和端口号(-n -L 可合写为 -nL)
-v:显示详细规则信息
-vv:显示更详细信息
-x:显示计数器的精确值
--line-number:查看规则时,显示规则的序号
[条件表达式]
:需要分析的数据包头部信息对象
通用匹配
☺协议类:-p tcp/udp/icmp
☺端口类:–dport 目标端口号 --sport 源端口号
☺地址类:-s 源IP地址/子网掩码 -d 目标IP地址/子网掩码 (单独主机地址地址不用加子网掩码)
☺接口类:-i 网卡接口名称 输入接口 例:-i ens33
-o 网卡接口名称 输出接口 例:-o ens37
☺特殊分类(隐含匹配)
TCP标记匹配:–tcp-flags 检查范围 被设置的标记
ICMP类型匹配:–icmp-type 类型ID 8请求 0回应 3不可达
☺ 其他分流(显示匹配)
要求以“-m 扩展模块”的形式明确指出类型
多端口匹配:
-m multiport --sport 源端口列表(1024-2048) multi:多种,多数 range:一系列,范围 src:源对象 source:来源 dst:目标
-m multiport --dport 目标端口列表(2000-3000)
IP范围匹配
-m iprange --src-range IP范围(192.168.10.10-192.168.10.20)
-m iprange --dst-range IP范围(例如:192.168.10.100-192.168.10.200)
MAC范围匹配
-m mac --mac-source MAC地址
状态匹配
-m state --state 连接状态
状态:
ESTABLISHED: 指出该信息包属于已建立的连接,该连接一直用于发送和接收信息包并且完全有效。
INVALID: 指出该信息包与任何已知的流或连接都不相关联,它可能包含错误的数据或头。
NEW: 意味着该信息包已经或将启动新的连接,或者它与尚未用于发送和接收信息包的连接相关联。
RELATED: 表示该信息包正在启动新连接,以及它与已建立的连接相关联。
字符串匹配
-m string --string "关键字" --alog bm
选项说明:
-m string //匹配字符串规则
--string "" //引号中添字符串
--algo bm //字符串编码转换算法
[控制类型]
:
-j ACCEPT:允许通过 accept:同意,接受 reject:拒收,拒绝接受 algo:算法
-j DROP:直接丢弃,不给出任何回应
-j REJECT:拒绝通过,必要时会给出提示
-j LOG:记录日志信息,然后传给下一条规则继续匹配
iptables [-t 表名] 参数 [链名] [条件] [-j 控制类型]
几个注意事项
✔ 不指定表名时,默认指filter表
✔ 不指定链名时,默认指表内的所有链
✔ 除非设置链的默认策略,否则必须指定匹配条件
✔ 参数、链名、控制类型使用大写字母,其余均为小写
在链尾添加一条规则:对来源于192.168.1.1,目标地址为192.168.1.20的数据包在入站时进行丢弃
iptables -t filter -A INPUT -p icmp -s 192.168.1.1 -d 192.168.1.20 -j DROP
基本操作语句
防火墙关闭查看[stop firewalld],更加明显
# 查看当前规则
iptables -t filter -L
# 清除所有规则
iptables -F
iptables -L
# 修改指定链的默认规则
iptables -t filter -P INPUT DROP
案例(防火墙firewalld关闭即可)
例1:拒绝本地主机和任何其他主机“互ping”
iptables -t filter -A INPUT -p icmp -j DROP //在filter表INPUT链的末尾添加icmp协议规则,动作为DROP
例2:拒绝192.168.1.1 ping本地其他主机
iptables -t filter -A INPUT -p icmp -s 192.168.1.1 -j DROP
例3:本地主机能ping其他主机,但其他主机不能ping本地主机
iptables -t filter -A INPUT -p icmp --icmp-type 8 -j DROP
ping
请求:request 8
回应:reply 0(默认链的ICMP类型为0,所有本实验中不用设置OUTPUT输出链)
不可达: 3
例4:允许本地主机能ping其他主机,除(某一个IP)外,不允许其他主机ping本地主机(基于上述实验基础上)
分析:希望某一个IP地址可以访问。我们可以允许INPUT链中,来自(某一IP),ICMP协议中类型8的数据包。但是第一条为拒绝了所有,所以我们需要将策略插入到“拒绝的策略”之前
[root@localhost ~]# iptables -I INPUT 1 -s 192.168.2.11 -p icmp --icmp-type 8 -j ACCEPT
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT) chain:锁链,一系链 ACCEPT:同意,许可 anywhere:任何地方 opt:选择,挑选 drop:丢弃
target prot opt source destination
ACCEPT icmp -- 192.168.2.11 anywhere icmp echo-request
DROP icmp -- anywhere anywhere icmp echo-request
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
例5:拒绝客户的192.168.2.1主机访问本地httpd服务
分析:客户端发来的数据包为输入,所以在INPUT链中配置。根据封装结构,收到的这个数据包源IP地址是192.168.2.1,目标端口号是80端口。
[root@localhost ~]# iptables -A INPUT -s 192.168.2.1 -p tcp --dport 80 -j DROP
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP tcp -- 192.168.2.1 anywhere tcp dpt:http
例6:我不想开放我的其他端口,但我要在我的电脑上启用http服务,并对外服务
案例分析:防火墙的规则匹配方式为首行配置制,也就是该当收到数据包后,进行规则表达式匹配。当第一行规则满足条件后,就不再往下进行匹配了,
所以如果我们把包含范围比较大的规则写在前面,则范围小的规则将不再有机会匹配!!!
如:我们在第一行写了一个拒绝所有客户端访问本地主机,在第二行以后再添加允许192.168.10.2访问本地主机,则无法匹配了。
总结:在设置规则时我们应该先制定匹配范围最小的规则
再制定匹配范围大的规则
操作如下:
[root@localhost ~]# iptables -D INPUT 1 从链中删除了第一行的规则
[root@localhost ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp -j DROP
[root@localhost ~]# iptables -A INPUT -p udp -j DROP
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere anywhere tcp dpt:http
DROP tcp -- anywhere anywhere
DROP udp -- anywhere anywhere
例7:拒绝192.168.1.1访问文件服务
案例分析:在配置规则时有些服务是多端口的,我们要指定关键端口,或配置相关的所有端口,有些服务是在TCP协议和UDP协议中都有端口的,我们要指定到,才能有效的进行控制
如以下操作中, samba服务本身有两个端口号,139和445,一个负责传输文件,一个负责连接验证。
nfs服务在tcp和udp中的端口号都是2049.
[root@localhost ~]# iptables -t filter -F
[root@localhost ~]# iptables -t filter -L
# 拒绝samba
[root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 139 -s 192.168.1.1 -j DROP
[root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 445 -s 192.168.1.1 -j DROP
# 拒绝nfs
[root@localhost ~]# iptables -t filter -A INPUT -p tcp --dport 2049 -s 192.168.1.1 -j DROP
[root@localhost ~]# iptables -t filter -A INPUT -p udp --dport 2049 -s 192.168.1.1 -j DROP
[root@localhost ~]# iptables -L
例8:只允许192.168.2.1-192.168.2.10之间的主机访问httpd服务器192.168.2.2(无亲测)
[root@localhost ~]# iptables -t filter -A INPUT -m iprange --src-range 192.168.2.1-192.168.2.10 -d 192.168.2.2 -p tcp --dport 80 -j ACCEPT
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp -- anywhere www.baidu.com source IP range 192.168.2.1-192.168.2.10 tcp dpt:http
firewalld预定义的网络区域
所有区域的通行规则是:允许任何数据发出,拒绝任何数据传入,除指定类型的数据流量【预定义的服务】
firewalld默认创建了9个安全区域
分为两大类
第一类通行区域
,默认限定允许通行什么类型的数据。
第二类拒绝区域
,什么数据都不允许通行的区域。
Trusted:信任,相信 public:公共的 work:工作 internal:内部的,里面的 external:外部的,外部 dmz:非军事化区 block:阻碍,堵塞
☑ trusted 信任区域:可接受所有的网络连接
☑public 公共区域:除非与传出流量相关或与ssh或dhcpv6-client预定义服务匹配,否则拒绝流量传入
应用场景:在公共区域内不能相信网络内的其他计算机,不会对计算机造成危害。只能接受经过选择的连接!并且该区域是新添加网络接口的默认区域
☑ work 工作区域
除非与传出流量相关或ssh ipp-client dhcp6-client预定义服务匹配否则拒绝流量传入。
应用场景:用于工作区 相信网络内的其他计算机不会危害计算机 仅接收经过选择的连接
☑ home 家庭区域
除非与传出流量相关 或ssh ipp-client mdns samba-clientdhcpv6-client 预定义服务匹配 否则拒绝流量传入 。
应用场景:用于家庭网络 信任网络内的其他计算机不会危害计算机 仅接收经过选择的连接
☑ internal 内部区域
除非与传出流量相关 或ssh ipp-client mdns samba-client dhcpv6-client预定义服务匹配否则拒绝流量传入
应用场景:用于内部网络 信任网络内的其他计算机不会危害计算机 仅接收经过选择的连接
☑ external 外部区域
除非与传出流量相关 或与ssh预定义服务匹配,否则拒绝流量传入。
应用场景:通过次区域转发的ipv4传出流量将进行地址伪装 可用于为路由器启用了伪装功能的外部网络
☑ dmz 隔离区域也称为非军事区域
除非与传出的流量相关 或与ssh预定义服务匹配,否则拒绝流量传入
☑ block 限制区域
除非与传出流量相关 ,否则拒绝所有传入流量drop。并且不产生包含ICMP(internet control message protocol 互联网控制报文协议)的错误响应
☑ drop:丢弃区域,许流量传出,拒绝所有流量传入,并且不产生ICMP错误响应
不同的区域之间的差异是其“对待数据包”的默认行为不同,firewalld的默认区域为public
firewalld特点
1.増加了网络区域安全设置,网络区域中可以放入接口,不同的区域设置了不同的安全级别。
2.支持ipv4和ipv6两种策略表以及以太网桥
3.支持服务或应用程序直接添加规则接口
4.支持两种配置模式:运行配置,永久配置
firewalld的配置文件以xml格式为主(主配置文件firewalld.conf例外),他们有两个存储位
1、/etc/firewalld/
2、/usr/lib/firewalld/
使用时的规则是这样的:当需要一个文件时firewalld会首先到第一个目录中去查找,如果可以找到,那么就直接使用,否则会继续到第二个目录中查找。
firewalld的这种配置文件结构的主要作用是这样的:在第二个目录中存放的是firewalld给提供的通用配置文件,如果我们想修改配置, 那么可以copy一份到第一个目录中,然后再进行修改。这么做有两个好处:首先我们日后可以非常清晰地看到都有哪些文件是我们自己创建或者修改过的,其次,如果想恢复firewalld给提供的默认配置,只需要将自己在第一个目录中的配置文件删除即可,非常简单,而不需要像其他很多软件那样在修改之前还 得先备份一下,而且时间长了还有可能忘掉之前备份的是什么版本。(主要是services目录下的区域文件)
firewalld相关文件
(1)防火墙内置支持的服务路径:/usr/lib/firewalld/services/ 格式:服务名.html
(2)默认区域配置文件:/etc/firewalld/zones/ 默认为public
(3)默认防火墙主配置文件:/etc/firewalld/firewalld.conf
(4)预定义网络区域存储位置:/usr/lib/firewalld/zones/
firewalld运行规则
1、数据包的处理方式
✔ iptables防火墙:
输入数据: PREROUTING—INPUT
输出数据: OUTPUT–POSTROUTING
转发数据: PREROUTING-FORWARD-POSTROUTIN
✔ firewalld防火墙:
firewalld的数据机制为“处理收到的数据包”
1.若接口加入到指定的安全区域,数据包中的源地址首先匹配特定区域,如果满足规则,则执行数据包处理动作。
2.若接口未加入到指定的安全区域。数据包中的源地址则无法匹配指定区域规则,则使用接口的本地区域规则进行数据包处理动作。
3.数据包的源地址无法匹配接口规则时,则使用默认区域规则处理数据包
2、firewalld规则配置
firewalld图形化界面:firewall-config
命令行界面:firewall-cmd 选项 规则语句
firewalld配置命令
选项
1-1、查看类选项
// 查看所有区域名称
firewall-cmd --get-zones
// 查看支持的服务
firewall-cmd --get-services
// 查看支持的ICMP协议类型
firewall-cmd --get-icmptypes
// 查看默认区域
firewall-cmd --get-default-zone
// 查看活动区域
firewall-cmd --get-active-zones
// 查看指定区域信息
firewall-cmd --zone=区域名 --list-all (省去--zone默认区域为public)
firewall-cmd --zone=home --list-all
显示的信息说明:
home (active) #区域名称及状态(active活动状态)
target: default #匹配默认规则
icmp-block-inversion: no #未启用ICMP消息过滤
interfaces: ens33 #当前连接网络接口
sources: #源地址规则
services: dhcpv6-client mdns samba-client ssh #允许访问服务
ports: #允许访问的端口
protocols: #允许访问的协议
masquerade: no #地址伪装未启用
forward-ports: #端口转换
sourceports: #源端口号
icmp-blocks: #icmp消息过滤类型
rich rules: #富语言
// 查看指定端口绑定的区域
firewall-cmd --get-zone-of-interface=端口名称(例:ens33)
// 查看所有区域信息
firewall-cmd --list-all-zones
1-2、区域配置类选项
--zone=区域名 指定配置区域
--add-interface=网络接口名 添加接口
1-2.1)指定默认区域
firewall-cmd --set-default-zone=区域名(例:external)
1-2.2)在指定的区域添加接口
firewall-cmd --zone=区域名 --add-interface=端口名称 一个网卡接口只能加入一个安全区域,以最后加入的区域为准。而一个安全区域能够添加多个网卡接口。
例:
firewall-cmd --zone=internal --add-interface=ens37
1-2.3)从指定区域删除接口(删除的接口会自动添加到默认区域)
firewall-cmd --zone=区域名 --remove-interface=端口名称
例:
firewall-cmd --zone=internal --remove-interface=ens37
1-2.4)更改接口的绑定区域
firewall-cmd --zone=区域名 --change-interface=端口名称
例:
firewall-cmd --zone=internal --change-interface=ens37
1-2.5)在区域中添加服务
firewall-cmd --zone=区域名 --add-service=服务名 //可以让区域接收服务访问请求。 注意:每条语句只能添加一个服务
例:
firewall-cmd --zone=external --add-service=https
从区域中删除服务
firewall-cmd --zone=区域名 --remove-service=服务名
例:
firewall-cmd --zone=external --remove-service=https
1-2.6)在区域中添加端口号
firewall-cmd --zone=区域名 --add-port=端口号/协议类型 //添加TCP或UDP协议中的端口号!!!为指定区域设置允许访问的某个/某段端口号(包括协议名)
例:
firewall-cmd --zone=external --add-port=12345/tcp
删除指定区域已设置的允许访问的端口号(包括协议名):--remove-port ***端口号可以是个范围:--add-port=100-200/tcp***
1-2.7)添加拒绝的ICMP数据包类型
echo-request:icmp请求
echo-reply :icmp应答
firewall-cmd --zone=区域名 --add-icmp-block=echo-request ICMP类型(echo-request),省略--zone=<zone>时表示对默认区域操作
例:
firewall-cmd --zone=external --add-icmp-block=echo-request 移除拒绝的ICMP数据包请求
删除指定区域已设置的拒绝访问的某项ICMP类型,省略--zone=<zone>时表示对默认区域操作
[--zone=<zone>] --remove-icmp-block=<icmptype>
firewall-cmd --zone=dmz --remove-icmp-block=echo-request
1-2.8)查看指定区域内允许访问的服务
firewall-cmd --zone=区域名 --list-services
例:
firewall-cmd --zone=external --list-services
1-2.9)查看指定区域内允许访问的端口列表
firewall-cmd --zone=区域名 --list-ports
例:
firewall-cmd --zone=external --list-ports
1-2.10)查看拒绝的ICMP数据包类型
firewall-cmd --zone=区域名 --list-icmp-blocks
例:
firewall-cmd --zone=external --list-icmp-blocks
重点:配置模式
2-1)重新加载防火墙,激活永久配置(简单理解:只有在添加防火墙规则时,才需要重新加载防火墙)
firewall-cmd --reload 读取firewalld的配置信息,加载配置规则。相当于重启服务,重新读取配置。
2-2)永久配置
--permanent
2-3)把运行配置保存到永久配置
--runtime-to-permanent permanent:永久的 runtime:运行时间 reload:重新加载
注意:在输入规则时,不写--permanent选项,规则是临时生效的,重新启动服务,重启系统,重新加载配置都会丢失以添加的规则。一般使用临时规则的方式进行测试,功能实现后,再添加--permanent选项设置为永久生效。
部署
内网客户端----------防火墙------------外网客户端
|
内网网站服务器
实验要求
防火墙网关服务器
ens33:100.1.1.10,为公网地址,分配external(外部)
ens37:192.168.1.1,为内网地址,分配trusted(内部信任区域)
ens38:192.168.2.1,为dmz地址,分配dmz(非军事)连接http
1、网站服务器和网关服务器均通过SSH来远程管理,为了安全,将SSH的端口改为12345
2、网站服务器开启https,过滤加密的http流量
3、网站服务器拒绝ping
步骤
1、添加三块网卡
ens33→vmnet1 ens37→vmnet2 ens38→vmnet3
cd /etc/sysconfig/network-scripts/
cp ifcfg-ens33 ifcfg-ens37
cp ifcfg-ens33 ifcfg-ens38
vim ifcfg-ens33 100.1.1.10
vim ifcfg-ens37 192.168.1.1 #删除UUID
vim ifcfg-ens38 192.168.2.1 #删除UUID
systemctl restart network
2、配置
配置外网服务器ip:100.1.1.100→vmnet1
配置内网服务器ip:192.168.1.10→vmnet2 网关:192.168.1.1
配置web网服务器ip:192.168.2.10→vmnet3 网关:192.168.2.1
3、在网关服务器上开启路由转发功能
vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
sysctl -p
4、配置web服务器(192.168.2.10)
yum -y install httpd mod_ssl(不要使用rpm安装httpd)
systemctl enable httpd
systemctl restart httpd
# 建立测试页
vim /var/www/html/index.html
<h1> qwertyuiop!!! </h1>
firefox 127.0.0.1
# 更改ssh监听地址,并重启ssh服务
vim /etc/ssh/sshd_config
Port 12345
setenforce 0
systemctl restart sshd
# 设置防火墙:(web服务器)
systemctl status firewalld //需要running状态(中继服务器同理)
systemctl start firewalld
systemctl enable firewalld
# 设置默认区域为dmz
firewall-cmd --set-default-zone=dmz
firewall-cmd --get-default-zone
# 在dmz区域中添加https服务和ssh的tcp12345端口
firewall-cmd --zone=dmz --add-service=https --permanent
firewall-cmd --zone=dmz --add-port=12345/tcp --permanent
# 禁止ping
firewall-cmd --add-icmp-block=echo-request --zone=dmz --permanent
firewall-cmd --zone=dmz --list-icmp-blocks
# 因为ssh已经更改端口,所以删除预定义的ssh
firewall-cmd --zone=dmz --remove-service=ssh --permanent
# 重新加载
firewall-cmd --reload //重新加载防火墙后,规则才会生效
# 查看:
[root@localhost ~]# firewall-cmd --list-all --zone=dmz
dmz (active)
target: default
icmp-block-inversion: no
interfaces: ens33
sources:
services: https
ports: 12345/tcp
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks: echo-request
rich rules:
5、在网关服务器上设置防火墙
firewall-cmd --state //需要running状态
# 设置默认区域
firewall-cmd --set-default-zone=external
# 将ens37配置到trusted区域,将ens38配置到dmz区域
[root@localhost ~]# firewall-cmd --change-interface=ens37 --zone=trusted
The interface is under control of NetworkManager, setting zone to 'trusted'.
success
[root@localhost ~]# firewall-cmd --change-interface=ens38 --zone=dmz
The interface is under control of NetworkManager, setting zone to 'dmz'.
success
[root@localhost ~]# firewall-cmd --get-active-zones
dmz
interfaces: ens38
external
interfaces: ens33
trusted
interfaces: ens37
# 验证:
用内网192.168.1.10去访问firefox https://192.168.2.10 添加例外
6、在网关服务器上设置
# 更改ssh端口,并重启
vim /etc/ssh/sshd_config
Port 12345
setenforce 0
systemctl restart sshd
# 配置external区域添加TCP的12345端口
firewall-cmd --zone=external --add-port=12345/tcp --permanent
# 移除ssh服务
firewall-cmd --zone=external --remove-service=ssh --permanent
# 禁止ping
firewall-cmd --zone=external --add-icmp-block=echo-request --permanent
# 重新加载
firewall-cmd --reload
7、验证
外网100.1.1.100去ssh网关100.1.1.10(DMZ区域将没法远程登录)
[root@localhost ~]# ssh -p 12345 100.1.1.10
The authenticity of host '[100.1.1.10]:12345 ([100.1.1.10]:12345)' can't be established.
ECDSA key fingerprint is d7:2f:c9:2c:43:08:b4:ad:e2:9e:71:f0:c9:03:8e:7b.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[100.1.1.10]:12345' (ECDSA) to the list of known hosts.
[email protected]'s password: (123.com)
Last login: Tue Oct 23 20:36:02 2018
[root@lala ~]# exit
内网192.168.1.10去ssh服务器web 192.168.2.10
[root@localhost ~]# ssh -p 12345 192.168.2.10
The authenticity of host '[192.168.2.10]:12345 ([192.168.2.10]:12345)' can't be established.
ECDSA key fingerprint is d0:ce:ad:4d:25:01:4c:38:ba:19:f3:e2:96:22:47:bf.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '[192.168.2.10]:12345' (ECDSA) to the list of known hosts.
[email protected]'s password:
Last login: Sun Dec 9 05:37:22 2018
[root@localhost ~]# ssh -p 12345 192.168.1.1
iptables和firewalld的区别
firewalld 与 iptables 都是 linux 中防火墙的管理程序,但其实其角色主要为对于防火墙策略的管理,真正的防火墙执行者是位于内核中的netfilter
1,firewalld可以动态修改单条规则,动态管理规则集,允许更新规则而不破坏现有会话和连接。而iptables,在修改了规则后必须得全部刷新才可以生效;
2,firewalld使用区域和服务而不是链式规则;
3,firewalld默认是拒绝的,需要设置以后才能放行。而iptables默认是允许的,需要拒绝的才去限制;
4,firewalld自身并不具备防火墙的功能,而是和iptables一样需要通过内核的netfilter来实现。也就是说,firewalld和iptables一样,它们的作用都用于维护规则,而真正使用规则干活的是内核的netfilter。只不过firewalld和iptables的结果以及使用方法不一样!
5,docker与firewalld、iptables的关系
1)docker安装完成后,会自动接管iptables或者firewalld,在docker run的时候,会自动往iptables里加入规则;所以当iptables重启后会丢失,只有再重启docker就好了的原因。
2)当使用Systemd 的时候, firewalld 会在 Docker 之前启动,但是如果你在 Docker 启动之后再启动 或者重启 firewalld ,就需要重启 Docker 进程了!
实验所需数据脚本
#!/bin/bash
echo 客户机通用配置IP地址
setenforce 0
mask=255.255.255.0
read -p "输入网卡接口名称:" ens
read -p "输入IP地址:" ip
echo -e "\033[33m默认掩码为255.255.255.0\033[0m"
read -p "输入网关地址:" route
ifc="/etc/sysconfig/network-scripts/ifcfg-"
echo "DEVICE=$ens" > $ifc$ens
echo "TYPE=Ethernet" >> $ifc$ens
echo "BOOTPROTO=static" >> $ifc$ens
echo "ONBOOT=yes" >> $ifc$ens
echo "IPADDR=$ip" >> $ifc$ens
echo "NETMASK=$mask" >> $ifc$ens
echo "GATEWAY=$route" >> $ifc$ens
systemctl restart network
if [ $? -eq 0 ];then
echo -e " 网络配置 \033[32m配置成功 \033[0m "
else
echo -e " 网络配置 \033[31m配置失败 \033[0m "
fi
systemctl start firewalld &>>/1.log
if [ $? -eq 0 ];then
echo -e " 防火墙 \033[32m 关闭成功 \033[0m "
else
echo -e " 防火墙 \033[31m 关闭失败 \033[0m "
fi
echo +++++++++++++++++++++++++++++++
#网关服务器配置
echo 开启路由转发功能
echo "net.ipv4.ip_forward = 1" >>/etc/sysctl.conf
sysctl -p
echo #######################################
#web服务器器配置
###########搭建YUM仓库##########
echo -e "\033[34m正在搭建yum源中...\033[0m"
rm -rf /etc/yum.repos.d/*
echo "[local]" >> /etc/yum.repos.d/local.repo
echo "name=local" >> /etc/yum.repos.d/local.repo
echo "baseurl=file:///media" >> /etc/yum.repos.d/local.repo
echo "enable=1" >> /etc/yum.repos.d/local.repo
echo "gpgcheck=0" >> /etc/yum.repos.d/local.repo
echo -e "\033[32mYUM源搭建完毕\033[0m"
printf "\033[1;31;40m正在配置http服务\n\033[0m"
mount /dev/cdrom /media &>/1.log
yum -y install httpd mod_ssl &>>/1.log
echo zhz666 >>/var/www/html/index.html
systemctl start httpd &>/1.txt
if [ $? = 0 ]
then
printf "\033[1;32;40m启动http服务成功\n\033[0m"
else
printf "\033[1;31;40m启动http服务失败\n\033[0m"
fi
curl 127.0.0.1
sed -i 's/#Port 22/Port 12345/' /etc/ssh/sshd_config
systemctl restart sshd
if [ $? -eq 0 ];then
echo -e " ssh服务 \033[32m 重启成功 \033[0m "
else
echo -e " ssh服务 \033[31m 重启失败 \033[0m "
fi
systemctl start firewalld &>>/1.log
if [ $? -eq 0 ];then
echo -e " 防火墙 \033[32m 重启成功 \033[0m "
else
echo -e " 防火墙 \033[31m 重启失败 \033[0m "
fi
firewall-cmd --set-default-zone=dmz #设置区域为DMZ
#在dmz区域中添加https服务和ssh的tcp12345端口
firewall-cmd --zone=dmz --add-service=https --permanent
firewall-cmd --zone=dmz --add-port=12345/tcp --permanent
#禁止ping
firewall-cmd --add-icmp-block=echo-request --zone=dmz --permanent
#因为ssh已经更改端口,所以删除预定义的ssh
firewall-cmd --zone=dmz --remove-service=ssh --permanent
#重新加载 //重新加载防火墙后,规则才会生效
firewall-cmd --reload
echo #######################################
#在网关服务器上设置
systemctl restart firewalld &>>/1.log
if [ $? -eq 0 ];then
echo -e " 防火墙 \033[32m 重启成功 \033[0m "
else
echo -e " 防火墙 \033[31m 重启失败 \033[0m "
fi
#设置默认区域
firewall-cmd --set-default-zone=external &>>/1.log
#将ens33配置到trusted区域,将ens37配置到dmz区域
firewall-cmd --change-interface=ens33 --zone=trusted
firewall-cmd --change-interface=ens37 --zone=dmz
firewall-cmd --get-active-zones
<<QWER
验证:
用内网192.168.1.2去访问firefox https://192.168.2.2 添加例外
QWER
sed -i 's/#Port 22/Port 12345/' /etc/ssh/sshd_config
systemctl restart sshd
if [ $? -eq 0 ];then
echo -e " ssh服务 \033[32m 重启成功 \033[0m "
else
echo -e " ssh服务 \033[31m 重启失败 \033[0m "
fi
#配置external区域添加TCP的12345端口
firewall-cmd --zone=external --add-port=12345/tcp --permanent
#移除ssh服务
firewall-cmd --zone=external --remove-service=ssh --permanent
#禁止ping
firewall-cmd --zone=external --add-icmp-block=echo-request --permanent
#重新加载
firewall-cmd --reload
printf "\033[1;32;40m网关服务器到此配置完毕\n\033[0m"
echo 我的职务已经完成了,接下来就是你的表演了
The person who can clean up the mess of life can definitely make a comeback!