防火墙(Firewall)
防火墙作用
在计算机领域,防火墙是用于保护信息安全的设备,其会依照用户定义的规则,允许或限制数据的传输。
-
用于保护内网安全的一种设备 -
依据规则进行防护 -
用户定义规则 -
允许或拒绝外部用户访问
防火墙分类
-
逻辑上划分,防火墙可以大体分为主机防火墙和网络防火墙 主机防火墙:针对于单个主机进行防护 网络防火墙:针对网络进行防护,处于网络边缘,防火墙背后是本地局域网 网络防火墙主外(服务集体),主机防火墙主内(服务个人) -
物理上划分,防火墙可分为硬件防火墙和软件防火墙 硬件防火墙:在硬件级别实现防火墙功能,另一部分基于软件实现,其性能高,硬件成本高 软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,其性能相较于硬件防火墙低,成本较低,对于Linux系统已自带,直接使用即可
防火墙性能
硬件防火墙
硬件防火墙定义
硬件防火墙是指把具备配置数据包通过规则的软件嵌入硬件设备中,为网络提供安全防护的硬件设备。多见于网络边缘。
硬件防火墙作用
硬件防火墙品牌
-
cisco 思科ASA -
华为 -
天融信
软件防火墙
软件防火墙是单独使用具备配置数据包通过规则的软件来实现数据包过滤。多见于单主机系统或个人计算机。
扩展:Web应用防火墙(WAF)
Web应用防火墙是对web防护(网页保护)的安全防护设备(软件),主要用于截获所有HTTP数据或仅仅满足某些规则的会话。多见于云平台中。
硬件防火墙与软件防火墙比较
硬件防火墙有独立的硬件设备,运算效率较高,价格略高,可为计算机网络提供安全防护。
软件防火墙必须部署在主机系统之上,相较于硬件防火墙运算效率低,在一定程度上会影响到主机系统性能,一般用于单机系统或个人计算机中,不直接用于计算机网络中。
iptables
iptables是什么?
netfilter/iptables功能
netfilter/iptables可简称为iptables,为Linux平台下的包过滤防火墙,是开源的,内核自带的,可以代替成本较高的
-
企业级硬件防火墙,能够实现如下功能: -
数据包过滤,即防火墙 -
数据包重定向,即转发 -
网络地址转换,即可NAT
注:
平常我们使用iptables并不是防火墙的“服务”,而服务是由内核提供的。
iptables概念
iptables工作依据------规则(rules)
iptables是按照规则(rules)来办事的,而规则就是运维人员所定义的条件;规则一般定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。
规则存储在内核空间的数据包过滤表中,这些规则分别指定了源地址、目的地址,传输协议(TCP、UDP、ICMP)和服务类型(HTTP、FTP)等。
当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,比如放行(ACCEPT)、拒绝(REJECT)、 丢弃(DROP)等
配置防火墙主要工作就是对iptables规则进行添加、修改、删除等
iptables中链的概念
举例说明:
当客户端访问服务器端的web服务时,客户端发送访问请求报文至网卡,而tcp/ip协议栈是属于内核的一部分,所以,客户端的请求报文会通过内核的TCP协议传输到用户空间的web服务,而客户端报文的目标地址为web服务器所监听的套接字(ip:port)上,当web服务器响应客户端请求时,web服务所回应的响应报文的目标地址为客户端地址,我们说过,netfilter才是真正的防火墙,属于内核的一部分,所以,我们要想让netfilter起到作用,我们就需要在内核中设置“关口”,所以进出的数据报文都要通过这些关口,经检查,符合放行条件的准允放行,符合阻拦条件的则被阻止,于是就出现了input和output关口,然而在iptables中我们把关口叫做“链”。
上面的举例中,如果客户端发到本机的报文中包含的服务器地址并不是本机,而是其他服务器,此时本机就应该能够进行转发,那么这个转发就是本机内核所支持的IP_FORWARD功能,此时我们的主机类似于路由器功能,所以我们会看到在iptables中,所谓的关口并只有上面所提到的input及output这两个,应该还有“路由前”,“转发”,“路由后”, 它们所对应的英文名称分别为“PREROUTING”,“FORWARD”,“POSTROUTING”,这就是我们说到的 5 链。
通过上图可以看出,当我们在本地启动了防火墙功能时,数据报文需要经过以上关口,根据各报文情况,各报名经常的“链”可能不同,如果报文目标地址是本机,则会经常input链发往本机用户空间,如果报文目标不是本机,则会直接 在内核空间中经常forward链和postrouting链转发出去。
有的时候我们也经常听到人们在称呼input为“规则链”,这又是怎么回事呢?我们知道,防火墙的作用在于对经过的数据报文进行规则匹配,然后执行对应的“动作”,所以数据包经过这些关口时,必须匹配这个关口规则,但是关口规则 可能不止一条,可能会有很多,当我们把众多规则放在一个关口上时,所有的数据包经常都要进行匹配,那么就形成了一个要匹配的规则链条,因此我们也把“链”称作“规则链”。
-
INPUT:处理入站数据包 -
OUTPUT:处理出站数据包 -
FORWARD:处理转发数据包(主要是将数据包转发至本机其它网卡)当数据报文经过本机时,网卡接收数据报文至缓冲区,内核读取报文ip首部,发现报文不是送到本机时(目的ip不是本机),由内核直接送到forward链做匹配,匹配之后若符合forward的规则,再经由postrouting送往下一跳或目的主机。 -
PREROUTING:在进行路由选择前处理数据包,修改到达防火墙数据包的目的IP地址,用于判断目标主机 -
POSTROUTING:在进行路由选择后处理数据包,修改要离开防火墙数据包的源IP地址,判断经由哪一接口送往下一跳
iptables中表的概念
每个“规则链”上都设置了一串规则,这样的话,我们就可以把不同的“规则链”组合成能够完成某一特定功能集合分类,而这个集合分类我们就称为表,iptables中共有 5 张表,学习iptables需要搞明白每种表的作用。
-
filter: 过滤功能,确定是否放行该数据包,属于真正防火墙,内核模块:iptables_filter -
nat: 网络地址转换功能,修改数据包中的源、目标IP地址或端口;内核模块:iptable_nat -
mangle: 对数据包进行重新封装功能,为数据包设置标记;内核模块:iptable_mangle -
raw: 确定是否对数据包进行跟踪;内核模块:iptables_raw -
security:是否定义强制访问控制规则;后加上的
iptables中表链之间的关系
我们在应用防火墙时是以表为操作入口的,只要在相应的表中的规则链上添加规则即可实现某一功能。那么我们就应 该知道哪张表包括哪些规则链,然后在规则链上操作即可。
-
filter表可以使用哪些链定义规则:INPUT,FORWARD,OUTPUT -
nat表中可以使用哪些链定义规则:PREROUTING,OUTPUT ,POSTROUTING,INPUT -
mangle 表中可以使用哪些链定义规则:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING -
raw表中可以使用哪些链定义规则:PREROUTING,OUTPUT
iptables中表的优先级
raw-mangle-nat-filter(由高至低)
数据包流经iptables流程
iptables规则匹配及动作
规则:根据指定的匹配条件来尝试匹配每个流经此处的数据包,匹配成功,则由规则指定的处理动作进行处理。
规则是由匹配条件和动作组成的,那么规则是什么呢?
举例说明:
两个同学,一个白头发,一个黑头发,同时进教室,而进教室的条件是只有黑头发可以进入,白头发拒绝进入,黑头 发和白头发就是匹配条件,而可以进入和拒绝进入就是动作。
iptables规则匹配条件分类
基本匹配条件:
源地址,目标地址,源端口,目标端口等
基本匹配使用选项及功能
-p 指定规则协议,tcp udp icmp all
-s 指定数据包的源地址,ip hostname
-d 指定目的地址
-i 输入接口
-o 输出接口
! 取反
基本匹配的特点是:无需加载扩展模块,匹配规则生效
扩展匹配条件:
扩展匹配又分为显示匹配和隐式匹配。
扩展匹配的特点是:需要加载扩展模块,匹配规则方可生效。
隐式匹配的特点:使用-p选项指明协议时,无需再同时使用-m选项指明扩展模块以及不需要手动加载扩展模块;
显示匹配的特点:必须使用-m选项指明要调用的扩展模块的扩展机制以及需要手动加载扩展模块。
隐式匹配选项及功能
-p tcp
--sport 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围
--dport 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围
--tcp-flags mask comp 匹配报文中的tcp协议的标志位
-p udp
--sport 匹配报文源端口;可以给出多个端口,但只能是连续的端口范围
--dport 匹配报文目标端口;可以给出多个端口,但只能是连续的端口范围
--icmp-type
0 /0: echo reply 允许其他主机ping
8 /0:echo request 允许ping其他主机
显式匹配使用选项及功能
iptables -I INPUT -d 192 .168.2.10 -p tcp -m multiport --dports 22 ,80 -j ACCEPT
#在INPUT链中开放本机tcp 22,tcp80端口
iptables -I OUTPUT -s 192 .168.2.10 -p tcp -m multiport --sports 22 ,80 -j ACCEPT
#在OUTPUT链中开发源端口tcp 22,tcp
iptables -A INPUT -d 192 .168.2.10 -p tcp --dport 23 -m iprange --src-range
192 .168.2.11-192.168.2.21 -j ACCEPT
iptables -A OUTPUT -s 192 .168.2.10 -p tcp --sport 23 -m iprange --dst-range
192 .168.2.11-192.168.2.21 -j ACCEPT
iptables -A INPUT -d 192 .168.2.10 -p tcp --dport 901 -m time --weekdays
Mon,Tus,Wed,Thu,Fri --timestart 08 :00:00 --time-stop 18 :00:00 -j ACCEPT
iptables -A OUTPUT -s 192 .168.2.10 -p tcp --sport 901 -j ACCEPT
- string
字符串,对报文中的应用层数据做字符串模式匹配检测(通过算法实现)。
--algo {bm|kmp}:字符匹配查找时使用算法
--string "STRING": 要查找的字符串
--hex-string “HEX-STRING”: 要查找的字符,先编码成 16 进制格式
- connlimit
连接限制,根据每个客户端IP作并发连接数量限制。
--connlimit-upto n 连接数小于等于n时匹配
--connlimit-above n 连接数大于n时匹配
-
limit 报文速率限制 -
state 追踪本机上的请求和响应之间的数据报文的状态。状态有五种:INVALID, ESTABLISHED, NEW, RELATED, UNTRACKED.
--state state
NEW 新连接请求
ESTABLISHED 已建立的连接
INVALID 无法识别的连接
RELATED 相关联的连接,当前连接是一个新请求,但附属于某个已存在的连接
UNTRACKED 未追踪的连接
1 、对于进入的状态为ESTABLISHED都应该放行;
2 、对于出去的状态为ESTABLISHED都应该放行;
3 、严格检查进入的状态为NEW的连接;
4 、所有状态为INVALIED都应该拒绝;
iptables规则中动作
iptables规则中的动作常称为target,也分为基本动作和扩展动作。
iptables -t nat -A POSTROUTING -s 192 .168.10.0/24 -o eth1 -j SNAT --to-source 202 .12.10.
iptables -t nat -A PREROUTING -d 202 .12.10.100 -p tcp --dport 80 -j DNAT --to-
destination 192 .168.10.1
路由是按照目的地址进行路由选择的,因此,DNAT是在PREROUTING链上进行的,SNAT是在数据包发出的时候进行的,因此是在POSTROUTING链上进行的。
制定iptables规则策略
制定iptables规则思路
-
选择一张表,此表决定了数据报文处理的方式 -
选择一条链,此链决定了数据报文流经哪些位置 -
选择合适的条件,此条件决定了对数据报文做何种条件匹配 -
选择处理数据报文的动作,制定相应的防火墙规则
iptables基础语法结构
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
不指定表名时,默认表示filter表,不指定链名时,默认表示该表内所有链,除非设置规则链的默认策略,否则需要指定匹配条件。
iptables链管理方法
-N, --new-chain chain:新建一个自定义的规则链;
-X, --delete-chain [chain]:删除用户自定义的引用计数为 0 的空链;
-F, --flush [chain]:清空指定的规则链上的规则;
-E, --rename-chain old-chain new-chain:重命名链;
-Z, --zero [chain [rulenum]]:置零计数器;
注意:每个规则都有两个计数器
packets:被本规则所匹配到的所有报文的个数;
bytes:被本规则所匹配到的所有报文的大小之和;
-P, --policy chain target 制定链表的策略(ACCEPT|DROP|REJECT)
iptables规则管理
-A, --append chain rule-specification:追加新规则于指定链的尾部;
-I, --insert chain [rulenum] rule-specification:插入新规则于指定链的指定位置,默认为首部;
-R, --replace chain rulenum rule-specification:替换指定的规则为新的规则;
-D, --delete chain rulenum:根据规则编号删除规则;
-D, --delete chain rule-specification:根据规则本身删除规则;
iptables规则显示
-L, --list [chain]:列出规则;
-v, --verbose:详细信息;
-vv 更详细的信息
-n, --numeric:数字格式显示主机地址和端口号;
-x, --exact:显示计数器的精确值,而非圆整后的数据;
--line-numbers:列出规则时,显示其在链上的相应的编号;
-S, --list-rules [chain]:显示指定链的所有规则;
iptables应用
iptables-services安装
1 [root@localhost ~]
centos7系统中默认存在iptables命令,此命令仅为简单查询及操作命令,不包含配置文件,安装iptables-services后,将直接生成配置文件,便于配置保存。包含ipv4及ipv6。
[root@localhost ~]
1 [root@localhost ~]
1 [root@localhost ~]
1 [root@localhost ~]
1 [root@localhost ~]
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
#配置默认链策略
案例:白名单
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
案例:黑名单
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
案例:通过lo访问本机数据
[root@localhost ~]
[root@localhost ~]
案例:允许连接态产生衍生态
1 [root@localhost ~]
iptables filter表应用案例
案例 1 :
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
本机无法访问本机
例如:ping 127 .0.0.1
解决方法
[root@localhost ~]
本机无法访问其它主机
例如:ssh remote_host
解决方法
[root@localhost ~]
FTP无法访问
解决方法 1 :
[root@localhost ~]
[root@localhost ~]
pasv_min_port= 50000
pasv_max_port= 60000
[root@localhost ~]
解决方法 2 :使用连接追踪模块
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
IPTABLES_MODULES="nf_conntrack_ftp"
案例 2 :iptables标准流程
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
IPTABLES_MODULES="nf_conntrack_ftp"
案例 3 :扩展匹配
[root@localhost ~]
[root@localhost ~]
-j ACCEPT
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
Flags:SYN ACK FIN RST URG PSH ALL NONE
[root@localhost ~]
SYN,ACK,FIN,RST SYN --dport 80 -j ACCEPT
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
案例 4 :扩展动作
[root@localhost ~]
kern.* /var/log/kernel.log
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
当访问一个未开启的TCP端口时,应该返回一个带有RST标记的数据包
当访问一个未开启的UDP端口,结果返回port xxx unreachable
当访问一个开启的TCP端口,但被防火墙REJECT,结果返回port xxx unreachable
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
iptables nat表应用案例
[root@localhost ~]
net.ipv4.ip_forward = 1
[root@localhost ~]
1
[root@localhost ~]
[root@localhost ~]
0
案例 1 :实现内网主机上网功能
-
网络连接拓扑 -
实现拓扑 -
配置命令
[root@localhost ~]
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=486d5c6d-17ed-4a3f-baab-92d56d042796
DEVICE=ens33
ONBOOT=yes
IPADDR= 192 .168.1.2
PREFIX= 24
GATEWAY= 192 .168.1.1
[root@localhost ~]
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=4ac0aefc-628f-4461-ab59-636aae59965f
DEVICE=ens33
ONBOOT=yes
IPADDR= 192 .168.1.1
PREFIX= 24
[root@localhost ~]
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR= 192 .168.3.1
PREFIX= 24
[root@localhost ~]
net.ipv4.ip_forward = 1
[root@localhost ~]
net.ipv4.ip_forward = 1
[root@localhost ~]
SNAT --to-source 192.168.3.1
或
[root@localhost ~]
MASQUERADE
[root@localhost ~]
configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@localhost ~]
[root@localhost ~]
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0 .0.0.0/0 0 .0.0.0/0 state
RELATED,ESTABLISHED
ACCEPT icmp -- 0 .0.0.0/0 0 .0.0.0/0
ACCEPT all -- 0 .0.0.0/0 0 .0.0.0/0
ACCEPT tcp -- 0 .0.0.0/0 0 .0.0.0/0 state NEW tcp dpt:22
REJECT all -- 0 .0.0.0/0 0 .0.0.0/0 reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@localhost ~]
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
RETURN all -- 192 .168.122.0/24 224 .0.0.0/24
RETURN all -- 192 .168.122.0/24 255 .255.255.255
MASQUERADE tcp -- 192 .168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192 .168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE all -- 192 .168.122.0/24 !192.168.122.0/24
MASQUERADE all -- 192 .168.1.0/24 0 .0.0.0/0
- web服务器配置
在配置其它IP地址前,请先安装httpd服务,便于验证结果
[root@localhost ~]
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=bb300759-8c34-4e8a-b708-089b105425c3
DEVICE=ens33
ONBOOT=yes
IPADDR= 192.168.3.2
PREFIX= 24
GATEWAY= 192.168.3.1
1 [root@localhost ~]
- 在firewall主机或web服务器安装wireshark抓包验证
1 [root@localhost ~]
案例 2 :实现KVM虚拟机访问外部主机
路线:kvm_instance(192.168.122.0/24)—>192.168.122.1 virbr0(kvm虚拟机网关)ens33 192.168.2.10—>192.168.2.20(外部主机)
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
实验拓扑
[root@localhost ~]
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=486d5c6d-17ed-4a3f-baab-92d56d042796
DEVICE=ens33
ONBOOT=yes
IPADDR= 192 .168.1.2
PREFIX= 24
GATEWAY= 192 .168.1.1
[root@localhost ~]
[root@localhost ~]
dnat test
[root@localhost ~]
- firewall主机配置
[root@localhost ~]
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=4ac0aefc-628f-4461-ab59-636aae59965f
DEVICE=ens33
ONBOOT=yes
IPADDR= 192 .168.1.1
PREFIX= 24
[root@localhost ~]
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens37
DEVICE=ens37
ONBOOT=yes
IPADDR= 192 .168.3.1
PREFIX= 24
[root@localhost ~]
net.ipv4.ip_forward = 1
[root@localhost ~]
[root@localhost ~]
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 192.168.3.1 tcp dpt:80 to:192.168.1.2
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
RETURN all -- 192.168.122.0/24 224 .0.0.0/24
RETURN all -- 192.168.122.0/24 255 .255.255.255
MASQUERADE tcp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE udp -- 192.168.122.0/24 !192.168.122.0/24 masq ports: 1024-65535
MASQUERADE all -- 192.168.122.0/24 !192.168.122.0/24
MASQUERADE all -- 192.168.1.0/24 0 .0.0.0/0
[root@localhost ~]
TYPE=Ethernet
PROXY_METHOD=none
BROWSER_ONLY=no
BOOTPROTO=static
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
IPV6INIT=yes
IPV6_AUTOCONF=yes
IPV6_DEFROUTE=yes
IPV6_FAILURE_FATAL=no
IPV6_ADDR_GEN_MODE=stable-privacy
NAME=ens33
UUID=bb300759-8c34-4e8a-b708-089b105425c3
DEVICE=ens33
ONBOOT=yes
IPADDR= 192 .168.3.2
PREFIX= 24
GATEWAY= 192 .168.3.1
[root@localhost ~]
dnat test
案例 2 :让外部主机可以访问KVM虚拟机(内网主机) PREROUTING 路由之前
建议:内网主机能访问外部主机(例如基于SNAT方式)
路线:kvm_instance(192.168.122.0/24) <— 192.168.122.1 virbr0 ens33 192.168.2.10 <— 192.168.2.20 外部主机
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
思考:如果有两台内网服务器需要提供80/tcp服务,如何映射?
[root@localhost ~]
[root@localhost ~]
firewalld
Firewalld是什么?
FireWalld属于动态防火墙,是CentOS7系统中用于对netfilter内核模块用户空间管理工具。
FireWalld仅仅替代了iptables service部分,其底层还是使用iptables做为防火墙规则管理入口。
总结:
-
动态防火墙 -
用于管理netfilter用户空间的工具 -
调用了iptables命令
FireWalld中zone概念及作用
区域(zone)是firewalld预先准备好的防火墙策略集合,即可策略模板,用于可以根据不同的应用场景进行切换。
例如: 你有一台笔记本电脑,每天都要在公司办公室、咖啡厅和家使用。 我们来对场所进行安全性由高到低排序:家、公司办公室、咖啡厅。
我们希望为这台笔记本电脑指定如下防火墙策略规则: 在家中允许访问所有服务; 在公司办公室内仅允许访问文件共享服务; 在咖啡厅仅允许上网浏览。 在以往,我们需要频繁地手动设置防火墙策略规则,而现在只需要预设好区域集合, 随时都可以自动切换了,从而极大地提升了防火墙策略的应用效率。
FireWalld中zone分类
FireWalld不同区域之间的差异主要是每个区域对待数据包的默认行为不同
Firewalld默认共 9 个zone,分别为:
-
block(拒绝) -
dmz(非军事化) -
drop(丢弃) -
external(外部) -
home(家庭) -
internal(内部) -
public(公开) Firewalld默认区域 -
trusted(信任) -
work(工作区)
FireWalld文件
Firewalld文件分为两大类:
/usr/lib/firewalld/services:firewalld服务默认在此目录下定义了 70 多种服务,可以直接使用。
/usr/lib/firewalld/zones:区域配置文件
/etc/firewalld/zones:默认区域配置文件,配置文件中指定了编写完成的规则
firewalld文件作用:人性化管理规则;通过服务组织端口分组更加高效,如果一个服务使用若干网络端口,则服务的配置文件就相当于提供了到这些端口的规则管理的批量操作快捷方式。
Firewalld语法
命令语法:
firewall-cmd [--zone=zone] 动作 [--permanent]
如果不指定–zone选项,则为当前所在的默认区域,–permanent选项为是否将改动写入到区域配置文件中
Firewall的状态
[root@localhost ~]
running
[root@localhost ~]
success
[root@localhost ~]
success
[root@localhost ~]
FireWalld中动作
动作中查看操作
[root@localhost ~]
--get-icmptypes
--get-zones
--get-default-zone
--get-active-zones
--get-services
--list-services
--list-services --zone=home
--list-all
--list-all-zones
更改区域操作
[root@localhost ~]
--set-default-zone=work
新建规则
新建 --add
[root@localhost ~]
--add-interface=eth0
--add-port= 12222 /tcp --permanent
--add-port= 5000 -10000/tcp --permanent
--add-service=ftp --permanent
--add-source= 192 .168.1.1
--add-masquerade
删除规则
删除 --remove
[root@localhost ~]
--remove-service=http
--remove-interface=eth0
--remove-source= 192 .168.1.1
改变规则
改变 change
[root@localhost ~]
--change-interface=eth1
查询规则
查询 query
[root@localhost ~]
--query-masquerade
--query-interface=eth0
端口转发
端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定ip的话就默 认为本机,如果指定了ip却没指定端口,则默认使用来源端口。
注:以下部分可能需要 2 台主机完成。建议:最好先画图。
[root@localhost ~]
[root@localhost ~]
firewall-cmd --add-forwardport=port=80:proto=tcp:toaddr=192.168.2.20
[root@localhost ~]
port=port=80:proto=tcp:toaddr=192.168.2.20 --permanent
firewall-cmd --add-forward-port=port= 80 :proto=tcp:toaddr= 192 .168.2.20:toport= 8080
如果配置好端口转发之后不能用,可以检查下面两个问题:
Rich规则
当基本firewalld语法规则不能满足配置要求时,可以使用rich规则来完成更加复杂的功能。
Rich规则帮助
1 [root@localhost ~]
Rich规则选项
--add-rich-rule=’rule’
--remove-rich-rule=’rule’
--query-rich-rule=’rule’
--list-rich-rules
Rich规则案例
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
success
[root@localhost ~]
success
[root@localhost ~]
[root@localhost ~]
success
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
[root@localhost ~]
|