iptable防火墙配置

98 阅读8分钟

iptables的组成概述

Linux 的防火墙体系主要工作在网络层,针对 TCP/IP 数据包实施过滤和限制,属于典型的包过滤防火墙(或称为网络层防火墙)。Linux 系统的防火墙体系基于内核编码实现, 具有非常稳定的性能和高效率,也因此获得广泛的应用。

为了使防火墙达到包过滤的目的, 我们需要在数据报文流经的路径上,设置一些关卡: 只有让所有进出的报文都流经这些关卡中, 同时在关卡上设置一些条件, 报文经过检查后,符合放行条件的才给放行, 而那些不符合不达标的条件的报文则会被阻止,不能够放行。

在Linux主机中的防火墙“iptables”中,关卡就称之为“”,所谓的条件就称之为“规则”,根据题目要求所说的配置使用防火墙,其意思就是在相应的链中添加规则。

四表五链

四表

table:filter、nat、mangle、raw

raw表:确定是否对该数据包进行状态跟踪

mangle表:为数据包设置标记

nat表:修改数据包中的源、目标IP地址或端口

filter表:确定是否放行该数据包(过滤)

image.png

五链

  • OUTPUT: 处理出站数据包,一般不在此链上做配置。

  • FORWARD: 处理转发数据包,匹配流经本机的数据包。

  • PREROUTING链: 在进行路由选择前处理数据包,用来修改目的地址,用来做DNAT。相当于把内网服务器的IP和端口映射到路由器的外网IP和端口上。

  • POSTROUTING链: 在进行路由选择后处理数据包,用来修改源地址,用来做SNAT。相当于内网通过路由器NAT转换功能实现内网主机通过一个公网IP地址上网。

image.png

三种报文流向

  • 流入本机:PREROUTING --> INPUT-->用户空间进程
  • 流出本机:用户空间进程 -->OUTPUT--> POSTROUTING
  • 转发:PREROUTING --> FORWARD --> POSTROUTING

实际操作

CentOS7默认使用firewalld防火墙,没有安装iptables,若想使用iptables防火墙。必须先关闭firewalld防火墙,再安装iptables

前期准备工作
systemctl stop firewalld.service

systemctl disable  --now  firewalld.service
##开机不自启  并且立即关闭
systemctl enable  --now  firewalld.service
##开机自启  并且 立即开启


yum -y install iptables iptables-services
systemctl start iptables.service
systemctl enable iptables.service

基本语法 iptables [-t 表名] 管理选项 [链名] [匹配条件] [-j 控制类型]

如果不指定表 默认是filter

不指定链名时,默认指表内的所有链

除非设置链的默认策略,否则必须指定匹配条件

数据包的常见控制类型

  • ACCEPT:允许数据包通过。
  • DROP:直接丢弃数据包,不给出任何回 应信息。
  • REJECT:拒绝数据包通过,必要时会给数据发送端一个响应信息。
  • LOG:在/var/log/messages 文件中记录日志信息,然后将数据包传递给下一条规则。
  • iptables -I INPUT -p tcp --dport 22 -m state --state NEW -j LOG --log-prefix "sshnewlink: " 生成日志文件
  • SNAT:修改数据包的源地址。
  • DNAT:修改数据包的目的地址。
  • MASQUERADE:伪装成一个非固定公网IP地址。

管理选项

管理选项用法示例
-A在指定链末尾追加一条 iptables -A INPUT (操作)
-I在指定链中插入一条新的,未指定序号默认作为第一条 iptables -I INPUT 编号
-P指定默认规则 iptables -P OUTPUT ACCEPT (操作)
-D删除 iptables -t nat -D INPUT 2 (操作)
-p服务名称 icmp tcp
-R修改、替换某一条规则 iptables -t nat -R INPUT (操作)
-L查看 iptables -t nat -L (查看)
-n所有字段以数字形式显示(比如任意ip地址是0.0.0.0而不是anywhere,比如显示协议端口号而不是服务名) iptables -L -n,iptables -nL,iptables -vnL (查看)
-v查看时显示更详细信息,常跟-L一起使用 (查看)
--line-number规则带编号 iptables -t nat -L -n --line-number /iptables -t nat -L --line-number
-F清除链中所有规则 iptables -F (操作)
-N新加自定义链
-X清空自定义链的规则,不影响其他链 iptables -X
-Z清空链的计数器(匹配到的数据包的大小和总和)iptables -Z
-S看链的所有规则或者某个链的规则/某个具体规则后面跟编号

加新的防火墙规则

添加新的防火墙规则时,使用管理选项“-A”、“-I”,前者用来追加规则,后者用来插入规则。

例子
iptables -t filter -A INPUT -p icmp -j REJECT     DROP   ACCEPT  //不允许任何主机ping本主机
iptables -I  INPUT 2 -p tcp --dport 22 -j ACCEPT   //允许 tcp 协议 端口号22 的通过 

通用匹配

直接使用,不依赖于其他条件或扩展,包括网络协议、IP地址、网络接口等条件。
协议匹配: -p协议名
地址匹配: -s 源地址、-d目的地址
#可以是IP、网段、域名、空(任何地址)
接口匹配: -i入站网卡、-o出站网卡  

例子

iptables -P FORWARD ACCEPT  # 将 FORWARD 链的默认策略设置为 ACCEPT  
iptables -A FORWARD -p icmp -j DROP  # 添加一个规则来丢弃 ICMP 数据包
iptables -I INPUT -i ens33 -s 192.168.91.0/24 -j DROP
#对于通过 `ens33` 接口进入本地系统,且源 IP 地址在 `192.168.91.0/24` 范围内的数据包,将它们丢弃(阻止它们进入)。

Iptables常用的匹配扩展模块

tcp模块

iptables -I INPUT -i ens33 -p tcp --tcp-flags FIN,RST,ACK SYN -j ACCEPT
#丢弃SYN请求包,放行其他包

iptables -A INPUT -s 192.168.39.6 -p tcp --dport 80 -j ACCEPT
#filterinput链添加一条规则,允许192.168.39.6通过tcp协议访问本机的80端口;-p指定tcp协议时间接使用了tcp模块

ICMP

类型匹配: --icmp-type ICMP类型

"Echo- Request" (代码为8)表示请求

"Echo- Reply" (代码为0)表示回复

"Dest ination-Unreachable" (代码为3)表示目标不可达

iptables -A INPUT -p icmp --icmp-type 8 -j DROP         
#禁止其它主机ping本机
iptables -A INPUT -s 192.168.100.101 -p icmp --icmp-type 8 -j REJECT 
*于来自 `192.168.100.101`,且类型为 ICMP Echo Request(通常是 `ping` 请求)的数据包,本地系统将不会响应

multiport模块

以离散方式定义多端口匹配,最多指定15个端口

iptables -A INPUT -p tcp -m multiport --dports 80,3306 -j ACCEPT
#filterinput链添加规则,允许客户端通过TCP协议访问330680端口;multiport模块的作用是指定多个不连续的端口,并且只会生成一条规则

string模块

对报文中的应用层数据做字符串模式匹配检测

iptables虽然不是应用层防火墙,但是也可以通过string模块分析数据报文中的特定关键字
--algo {bm|kmp}   字符串匹配检测算法
--from offset     指定数据帧的开始偏移位置
--to offset       指定数据帧的结束偏移位置
--string pattern  要检测的字符串模式
数据帧中数据链路层头部中有8个字节的前导信息、6个字节的目标MAC和6个字节的源MAC、2个字节的type类型;IP头固定20个字节;TCP头固定20个字节,即可以跳过数据报文中的前62个字节开始检查特定的字符串

iptables -A OUTPUT -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
#filter表output链添加规则,拒绝客户端访问的站点页面内容中带有google关键字的页面;此规则需要设置在output链上,此规则只针对站点页面的内容,所以客户端在访问时,请求报文中是不带有站点页面内容的,只有回复报文中才包含页面内容,并且回复报文的源端口为本机的80端口

time模块

根据将报文到达的时间与指定的时间范围进行匹配

--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 开始日期
--datestop  YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 结束日期
--timestart hh:mm[:ss] 开始时间
--timestop  hh:mm[:ss] 结束时间
--monthdays day[,day...] 每个月的几号
--weekdays day[,day...]  星期几,17 分别表示星期一到星期日
--kerneltz:内核时区,不建议使用,不设置此选项CentOS7系统默认为UTC,设置规则时需要+8小时;centos6不支持--kerneltzcentos6默认就是当地时间,不需要进行转换;

iptables -A INPUT -m time --timestart 1:00 --timestop 10:00 --weekdays Sat,Sun -j DROP
#filterinput链添加规则,拒绝所有客户端在周六、周日的早9点到晚6点访问本机的所有地址

connlimit扩展

根据每客户端IP做并发连接数数量匹配

可防止Dos(Denial of Service,拒绝服务)攻击

--connlimit-upto   连接的数量小于等于多少时匹配
--connlimit-above  连接的数量大于多少时匹配

iptables -A INPUT -p tcp --dport 80 -m connlimit --connlimit-above 100 -j REJECT   
#filterinput链添加规则,当每个客户端IP访问tcp80端口,并发连接超过100时,拒绝访问