防火墙简介

报文流向,

流入本机:PREROUTING --> INPUT–>用户空间进程

流出本机:用户空间进程 -->OUTPUT–> POSTROUTING

穿过:PREROUTING --> FORWARD --> POSTROUTING

1 防火墙分类

按保护范围划分:

  • 主机防火墙:服务范围为当前一台主机
  • 网络防火墙:服务范围为防火墙一侧的局域网

按实现方式划分:

  • 硬件防火墙:在专用硬件级别实现部分功能的防火墙;另一个部分功能基于软件实现
  • 软件防火墙:运行于通用硬件平台之上的防火墙的应用软件

按网络协议划分:

  • 网络层防火墙:OSI模型下四层,又称为包过滤防火墙
  • 应用层防火墙/代理服务器:代理网关,OSI模型七层
1.1 五个链
INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING

在这里插入图片描述

1.2 五个表table

filter、nat、mangle、raw、security

  • filter表:过滤规则表,根据预定义的规则过滤符合条件的数据包,默认表
  • nat表:network address translation 地址转换规则表
  • mangle:修改数据标记位规则表
  • raw:关闭启用的连接跟踪机制,加快封包穿越防火墙速度
  • security:用于强制访问控制(MAC)网络规则,由Linux安全模块(如SELinux)实现

iptables有五表五链

2 iptables

用户空间的工具

查找表里有哪些链

iptables -t nat -vnl
#查看当前规则
iptables -vnL                  #v是细节,n是数字化,L是列出,注意n得在L前面
iptables -vnL --line-numbers   #显示行号

iptables -t filter
-t                 #指定表
-I                 #插入,调整排序问题,可在链后面指定第几行
-D                 #删除,在链后面指定删除第几行
-m                 #指定模块名,相关协议用法可用-p代替    tcp、udp、icmp协议
-R                 #替换
-N                 #自定义链,模块化使用
-E                 #改链的名字
-S                 #显示定义过的规则具体命令,相当于history
-j                 #可以调用自定义链
-F                 #全局清除,也可指定链
-X                 #删除自定义链,得先把调用关系删除和清空链规则
-s                 #源地址
-d                 #目标地址
-P                 #更改链的默认规则,不建议

范例:filter表中的INPUT规则

iptables -t filter -A INPUT -s 192.168.0.1 -j DROP
-t filter          #指定使用filter表,也可不写,默认使用该表
-A                 #追加规则
INPUT              #链
-s 192.168.0.1     #源地址来的请求,-s指定源地址,也可写成网段,留意别把自己也给拒绝了
-j                 #跳转
DROP               #动作,删除或抛弃
#拒绝来自192网络的访问
2.1 基本匹配条件
[!] -s, --source address[/mask][,...]:源IP地址或者不连续的IP地址
[!] -d, --destination address[/mask][,...]:目标IP地址或者不连续的IP地址
[!] -p, --protocol protocol:指定协议,可使用数字如0(all)
    protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or“all“  
    参看:/etc/protocols
[!] -i, --in-interface name:报文流入的接口;指定进来的接口,应用于INPUT、FORWARD、PREROUTING链
[!] -o, --out

#[!] 可选取反

-interface name:报文流出的接口;指定出去的接口,应用于FORWARD、OUTPUT、POSTROUTING链

相关环境

#需关闭firewalld服务
#Centos 7,8:
systemctl stop firewalld.service               #不使用原有的规则
systemctl disable firewalld. service
#或者
systemctl disable --now firewalld. service

#Centos6:
service iptables stop
chkconfig iptables off

抓包检查

tcpdump -i eth0 -nn icmp     #-nn指定协议
2.2 动作
DROP      #删除或抛弃,无回应
REJECT    #拒绝,有回应
ACCERT    #允许
RETURN    #提前结束,在此结束

3 扩展匹配条件

3.1 tcp协议的扩展选项
[!] --source-port, --sport port[:port]:匹配源端口
[!] --destination-port,--dport port[:port]:匹配目标端口
[!] --tcp-flags mask comp
     mask 需检查的标志位列表,用,分隔 , 例如 SYN,ACK,FIN,RST
     comp 在mask列表中必须为1的标志位列表,无指定则必须为0,用,分隔tcp协议的扩展选项

#范例
--tcp-flags SYN,ACK,FIN,RST SYN 表示要检查的标志位为SYN,ACK,FIN,RST四个,其中SYN必须为1,余下的必须为0,第一次握手
--tcp-flags SYN,ACK,FIN,RST SYN,ACK 第二次握手

#错误包
--tcp-flags ALL ALL    #全是1
--tcp_flags ALL NONE   #全是0

[!] --syn:用于匹配第一次握手, 相当于:--tcp-flags SYN,ACK,FIN,RST SYN

#范例
iptables -I INPUT 5 -p tcp --dport 443 -j ACCERT
3.2 udp 协议的扩展选项
[!] --source-port, --sport port[:port]:源端口
[!] --destination-port,--dport port[:port]:目标端口
3.3 icmp 协议的扩展选项
[!] --icmp-type {type[/code]|typename}
 type/code
 0/0   echo-reply icmp应答       #回来的包
 8/0   echo-request icmp请求     #发出的包
 
#我可以ping通,别人ping不了
iptables -I INPUT 4 -p icmp --icmp-type 0 -j ACCEPT

4 iptables模块相关

4.1 multiport
#将多个端口合并写成一个条件
[!] --source-ports,--sports port[,port|,port:port]...       #源端口
[!] --destination-ports,--dports port[,port|,port:port]...  #目标端口

#端口号用,隔开
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT    
4.2 iprange
#指定ip地址范围,哪里到哪里
[!] --src-range from[-to] 指定源IP地址范围
[!] --dst-range from[-to] 指定目标IP地址范围

#ip地址间用-隔开
iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP
4.3 mac
#无需指定目标mac地址,直接指定源mac地址即可
[!] --mac-source XX:XX:XX:XX:XX:XX

iptables -A INPUT -m mac --mac-source 00:0c:29:d5:92:c9 -j ACCEPT

centos7改mac地址可直接改网卡配置文件,MACADDR=xxx,改完让文件生效即可

4.4 string

对字符串进行监测

--algo {bm|kmp} 字符串匹配检测算法
 bm:Boyer-Moore
 kmp:Knuth-Pratt-Morris
--from offset 开始偏移    报文头前62个字符为固定,可直接跳过
--to offset   结束偏移
[!] --string pattern 要检测的字符串模式
[!] --hex-string pattern要检测字符串模式,16进制格式

#注意报文经过流程,因此添加在OUTPUT链中,指定tcp80端口
iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --from 62  --string  "google" -j REJECT
4.5 time

定义时间用

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] #开始日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]  #结束日期
--timestart hh:mm[:ss]        #开始时间9:00
--timestop hh:mm[:ss]         #结束时间18:00
[!] --monthdays day[,day...]  #每个月的几号
[!] --weekdays day[,day...]   #星期几,1,2,3,4,5,6,7 分别表示星期一到星期日,用,隔开
--kerneltz:#内核时区(当地时间),不建议使用,CentOS7系统默认为 UTC
注意: centos6 不支持kerneltz ,--localtz指定本地时区(默认)
#centos8/rocky8用不了
4.6 connlimit

限制每个客户端并发连接访问数量

--connlimit-upto N      #连接的数量小于等于N时
--connlimit-above N     #连接的数量大于N时

iptables -A INPUT -m connlimit --connlimit-above 10 -j REJECT
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
4.7 limit

限流,令牌制,

--limit-burst number #前多少个包不限制
--limit #[/second|/minute|/hour|/day]

#一分钟只通过十个包其他拒绝,前五个不限制,后面开始限流
iptables -A INPUT  -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
iptables -A INPUT  -j REJECT
4.8 state

连接状态

  • NEW:新发出请求;第一次发出的请求
  • ESTABLISHED:再次连接时记录于内存中的连接信息
  • RELATED:新发起的但有其他相关联的连接,一个带动一个,如:ftp协议中的数据连接与命令连接之间的关系
  • INVALID:无效的连接,比如六个标记位都为0
  • UNTRACKED:未进行追踪的连接,如:raw表中关闭追踪

记录路径在cat /proc/net/nf_conntrack下

当出现 nf_conntrack:nf_conntrack:table full, dropping packet 时,可更改

#调整连接追踪功能所能够容纳的最大连接数量,可改
[root@centos8 ~]#cat /proc/sys/net/netfilter/nf_conntrack_max
66624
[root@centos8 ~]#cat /proc/sys/net/nf_conntrack_max
66624

#加大访问表数量,内核参数
vim /etc/sysctl.conf
net.nf_conntrack_max=888888

#更改相关时间,不怎么建议
vi /etc/sysctl.conf
net.netfilter.nf_conntrack_tcp_timeout_established = 300
net.netfilter.nf_conntrack_tcp_timeout_time_wait = 120
net.netfilter.nf_conntrack_tcp_timeout_close_wait = 60
net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 120
iptables -t nat -L -n

单方向访问

iptables -A INPUT -s 10.0.0.7 -m state --state NEW -j REJECT      #能出能回
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT          #已有的能连
4.9 target

动作

LOG       #不拒绝也不允许,而是记录在日志里,路径在 /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: "

5 规则优化

  1. 安全放行所有入站和出站的状态为ESTABLISHED状态连接,建议放在第一条,效率更高

  2. 谨慎放行入站的新请求

  3. 有特殊目的限制访问功能,要在放行规则之前加以拒绝

  4. 同类规则(访问同一应用,比如:http ),匹配范围小的放在前面,用于特殊处理

  5. 不同类的规则(访问不同应用,一个是http,另一个是mysql ),匹配范围大的放在前面,效率更高

-s 10.0.0.0/24 -p tcp --dport 3306 -j REJECT
-s 172.16.0.1 -p tcp --dport 80 -j REJECT
  1. 应该将那些可由一条规则能够描述的多个规则合并为一条,减少规则数量,提高检查效率

  2. 设置默认策略,建议白名单(只放行特定连接)

  • iptables -P,不建议,容易出现“自杀现象”
  • 规则的最后定义规则做为默认策略,推荐使用,放在最后一条

相关模块帮助

man iptables-extensions

5.1 永久保存及开机自启iptables

#1
iptables -A INPUT -j DROP                     #首先写好所需规则
iptables-save > /etc/sysconfig/iptables       #存入文件

vim /etc/rc.local                             #ubuntu默认没有该文件,直接创建添加即可,记得加首行#!/bin/bash、加权限
iptables-restore < /etc/sysconfig/iptables    #还原文件中定义的规则

chmod +x /etc/rc.d/rc.local                        #添加执行权限

#2
#centos/rocky中也可用
yum -y install iptables-services

iptables -A INPUT -j DROP 

/usr/libexec/iptables/iptables.init save      #两种保存方法均可用 
iptables-save > /etc/sysconfig/iptables       #也可直接更改该文件

systemctl enable iptables.service             #设置开机自启

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值