Linux防火墙

发布时间 2023-12-14 10:26:07作者: 要快乐不要emo

linux防火墙

1、安全简介

# 入侵检测
不阻断网络访问,量化,定位威胁情况,主要作用是进行告警和事后监督,类似于监控系统
# 入侵防御
对访问实时分析,一旦发现问题立马阻断,主要是进行保护工作
# 防火墙
基于某些规则对访问进行屏蔽和隔离,主要是起到提前预防的作用
# 防水墙
防止内部信息向外传输,或者针对内部的一些防护机制

2、原理

linux防火墙由netfilter组件提供,工作在内核,管理工具是iptabels,通过与netfileter的五个开放函数(hook)进行交互来实现防火墙功能
对于本主机来说外来流量进入后有三条链路
#进 从pre_routing--> 路由判决 --> local_in(input) --> 本机协议栈
#出 从本机协议栈 --> local_out(output) --> 路由判决 --> post_roting
#转发 从pre_routing --> forword --> pot_routing

2.1 链

链就是内核中的开发函数,总共有五个
PREROUTING
INPUT
OUTPUT
FORWORD
POSTROUTING

2.2 表

表可以理解为iptaables所进行维护的一种功能
# 重点掌握
filter: 过滤表
nat:网络地址转换表
# 理解
mangle:修改数据标记位规则表
raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现
# 查看表支持哪些链
iptables [-t 表名称] -L 默认为filter
iptables -t nat -L
# 优先级
security -->raw-->mangle-->nat-->filter

2.3 四表五链重点理解

2.3.1 filter

过滤报文功能,只在进出本机协议和转发链上存在规则

2.3.2 nat

针对地址进行转换,本机出去需要转换,prerouting和postrouting也需要转换,进出本机就不需要了

2.3.3 raw

加快包的速度,只在preroting和postrouting上配置

2.3.4 mangle

修改数据标记为规则,每个链都可以配置

3、iptables

一个用来管理netfileter规则的工具

重点掌握

要实现哪种功能:判断添加在哪张表上
报文流经的路径:判断添加在哪个链上
报文的流向:判断源和目的
匹配规则:业务需要

3.1 使用

3.1.1 命令详解

iptables   [-t table]  [sub]  chain -s ip|subnet  [-m 模块名称 [per-match-options]]   
-j targetname [per-target-options]
# 选项详解
iptables # 主命令
[-t table] # 针对那个表做规则
    raw, mangle, nat, [filter]默认
{-A|。。。} # 针对规则所要做的动作
	-A # 在表最后面添加规则
	-I [num] # 在表中指定数字位置插入一条规则替代这个编号
    -D # 删除规则可以指定规则本身或是指定在表中的编号
    -R:replace #替换指定链上的指定规则编号
	-F:flush,#清空指定的规则链
	-Z:zero,#置零
   		iptables的每条规则都有两个计数器
 		(1) 匹配到的报文的个数
 		(2) 匹配到的所有报文的大小之和
[sub] # 其余子命令
	链管理类:
        -N:new, 自定义一条新的规则链
        -E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
        -X:delete,删除自定义的空的规则链
        -P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:ACCEPT:接受, DROP:丢弃
    查看类:
        --line-numbers # 在规则前面显示在表中的编号
        -L #列出规则
        -n #以数字方式输出端口和地址
        -v:#详细信息
        -vv #更详细
    规则管理类:
        -A:append,追加
        -I:insert, 插入,要指明插入至的规则编号,默认为第一条
        -D:delete,删除
            (1) 指明规则序号
            (2) 指明规则本身
        -R:replace,替换指定链上的指定规则编号
        -F:flush,清空指定的规则链
        -Z:zero,置零
            iptables的每条规则都有两个计数器
            (1) 匹配到的报文的个数
            (2) 匹配到的所有报文的大小之和
chain # 针对哪个链做
	PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING
匹配条件
    基本:通用的,PARAMETERS
        [!] -s # 指定规则针对哪些网段或者ip
        [!] -d # 目标IP地址或者不连续的IP地址以,分割
        -p 指定协议
            tcp
              --sport # 源端口 以对方的请求报文为准,比如10.173.10.100 请求我80端口,那么如果对80端口做规则应该是指dport
              --dport # 目标端口
                90:98 # 指定拒绝90-98端口的,不连续的需要单独指定
              --tcp-flags mask comp
                mask 需检查的标志位列表,用,分隔 例如 SYN,ACK,FIN,RST
                comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔tcp协议的扩展选项
            udp
            	[!] --source-port, --sport port[:port]:匹配报文的源端口或端口范围
				[!] --destination-port,--dport port[:port]:匹配报文的目标端口或端口范围
            icmp
              --icmp-type 【number】
                0  icmp应答
                8  icmp请求
    扩展:需加载模块,MATCH EXTENTIONS
        -m # 指定模块 若协议和模块同名则可以省略
        	multiport # 多端口模块,配合sport或dport使用,可以指定多个端口或者连续端口
        	iprange # 网段范围
        		--src-range 172.16.1.5-172.16.1.10
        		--dst-range 
        	mac # 指明mac地址
        		--mac-source XX:XX:XX:XX:XX:XX
        	string # 抓取报文中应用层字符串数据
        		[!] --string pattern 
        	connlimit # 根据每客户端IP做并发连接数数量匹配 防止dos攻击 
        		--connlimit-upto n  #连接的数量小于等于N时匹配
        		--connlimit-above n #连接的数量大于N时匹配
        	limit # 对报文做速率匹配
        		--limit-burst number	#前多少个包不限制
				--limit n[/second|/minute|/hour|/day] #限制为每秒/分/小时/天多少个
			state # 检查连接的状态,较耗资源
				NEW:新发出请求;连接追踪信息库中不存在此连接的相关信息条目,因此,将其识别为第一次发出的请求
                ESTABLISHED:NEW状态之后,连接追踪信息库中为其建立的条目失效之前期间内所进行的通信状态
                RELATED:新发起的但与已有连接相关联的连接,如:ftp协议中的数据连接与命令连接之间的关系
                INVALID:无效的连接,如flag标记不正确
                UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪匹配后的动作
    -j targetname # 要做的详细规则
    targetname:
      ACCEPT # 指定规则为允许通过此链
      DROP # 指定规则为丢弃或者拒绝通过此链
      REJECT:--reject-with:icmp-port-unreachable默认
      RETURN:返回调用链
      REDIRECT:端口重定向
      LOG:记录日志,dmesg
      MARK:做防火墙标记
      DNAT:目标地址转换
      SNAT:源地址转换
      MASQUERADE:地址伪装
      自定义链

3.1.2 常用命令

# 添加规则
iptables -A INPUT -p tcp -s 172.31.3.10/32 --dport 80 -j ACCEPT
iptables -A input -s 172.31.3.10/32 --dport 80 -j DROP
# 删除规则
iptable -D INPUT -p tcp -s 172.31.3.10/32 --dport 80 -j ACCEPT
iptable -D INPUT -p tcp -s 172.31.3.10/32 --dport 80 -j DROP

3.2 target

自定义链, ACCEPT, DROP, REJECT,RETURN,LOG,SNAT,DNAT,REDIRECT,MASQUERADE
LOG:非中断target,本身不拒绝和允许,放在拒绝和允许规则前,并将日志记录在/var/log/messages系统日志中
--log-level level 
	debug,info,notice, warning, error, crit, alert,emerg
--log-prefix prefix  日志前缀,用于区别不同的日志,最多29个字符
例:
	iptables -I INPUT -s 10.0.0.0/24 -p tcp -m multiport --dports 80,21,22,23 -m state --state NEW -j LOG --log-prefix "new connections:"

3.3 iptables最佳实践

1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高
2. 谨慎放行入站的新请求
3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝
4. 同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理
5. 不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高
例:
-s 10.0.0.6 -p tcp --dport 3306 -j REJECT
-s 172.16.0.0/16 -p tcp --dport 80 -j REJECT
6. 应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率
7. 设置默认策略,建议白名单(只放行特定连接)
	iptables -P,不建议,容易出现“自杀现象”
	规则的最后定义规则做为默认策略,推荐使用,放在最后一条

3.4 规则保存与恢复

iptables 命令生成的规则在系统重启后会消失,所以需要持久化保存
命令
iptables-save > /PATH/TO/SOME_RULES_FILE
恢复
iptables-restore </PATH/FROM/SOME_RULES_FILE
设置为开机启动
1、将命令写入脚本
echo iptables xx > iptables.sh
/etc/rc.d/rc.local文件中添加脚本路径 /PATH/TO/SOME_SCRIPT_FILE
2、使用unit管理
yum -y install iptables-services
# 保存现有规则
iptables-save > /etc/sysconfig/iptables
# 设为开机启动
systemctl enable iptables.service
# 锁定service
systemctl mask firewalld.service nftables.service

3.5 NAT

NAT的实现分为下面类型:
SNAT:source NAT ,支持POSTROUTING, INPUT,让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装,请求报文:修改源IP
DNAT:destination NAT 支持PREROUTING , OUTPUT,把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP,请求报文:修改目标IP
PNAT: port nat,端口和IP都进行修改

3.5.1 snat

基于nat表的target,适用于固定的公网IP
!!! 注意开启ip_forward
选项
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
例子
# 在nat表的postrouting(出口) 来自于本机网段的包 目标是非本机网段的时候做snat指定一个ip
# 专线,固定公网ip
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source extip
# 拨号网络
iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE

3.5.2 dnat

nat表的target,适用于端口映射,即可重定向到本机,也可以支持重定向至不同主机的不同端口,但不支持多目标,即不支持负载均衡功能
!!!开启ip_forward
选项
--to-destination [ipaddr[-ipaddr]][:port[-port]]
例子
# 在nat表上的prerouting链上 针对目标ip的tcp或者udp协议报文 目标端口做dnat 将其目标转换为新的ip+port
iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]

3.5.3 REJECT

REDIRECT,是NAT表的 target,通过改变目标IP和端口,将接受的包转发至同一个主机的不同端口,可用于PREROUTING OUTPUT链
# 例子
# 针对本机端口做重定向,将端口转发到本机另外端口
iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080