在计算机领域,防火墙是用于保护信息安全的设备,其会依照用户定义的规则,允许或限制数据的传输。
运维安全之Linux网络安全(iptables)_源地址" height="267" src="https://i-blog.csdnimg.cn/img_convert/e8b5f098a336fb50f845d19a3c103154.png" width="611" />
- 用于保护内网安全的一种设备
- 依据规则进行防护
- 用户定义规则
- 允许或拒绝外部用户访问
防火墙分类
逻辑上划分,防火墙可以大体分为主机防火墙和网络防火墙
主机防火墙:针对于单个主机进行防护
网络防火墙:针对网络进行防护,处于网络边缘,防火墙背后是本地局域网
网络防火墙主外(服务集体),主机防火墙主内(服务个人)
物理上划分,防火墙可分为硬件防火墙和软件防火墙
硬件防火墙:在硬件级别实现防火墙功能,另一部分基于软件实现,其性能高,硬件成本高
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,其性能相较于硬件防火墙低,成本较低,对于 Linux系统已自带,直接使用即可
防火墙性能
- 吞吐量
- 并发连接
- 新建连接
- 时延
- 抖动
硬件防火墙
运维安全之Linux网络安全(iptables)_源地址_02" height="488" src="https://i-blog.csdnimg.cn/img_convert/81562db6e7d8371cf3929715e065f951.png" width="741" />
软件防火墙
软件防火墙是单独使用具备配置数据包通过规则的软件来实现数据包过滤。多见于单主机系统或个人计算机。
Web应用防火墙(WAF)
Web应用防火墙是对web防护(网页保护)的安全防护设备(软件),主要用于截获所有HTTP数据或仅仅满足某些规则的 会话。多见于云平台中。
硬件防火墙和软件防火墙对比
硬件防火墙有独立的硬件设备,运算效率较高,价格略高,可为计算机网络提供安全防护。
软件防火墙必须部署在主机系统之上,相较于硬件防火墙运算效率低,在一定程度上会影响到主机系统性能,一般用 于单机系统或个人计算机中,不直接用于计算机网络中。
iptables
iptables是什么?
- iptables不是防火墙,是防火墙用户代理
- 用于把用户的安全设置添加到安全框架中
- 安全框架是防火墙
- 安全框架的名称为netfilter
- netfilter位于内核空间中,是Linux操作系统核心层内部的一个数据包处理模块
- iptables是用于在用户空间对内核空间的netfilter进行操作的命令行工具
- 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中我们把关口叫做“链”。
------------恢复内容开始------------
在计算机领域,防火墙是用于保护信息安全的设备,其会依照用户定义的规则,允许或限制数据的传输。
运维安全之Linux网络安全(iptables)_源地址" height="267" src="https://i-blog.csdnimg.cn/img_convert/e8b5f098a336fb50f845d19a3c103154.png" width="611" />
- 用于保护内网安全的一种设备
- 依据规则进行防护
- 用户定义规则
- 允许或拒绝外部用户访问
防火墙分类
逻辑上划分,防火墙可以大体分为主机防火墙和网络防火墙
主机防火墙:针对于单个主机进行防护
网络防火墙:针对网络进行防护,处于网络边缘,防火墙背后是本地局域网
网络防火墙主外(服务集体),主机防火墙主内(服务个人)
物理上划分,防火墙可分为硬件防火墙和软件防火墙
硬件防火墙:在硬件级别实现防火墙功能,另一部分基于软件实现,其性能高,硬件成本高
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,其性能相较于硬件防火墙低,成本较低,对于 Linux系统已自带,直接使用即可
防火墙性能
- 吞吐量
- 并发连接
- 新建连接
- 时延
- 抖动
硬件防火墙
运维安全之Linux网络安全(iptables)_源地址_02" height="488" src="https://i-blog.csdnimg.cn/img_convert/81562db6e7d8371cf3929715e065f951.png" width="741" />
软件防火墙
软件防火墙是单独使用具备配置数据包通过规则的软件来实现数据包过滤。多见于单主机系统或个人计算机。
Web应用防火墙(WAF)
Web应用防火墙是对web防护(网页保护)的安全防护设备(软件),主要用于截获所有HTTP数据或仅仅满足某些规则的 会话。多见于云平台中。
硬件防火墙和软件防火墙对比
硬件防火墙有独立的硬件设备,运算效率较高,价格略高,可为计算机网络提供安全防护。
软件防火墙必须部署在主机系统之上,相较于硬件防火墙运算效率低,在一定程度上会影响到主机系统性能,一般用 于单机系统或个人计算机中,不直接用于计算机网络中。
iptables
iptables是什么?
- iptables不是防火墙,是防火墙用户代理
- 用于把用户的安全设置添加到安全框架中
- 安全框架是防火墙
- 安全框架的名称为netfilter
- netfilter位于内核空间中,是Linux操作系统核心层内部的一个数据包处理模块
- iptables是用于在用户空间对内核空间的netfilter进行操作的命令行工具
- 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中我们把关口叫做“链”。
运维安全之Linux网络安全(iptables)_内网_05" height="442" src="https://i-blog.csdnimg.cn/img_convert/25ad412165505197cd1b3b9a764c5714.png" width="539" />
上面的举例中,如果客户端发到本机的报文中包含的服务器地址并不是本机,而是其他服务器,此时本机就应该能够
进行转发,那么这个转发就是本机内核所支持的IP_FORWARD功能,此时我们的主机类似于路由器功能,所以我们会
看到在iptables中,所谓的关口并只有上面所提到的input及output这两个,应该还有“路由前”,“转发”,“路由后”,
它们所对应的英文名称分别为“PREROUTING”,“FORWARD”,“POSTROUTING”,这就是我们说到的5链
INPUT
OUTPUT
PREROUTING
FORWARD
POSTROUTING
运维安全之Linux网络安全(iptables)_源地址_06" height="737" src="https://i-blog.csdnimg.cn/img_convert/6f9ccf5107659f2e88253983dc133c18.png" width="1206" />
通过上图可以看出,当我们在本地启动了防火墙功能时,数据报文需要经过以上关口,根据各报文情况,
各报名经常 的“链”可能不同,如果报文目标地址是本机,则会经常input链发往本机用户空间,如果报
文目标不是本机,则会直接 在内核空间中经常forward链和postrouting链转发出去。
所以,根据上图,我们能够想象出某些常用场景中,报文的流向:
到本机某进程的报文:PREROUTING --> INPUT
由本机转发的报文:PREROUTING --> FORWARD --> POSTROUTING
由本机的某进程发出报文(通常为响应报文):OUTPUT --> POSTROUTING
有的时候我们也经常听到人们在称呼input为“规则链”,这又是怎么回事呢?
我们知道,防火墙的作用在于对经过的数 据报文进行规则匹配,然后执行
对应的“动作”,所以数据包经过这些关口时,必须匹配这个关口规则,但是
关口规则 可能不止一条,可能会有很多,当我们把众多规则放在一个关口
上时,所有的数据包经常都要进行匹配,那么就形成 了一个要匹配的规则
链条,因此我们也把“链”称作“规则链”。
运维安全之Linux网络安全(iptables)_源地址_07" height="627" src="https://i-blog.csdnimg.cn/img_convert/6f8bff7fb94bb4bc5065f04c24a43706.png" width="819" />
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
运维安全之Linux网络安全(iptables)_数据_08" height="344" src="https://i-blog.csdnimg.cn/img_convert/5d174f36ef3b4739a6aba727df9a0d7d.png" width="649" />
iptables中表的优先级
raw-mangle-nat-filter(由高至低)
数据包经由iptables的流程
运维安全之Linux网络安全(iptables)_源地址_09" height="649" src="https://i-blog.csdnimg.cn/img_convert/41387c6f895d9be0407e94b555190e0d.png" width="1177" />
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其他主机
常用显示匹配选项及功能
multiport
多端口
#在INPUT链中开放本机tcp 22 80端口
iptables -t filter -I INPUT -d 192.168.1.146 -p tcp -m multiport --dports 22,80 -j ACCEPT
iprange
多IP地址
iptables -t filter -A INPUT -d 192.168.1.146 -p tcp -m iprange --src-range 192.168.1.1-192.168.1.100 -j ACCEPT
time
指定时间访问范围
iptables -t filter -I INPUT -m time --weekdays 1,2,3 --timestart 09:00:00 --timestop 18:00:00 -j ACCEPT
string
字符串,对报文中的应用层数据做字符串模式匹配检测(通过算法实现)。
--algo {bm|kmp}:字符匹配查找时使用算法
--string "STRING": 要查找的字符串
--hex-string “HEX-STRING”: 要查找的字符,先编码成16进制格式
#丢弃报文中包含字符OOXX的报文
iptables -t filter -I INPUT -m string --algo bm --string OOXX -j DROP
connlimit
连接限制,根据每个客户端IP作并发连接数量限制。
--connlimit-upto n 连接数小于等于n时匹配
--connlimit-above n 连接数大于n时匹配
#连接数大于3则丢弃
iptables -t filter -I INPUT -m connlimit --connlimit-above 3 -j DROP
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,也分为基本动作和扩展动作。
- ACCEPT:允许数据包通过
- DROP:直接丢弃数据包,不给任何回应信息
- REJECT:拒绝数据包通过,发送回应信息给客户
- SNAT:源地址转换
解释1:数据包从网卡发送出去的时候,把数据包中的源地址部分替换为指定的IP,接收方认为数据包的来 源是被替换的那个IP主机,返回响应时,也以被替换的IP地址进行
解释2:修改数据包源地址,当内网数据包到达防火墙后,防火墙会使用外部地址替换掉数据包的源IP地址 (目的IP地址不变),使网络内部主机能够与网络外部主机通信。
运维安全之Linux网络安全(iptables)_数据_10" height="338" src="https://i-blog.csdnimg.cn/img_convert/cdc506456f340a9fcb79e609270cd08c.png" width="824" />
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 202.12.10.100
- MASQUERADE:伪装,类似于SNAT,适用于动态的、临时会变的ip地址上,例如:家庭使用的宽带。 用发送数据的网卡上的IP来替换源IP,对于IP地址不固定场合使用
- DNAT:目标地址转换
解释1:数据包从网卡发出时,修改数据包中的目的IP,表现为你想访问A,但因网关做了DNAT,把所有 访问A的数据包中的目的IP地址全部修改为B,实际终访问的是B。
解释2:改变数据包目的地址,当防火墙收到来自外网的数据包后,会将该数据包的目的IP地址进行替换 (源IP地址不变),重新转发到内网的主机。
运维安全之Linux网络安全(iptables)_内网_11" height="381" src="https://i-blog.csdnimg.cn/img_convert/79b3619f58b32ac1375b2dee79d885d3.png" width="892" />
iptables -t nat -A PREROUTING -d 202.12.10.100 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.1
- REDIRECT:在本机做端口映射
- LOG:在/var/log/message文件中记录日志信息,然后将数据包传递给下一条规则。
注意:路由是按照目的地址进行路由选择的,因此,DNAT是在PREROUTING链上进行的,SNAT是在数据包发出的时 候进行的,因此是在POSTROUTING链上进行的。
制定iptables规则策略
黑名单 没有被拒绝的流量都可以通过,这种策略下管理员必须针对每一种新出现的攻击,制定新的规则,因此不推荐
白名单 没有被允许的流量都要拒绝,这种策略比较保守,根据需要,主机主机逐渐开放,目前一般都采用白名单策 略,推荐。
iptables基础语法结构
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]
不指定表名时,默认表示filter表,不指定链名时,默认表示该表内所有链,除非设置规则链的默认策略,否则 需要指定匹配条件。
运维安全之Linux网络安全(iptables)_源地址_12" height="603" src="https://i-blog.csdnimg.cn/img_convert/eef9cf39e90c42539389bc1e27ee70e9.png" width="1124" />
iptables-service安装
[root@localhost ~]# yum -y install iptables-services
设置开启
[root@localhost ~]# systemctl start iptables.service
[root@localhost ~]# systemctl enable iptables.service
保存规则
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables
重载规则
[root@localhost ~]#iptables-restore < /etc/sysconfig/iptables
基本配置
清除规则
iptables -F
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
#配置默认链策略
案例:白名单
[root@localhost ~]# iptables -t filter -F
[root@localhost ~]# iptables -P INPUT DROP
[root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport=22 -j ACCEPT
[root@localhost ~]# iptables -t filter -I INPUT -p tcp --dport=80 -j ACCEPT
注意:最好不要修改默认策略为DROP来设置白名单,可以使用-A在尾部追加一条拒绝所有,然后保证默认策略为ACCEPT,否则如果不小心使用-F清除了规则,默认策略为DROP则所有连接都无法生效包括ssh,如果是远程设置则无解,只能去机房了。
案例:黑名单
[root@localhost ~]# iptables -P INPUT ACCEPT
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t filter -A INPUT -s 192.168.2.20/24 -p tcp --dport 80 -j DROP
[root@localhost ~]# iptables -I INPUT -d 127.0.0.1 -p tcp --dport=9000 -i lo -j ACCE
案例
使用服务httpd,vsftp,ssh测试
安装服务
#yum -y install httpd vsftpd
启动
systemctl start httpd vsftpd
设置iptables规则
#清除
iptables -t filter -F
#开放对应端口
iptables -I INPUT -p tcp --dport 80 -j ACCEPT
iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
iptables -I INPUT -p tcp --dport 22 -j ACCEPT
#规则后加拒绝所有
iptables -A INPUT -j REJECT
存在问题
1,本机无法访问本机
#ping 127.0.0.1
#允许本机回环口访问本机
#iptables -I INPUT -i lo -j ACCEPT
,2,本机无法访问其他主机
例如:ssh remote_host curl remote_host
解决办法
iptables -t filter -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
3,FTP无法访问
解决办法1
[root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
[root@localhost ~]# vim /etc/vsftpd/vsftpd.conf
pasv_min_port=50000
pasv_max_port=60000
[root@localhost ~]# iptables -I INPUT -p tcp --dport 50000:60000 -j ACCEPT
解决办法2:使用连接追踪模块
[root@localhost ~]# iptables -I INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p tcp --dport 20:21 -j ACCEPT
[root@localhost ~]# modprobe nf_conntrack_ftp #临时方法,添加连接追踪模块
[root@localhost ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
#启动服务时加载
#针对数据端口连接时,将三次握手第一次状态由NEW识别为RELATED
第一种方法开启端口太多,建议使用第二种方法
案例2:iptables标准流程
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
[root@localhost ~]# iptables -A INPUT -i lo -j ACCEPT
[root@localhost ~]# iptables -A INPUT -s 192.168.1.0/24 -j ACCEPT #允许内网任何访问
[root@localhost ~]# iptables -A INPUT -p tcp --syn --dport 80 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --syn --dport 22 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -p tcp --syn --dport 21 -j ACCEPT
[root@localhost ~]# iptables -A INPUT -j REJECT
[root@localhost ~]# modprobe nf_conntrack_ftp
[root@localhost ~]# iptables-save > /etc/sysconfig/iptables
[root@localhost ~]# vim /etc/sysconfig/iptables-config
IPTABLES_MODULES="nf_conntrack_ftp"
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT为iptables防火墙标配,尽量优先且需要配置。
案例3:iptables扩展匹配
icmp
iptables -t filter -I INPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
iptables -t filter -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
iptables -A INPUT -j REJECT
作用:允许本机ping其他主机,不允许其他主机ping本机
运维安全之Linux网络安全(iptables)_内网_13" height="112" src="https://i-blog.csdnimg.cn/img_convert/b2e772d6d127bd13d21e414fd5dcf081.png" width="681" />
运维安全之Linux网络安全(iptables)_ip地址_14" height="168" src="https://i-blog.csdnimg.cn/img_convert/e0901104c472a5fce0def9678050103a.png" width="704" />
iprange 设置一组ip
iptables -t filter -I INPUT -p tcp -m iprange --src-range 192.168.1.200-192.168.1.250 -j DROP
multiport 设置多个不连续端口
iptables -t filter -I INPUT -p tcp -m multiport --dport 22,80,443 -j ACCEPT
-m tos 根据ip协议头部 type of service进行过滤
[root@localhost ~]# iptables -F
[root@localhost ~]# tcpdump -i eth0 -nn port 22 -vvv
#抓取远程主机访问本机的ssh数据包,观察TOS值
[root@localhost ~]# tcpdump -i eth0 -nn port 22 -vvv
#抓取远程从本机rsync或scp复制文件,观察TOS值
#ssh: tos 0x0 0x10
#scp: tos 0x0 0x8
#rsync: tos 0x0 0x8
#允许ssh登录
iptables -t filter -I INPUT -p tcp --dport 22 -m tos --tos 0x10 -j ACCEPT
#-m tcp 按TCP控制位进行匹配
Flags:SYN ACK FIN RST URG PSH ALL NONE
##--tcp-flags SYN,ACK,FIN,RST SYN 检查四个标记位,只有SYN标记位才匹配,即只允许三次握手中的第一次握手,等价于--syn
iptables -t filter -A INPUT -p tcp -m tcp --tcp-flags SYN,ACK,FIN,RST SYN --dport 80 -j ACCEPT
#-m comment 对规则进行备注说明
iptables -I INPUT -s 192.168.2.250 -m comment --comment "cloud host" -j REJECT
运维安全之Linux网络安全(iptables)_内网_15" height="279" src="https://i-blog.csdnimg.cn/img_convert/5c65d3a8254c2d35204980e43c6e4ac9.png" width="1437" />
#-m mark 使用mangle表的标记方法,配合mangle表使用
[root@localhost ~]# iptables -t filter -A INPUT -m mark 2 -j REJECT
案例4:扩展动作
-j LOG记录到日志中
修改日志配置文件设置日志存储位置
[root@node1 ~]# grep "kern*" /etc/rsyslog.conf
#$ModLoad imklog # reads kernel messages (the same are read from journald)
# Log all kernel messages to the console.
kern.* /var/log/kernel.log
重启
systemctl restart rsyslog
#记录日志打一个标签为ssh
iptables -t filter -A INPUT -p tcp --dport 22 -j LOG --log-prefix "ssh"
#会把所有相关ssh日志记录
iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
运维安全之Linux网络安全(iptables)_内网_16" height="213" src="https://i-blog.csdnimg.cn/img_convert/d005e88aba4a8bb0818537a6e67b16d1.png" width="1416" />
#-j MARK 进行标记,可在LVS调度器中应用
[root@node1 ~]# iptables -t mangle -A PREROUTING -s 192.168.1.147 -j MARK --set-mark 1
[root@node1 ~]# iptables -t mangle -A PREROUTING -s 192.168.1.102 -j MARK --set-mark 2
[root@node1 ~]# iptables -t filter -A INPUT -m mark --mark 1 -j ACCEPT #按照标记匹配
[root@node1 ~]# iptables -t filter -A INPUT -m mark --mark 2 -j REJECT
标记为取值1-255
设置完以后对应192.168.1.147可以正常访问,192.168.1.102拒绝访问
运维安全之Linux网络安全(iptables)_ip地址_17" height="72" src="https://i-blog.csdnimg.cn/img_convert/89565df7f45df72eb76c21bd54c34b16.png" width="658" />
运维安全之Linux网络安全(iptables)_内网_18" height="72" src="https://i-blog.csdnimg.cn/img_convert/32c0b1f8dc1f159b2a33f2e26004ab56.png" width="658" />
iptables nat表应用案例
nat表作用
倒流
nat表作用位置
KVM或OpenStack中虚拟机或云主机与外部通信
Docker管理的容器与外部通信
nat表规则动作所对应的链
SNAT 源地址转换 应用于出口POSTROUTING
MASQUERADE 源地址转换 应用于出口POSTROUTING
DNAT 目标地址转换 应用于进口PREROUTING
REDIRECT 端口重定向 应用于进口PREROUTING
源地址转换和目的地址转换
#源地址转换,适用于内网访问外网
#把内网的172.16.30.0/24地址替换为外网的源地址
[root@node1 ~]# iptables -t nat -I POSTROUTING -s 172.16.30.0/24 -j SNAT --to-source 192.168.1.146
#外网为动态IP则使用以下命令
iptables -t nat -A POSTROUTING -s 172.16.30.0/24 -j MASQUERADE
#目的地址转换,适用于外网访问内网
#外网访问通过80端口转发至内网172.16.30.100对应的web服务器的80端口
iptables -t nat -I PREROUTING -p tcp -d 192.168.1.146 --dport 80 -j DNAT --to-destination 172.16.30.100:80
- Firewalld
Firewalld是什么
Firewalld属于动态防火墙,是CentOS系统中用于对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选项为是否将改动写入到区域配置文件中
开启firewalld
systemctl start firewalld
Firewall状态
[root@node1 zones]# firewall-cmd --state
running
- 1.[root@localhost ~]# firewall-cmd --reload
- success
#重新加载防火墙,中断用户连接,临时配置清除掉,加载配置文件中的永久配置
[root@localhost ~]# firewall-cmd --complete-reload
success
#重新加载防火墙,不中断用户的连接(防火墙出严重故障时使用)
[root@localhost ~]# firewall-cmd --panic-on
#紧急模式,强制关闭所有网络连接
Firewalld中动作
[root@localhost ~]# firewall-cmd xxx
--get-icmptypes ##查看支持的所有ICMP类型
--get-zones ##查看所有区域
--get-default-zone ##查看当前的默认区域
--get-active-zones ##查看当前正在使用的区域
--get-services ##查看当前区域支持的服务
--list-services ##查看当前区域开放的服务列表
--list-services --zone=home ##查看指定域开放的服务列表
--list-all ##查看默认区域内的所有配置,类似与iptables -L -n
--list-all-zones ##查看所有区域所有配置
更改区域操作
#把默认区域public更改成区域work
[root@node1 zones]# firewall-cmd --set-default-zone=work
success
#查看
[root@node1 zones]# firewall-cmd --list-all
work (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
修改回来
[root@node1 zones]# firewall-cmd --set-default-zone=public
新建规则
--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 ##开启SNAT(源地址转换)
使用参数--permanent是持久化会把配置写入配置文件/etc/firewalld/zones/public.xml
查看刚刚增加的规则
运维安全之Linux网络安全(iptables)_ip地址_19" height="329" src="https://i-blog.csdnimg.cn/img_convert/5801fdf92c79ce598729ff0c08d81d66.png" width="647" />
删除规则
删除--remove
[root@localhost ~]# firewall-cmd xxx
--remove-service=http ##在home区域内将http服务删除在开放列表中删除
--remove-interface=eth0 ##将网络接口在默认的区域内删除
--remove-source=192.168.1.1 ##删除源地址的流量到指定区域
改变规则
[root@localhost ~]# firewall-cmd xxx
--change-interface=eth1 ##改变指定的接口到其他区域
开启防火墙的80端口
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
firewall-cmd --list-all
首先开启80端口,写到配置文件 使用--reload重载生效
运维安全之Linux网络安全(iptables)_源地址_20" height="310" src="https://i-blog.csdnimg.cn/img_convert/f5133949ae7c7f6c93ba9420afbefdfc.png" width="574" />
删除
firewall-cmd --remove-port=80/tcp --permanent
firewall-cmd --reload
使用协议添加
firewall-cmd --add-service=http --permanent
firewall-cmd --reload
查看
运维安全之Linux网络安全(iptables)_ip地址_21" height="301" src="https://i-blog.csdnimg.cn/img_convert/8e66963b7388c4ed3dd445300b14769b.png" width="588" />
删除
firewall-cmd --remove-service=http --permanent
firewall-cmd --reload
注意:使用参数--permanent可以即时同步配置到文件 然后再使用参数--reload生效,这样即时重启配置也不会丢失
查询
#查询80端口是否开启
[root@node1 zones]# firewall-cmd --query-port=80/tcp
yes
#查询是否开启ssh服务
[root@node1 zones]# firewall-cmd --query-service=ssh
yes
端口转发
端口转发可以将指定地址访问指定的端口时,将流量转发至指定地址的指定端口。转发的目的如果不指定ip的话就默
认为本机,如果指定了ip却没指定端口,则默认使用来源端口。
#通过firewalld实现SNAT
firewall-cmd --add-masquerade --permanent
firewall-cmd --reload
查看
运维安全之Linux网络安全(iptables)_内网_22" height="327" src="https://i-blog.csdnimg.cn/img_convert/f61b1a8ef32c142a89d4699c008ec4cd.png" width="629" />
类似于iptables的SANT
将222端口流量转发至22
[root@node1 zones]# firewall-cmd --add-forward-port=port=222:proto=tcp:toport=22
success
查看
运维安全之Linux网络安全(iptables)_数据_23" height="310" src="https://i-blog.csdnimg.cn/img_convert/12bc45933922b448be43abf572017491.png" width="720" />
验证
ssh root@192.168.1.146 -p 222
将80端口的流量转发至内网web服务器
firewall-cmd --add-forward-port=port=80:proto=tcp:toaddr=172.16.30.100
查看
运维安全之Linux网络安全(iptables)_内网_24" height="360" src="https://i-blog.csdnimg.cn/img_convert/97a177006f63a528b2354722949a2952.png" width="730" />
类似于iptables中的DNAT
通过iptables查看
运维安全之Linux网络安全(iptables)_数据_25" height="382" src="https://i-blog.csdnimg.cn/img_convert/3e3c26651c5a3b1acfec3d08524a8e29.png" width="1329" />
删除
[root@localhost ~]# firewall-cmd --remove-forward-
port=port=80:proto=tcp:toaddr=172.16.30.100 --permanent
Rich规则
Rich规则帮助
[root@localhost ~]# man 5 firewalld.richlanguage
Rich规则选项
--add-rich-rule=’rule’ ##新建rich规则
--remove-rich-rule=’rule’ ##删除rich规则
--query-rich-rule=’rule’ ##查看单条rich规则
--list-rich-rules ##查看rich规则列表
Rich规则案例
拒绝某一主机访问
firewall-cmd --permanent --zone=public --add-rich-rule="rule family=ipv4 source address=192.168.1.147/32 reject"
firewall-cmd --reload
firewall-cmd --list-all
运维安全之Linux网络安全(iptables)_源地址_26" height="350" src="https://i-blog.csdnimg.cn/img_convert/13a7d4f5b4d8c8b4653c0cc9be7f4f4d.png" width="940" />
删除刚刚配置的规则
firewall-cmd --permanent --zone=public --remove-rich-rule="rule family=ipv4 source address=192.168.1.147/32 reject"
firewall-cmd --reload
firewall-cmd --list-all
抛弃icmp协议所有数据包
[root@node1 ~]# firewall-cmd --permanent --add-rich-rule='rule protocol value=icmp drop'
success
[root@node1 ~]# firewall-cmd --reload
success
[root@node1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports: 80/tcp
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule protocol value="icmp" drop
删除
[root@node1 ~]# firewall-cmd --permanent --remove-rich-rule='rule protocol value=icmp drop'
success
[root@node1 ~]# firewall-cmd --reload
success
允许某一网段一段端口通过
[root@node1 ~]# firewall-cmd --permanent --zone=public --add-rich-rule='rule family=ipv4 source address=192.168.1.0/24 port port=7900-7905 protocol=tcp accept'
success
[root@node1 ~]# firewall-cmd --reload
success
[root@node1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="192.168.1.0/24" port port="7900-7905" protocol="tcp" accept
开启SNAT
[root@node1 ~]# firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=172.16.30.0/24 masquerade'
success
[root@node1 ~]# firewall-cmd --reload
success
[root@node1 ~]# firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
rule family="ipv4" source address="172.16.30.0/24" masquerade
端口转发
开启masquerade
firewall-cmd --add-masquerade --permanent
设置端口转发
firewall-cmd --permanent --add-rich-rule='rule family=ipv4 source address=192.168.1.146/24 forward-port port=80 protocol=tcp to-port=80 to-addr=172.16.30.100'
firewall-cmd --reload
firewall-cmd --list-al
设置访问192.168.1.146转发至内部主机172.16.30.100的80端口
注意:source address=192.168.1.146/24需要加掩码位数24 不能不加或者使用掩码32 否则无法访问
网络安全学习路线
对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。
同时每个成长路线对应的板块都有配套的视频提供:
需要网络安全学习路线和视频教程的可以在评论区留言哦~
最后
- 如果你确实想自学的话,我可以把我自己整理收藏的这些教程分享给你,里面不仅有web安全,还有渗透测试等等内容,包含电子书、面试题、pdf文档、视频以及相关的课件笔记,我都已经学过了,都可以免费分享给大家!
给小伙伴们的意见是想清楚,自学网络安全没有捷径,相比而言系统的网络安全是最节省成本的方式,因为能够帮你节省大量的时间和精力成本。坚持住,既然已经走到这条路上,虽然前途看似困难重重,只要咬牙坚持,最终会收到你想要的效果。
黑客工具&SRC技术文档&PDF书籍&web安全等(可分享)
结语
网络安全产业就像一个江湖,各色人等聚集。相对于欧美国家基础扎实(懂加密、会防护、能挖洞、擅工程)的众多名门正派,我国的人才更多的属于旁门左道(很多白帽子可能会不服气),因此在未来的人才培养和建设上,需要调整结构,鼓励更多的人去做“正向”的、结合“业务”与“数据”、“自动化”的“体系、建设”,才能解人才之渴,真正的为社会全面互联网化提供安全保障。
特别声明:
此教程为纯技术分享!本教程的目的决不是为那些怀有不良动机的人提供及技术支持!也不承担因为技术被滥用所产生的连带责任!本教程的目的在于最大限度地唤醒大家对网络安全的重视,并采取相应的安全措施,从而减少由网络安全而带来的经济损失