iptables防火墙

iptables概述:

🍇netfilter/iptables:IP信息包过滤系统,它实际上由两个组件netfilter 和 iptables 组成。

🥝netfilter/iptables关系:netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。

iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。

🍉netfilter/iptables后期简称为:iptables。iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle、raw 四张表。所有规则配置后,立即生效,不需要重启服务。

注:在大并发网站的设计中,建议关闭iptables,使用硬件防火墙。硬件防火墙品牌:Juniper ,华为赛门铁克 ,思科 H3C ,天融信, 山石网科 ,飞塔 ,联想网御 ,NETGEAR ,启明星辰,深信服

四表五链的介绍

表的概述

为什么称之为链?

在iptables防火墙匹配规则时,规则会一条一条串联在一起,所以称之为"链",数据只有匹配每一个链的规则才能进入下一条,然后通过防火墙进行数据访问服务端,每个表最多有五个链,表规则的通过也可以比作通过海关关卡出国访问。

五个链:

  1. input 链:        匹配目标ip时本机的进入主机的数据包
  2. output 链:           从主机出去的包,一般不做配置
  3. forward 链:         匹配流经主机的数据包
  4. prerouting 链:     用来修改目的地址,用来做DNAT。如:把内网中的80端口映射到路由器外网端口上
  5. postrouting 链:   用来修改源地址用来做SNAT。如:内网通过路由器实现内网访问一个公网的IP地址

链的概述

🍍iptables的四个表:

  1. filter表:负责过滤功能,防火墙;内核模式:iptables_filter 包括的规则链有,input,outputforward;
  2. nat表:内核模块:iptables_nat 涉及到网络地址转换,包括的规则链有,prerouting,postroutingoutput;
  3. mangle表: 内核模块:iptables_mangle 表则主要应用在修改数据包内容上,用来做流量整形的,给数据包打个标识,默认的规则链有:INPUT,OUTPUT、forward,POSTROUTING,PREROUTING;
  4. raw表: 关闭nat表上启用的所有规则;内核模块:iptables_raw

Raw[ r ɔ: ]表:用于处理异常,包括的规则链有,prerouting,output;一般使用不到。

防火墙包流经过程

总结:

总结: 整体数据包分两类: 1、发给防火墙本身的数据包 ;2、需要经过防火墙的数据包

注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。

 

防火墙相关配置

防火墙服务安装部署

[root@m01 /]# systemctl stop  firewalld       #关闭firewalld
[root@m01 /]# systemctl disable  firewalld    #禁止开机自启
[root@m01 /]# yum install -y iptables-services
[root@m01 /]# systemctl start iptables 
#配置文件
[root@m01 /]# ls /etc/sysconfig/iptables
/etc/sysconfig/iptables

防火墙服务配置应用

查看默认配置信息:

[root@m01 /]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
  181 12588 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
    0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           
    0     0 ACCEPT     all  --  lo     *       0.0.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
    1   229 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 111 packets, 12240 bytes)
 pkts bytes target     prot opt in     out     source               destination         

参数: # -L选项必须在最后面

  • -L list 列表显示表的链和规则信息
  • -n number 将部分信息以数字形式显示
  • -v : verbose,表示详细的,冗长的,显示计数器。
  • -x : 表示精确值单位变化,而不是显示为经过可读优化的计数值。

iptables的语法格式:

  • iptables [ -t 表名 ] 管理选项 [ 链名 ] [ 条件匹配 ] [ -j 目录标准动作或跳转 ]

注意事项:

  • 不指定表名时,默认时filter表
  • 不指定链名时,默认表示该表内所有链
  • 除非设置规则的缺省策略,否则需要指定匹配条件

iptables语法总结:

参数选项:

-A 表后追加一条规则

  • -A <链名> APPEND 在表的最后面追加一条规则

例1:iptables -t filter -A INPUT -j DROP  # 在最后一条添加拒绝所有主机访问,匹配所有访问本机IP的数据包,匹配到的丢弃

-l 插入规则

  • -I < 链名 > [ 规则号码 ] INSERT,插入一条规则

例1:iptables -I INPUT -j DROP     # 在filter 表的 INPUT 链里插入一条规则(插入成第1条)

例2:iptables -I INPUT 3 -j ACCEPT  # 在 filter 表的 INPUT 链里插入一条规则(插入成第 3 条)

注意:

  1. -t filter 可不写,不写则自动默认是 filter 表
  2. -I 链名 [ 规则号码 ],如果不写规则号码,则默认是 1
  3. 确保规则号码 ≤ (已有规则数 + 1),否则报错

-R 替换规则

  • -R num:Replays 替换/修改第几条规则

格式: iptables -t filter -R INPUT 3 ...... 修改filter 的 INPUT 链第三条规则

-D 删除规则

  • -D <链名> < 规则号码 | 具体规则内容 > DELETE,删除一条规则

例1:iptables -D INPUT 1(按号码匹配) 删除 filter 表 INPUT 链中的第一条规则(不管内容是什么)

例2:iptables -D INPUT -s 172.16.1.51 -j DROP (按内容匹配)

删除 filter 表 INPUT 链中内容为 "-s 172.16.1.51 -j DROP"的规则 (不管规则在哪里) 

注意:

  1. 若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条
  2. 按号码匹配删除时,确保规则号码 ≤ 已有规则数,否则报错
  3. 按内容匹配删除时,确保规则存在,否则报错

-P 默认规则

  • -P < 链名 > < 动作 > POLICY ,设置某个链的默认规则

例1:iptables -P INPUT DROP # 设置 filter 表 INPUT 链的默认规则是DROP

注意:

  1. 当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理。动作前面不能加 -j ,这也是唯一 一种 动作前面不加 -j 的情况处理。

-F 清空规则

  • -F [ 链名 ] FLUSH,清空规则

例1:iptables -F INPUT # 清空INPUT链上的规则

例2:iptables -t nat -F # 清空NAT表 所有链上的规则

例3:iptables -t nat -F PREROUTING #清空NAT表中 PREROUTING链上的规则

注意:

  1. -F 仅仅时清空链中的规则,并不影响 -P 设置的默认规则。需要手动更改iptables -P INPUT ACCEPT
  2. -P 设置了DROP后,使用 -F 一定小心别把自己drop掉,否则连接不上远程主机需要去机房亲自打开规则
配置crontab:

*/15 * * * * iptables  -P INPUT ACCEPT    #每隔15分钟在INPUT链上 默认允许

*/15  * * * * iptables -F

  3. 不写链名默认清空所用链里的所有规则

-Z 封包计数归零

  • -Z 将封包计数归零 (统计流量数据包个数 所有数据包字节数)

  iptables -Z INPUT

-L 列出规则

  • -L [ 链名 ] list,列出规则v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
    • v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
    • x:在v基础上,禁止自动单位换算(K 、M)
    • n:只显示IP地址和端口号码,不显示域名和服务名称
    • --line-number 可以查看到端口号
[root@m01 ~]# iptables -L
粗略列出 filter 表所有链及所有规则

[root@m01 ~]# iptables -t nat -vnL
用详细方式列出 nat 表所有链的所有规则,只显示 IP 地址和端口号

[root@m01 ~]# iptables -t nat -vxnL PREROUTING
用详细方式列出 nat 表 PREROUTING 链的所有规则以及详细数字,不反解

匹配条件

  • 流入、流出接口(-i、-o)
  • 来源、目的地址(-s、-d)
  • 协议类型 (-p)
  • 来源、目的端口(--sport、--dport)

按网络接口匹配

  • -i < 匹配数据进入的网络接口 > #此选项主要应用与nat表,例如目标地址转换
例1:-i eth0 匹配是否从网络接口 eth0 进入

例2:-i eth1 匹配是否从网络接口eth1进入
  • -o < 匹配数据流出的网络接口>

按来源目的地址匹配

  • -s < 匹配来源地址 >

可以时 IP、网段、域名、也可以为空(任何地址 0.0.0.0)

-s 172.16.0.1 匹配来自 172.16.0.1 的数据包

-s 172.16.1.0/24 匹配来自 172.16.1.0/24 的数据包

-s 172.16.1.0/16 匹配来自 172.16.1.0/16 的数据包

  • -d < 匹配目的地址 >

可以是IP、网段、域名、也可以为空

-d 172.16.1.1 匹配去往 172.16.1.1 的数据包

-d 172.16.1.0/16 匹配去往 172.16.1.0/24 的网段

-d www.baudu.com 匹配去往域名 www.baidu.com 的数据包

按协议类型匹配

  • -p < 匹配协议类型 >

可以是 TCP、UDP、ICMP

-p tcp-p udp-p icmp --icmp-type 类型

按来源目的端口匹配

  • --sport < 匹配源端口 > 可以是个别端口,可以是端口范围

--sport 1000 匹配源端口 1000 的数据包

--sport 1000:3000 匹配端口源是 1000-3000 的数据包

--sport :3000 匹配源端口号是 3000 一下的数据包(含 3000)

--sport 1000: 匹配源端口是1000以上的数据包端口 (含 1000)

  • --dport < 匹配目的端口 > 可以是个别端口,也可以是端口范围

--dport 80 匹配目的端口是80的数据包

--dport 6000:8000 匹配目的端口是 6000-8000 的数据包 (含 6000)

--dport :3000 匹配目的端口是 3000 以下的数据包 (含3000)

--dport 1000: 匹配目的端口是 1000 以下的数据包 (含1000)


注意:

  1. --sport 和 --dport 必须配合 -p 参数使用 必须指定类型是什么
  2. 条件写的越多,匹配越细致,匹配范围越小

动作处理方式

  1. ACCEPT 通过
  2. DROP 丢弃
  3. SNAT 源地址转换
  4. DNAT 目的地址转换
  5. MASQUERADE 伪装
  • -j ACCEPT

通过,允许数据包通过本链而不拦截它

iptables -A INPUT -j ACCEPT #允许所有访问主机IP的数据包通过-j DROP

  • -j DROP

丢弃,阻止数据通过本链,结果不返回,(提防黑客)

iptables -A FORWARD -s 172.16.1.2 -j DROP 阻止来源地址为 172.16.1.2 的数据包通过

  • -j SNAT --to IP [-IP] [:端口-端口] (nat表的 POSTROUTING链)

源地址转换,SNAT 支持转换为单IP,也支持转换到 IP 地址池 (一组连续的 IP 地址)

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to 10.0.0.10

#将内网 172.16.1.0/24源地址转换成10.0.0.10 出去,用于NAT

 

iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT--to 10.0.0.1-10.0.0.10

#只不过修改一个地址池里的IP

  • -j DNAT --to IP [-IP] [:端口-端口] (nat表 的 PREROUTING 链)
  • 目的地址转换,DNAT 支持转换为单IP,也支持转换到 IP 地址池(一组连续的IP地址池)

  1. 例1:把从 eth0 进来要访问 tcp/80 的数据包目的地址改为 172.16.1.1

    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 172.16.1.1

     

  2. 例2:把从 eth0 进入要访问 tcp/81 的数据包目的地址 修改为 到172.16.1.1指定的80端口

    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 81 -j DNAT --to 172.16.1.1:81

  3. 例3:把从 eth0 进入的要访问 tcp/80 的数据包目的地址改为 172.16.1.1-172.16.1.10

    iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to172.16.1.1-172.16.1.10

  • -j MASQUERADE 伪装

动态源地址转换(动态 IP 的情况下使用)

例1:iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE

将源地址是172.16.1.0/24 的数据包进行地址伪装,转换成 eth0 上的地址。eth0 为路由器外网出口 IP 地址。

附加模块

  • 按包状态匹配(state)
  • 按来源 MAC 匹配(mac)
  • 按包速率匹配(limit)
  • 多端口匹配(multiport)

按包状态匹配

  • -m state --state状态

状态:NEW、RELATED、ESTABLISHED、INVALID

NEW:有别于 tcp 的 syn #如果我们发送一个初始化包,状态就会在OUTPUT链里被设置为 NEW,当我们收到回应的包时,状态就会在PREROUTING 链里被设置为 ESTABLISHED。如果第一个包不是本地产生的,就会在PREROUTING 链里被设置为 NEW 状态。

ESTABLISHED:连接态

RELATED:衍生态,与 contrack关联(FTP)

INVALID:不能被识别属于哪个连接或没有任何状态

iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPR

 

State(状态)Explanation(注释)
NEW NEW说明这个包是我们看到的第一个 包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。dond>这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在 我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。
ESTABLISHED ESTABLISHED已经注意到两个方向上 的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容 易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防 火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我 们所发出的信息的应答。
RELATED RELATED是个比较麻烦的状态。当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想 是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这 个新的连接colorred就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应 答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议 是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。
INVALID INVALID说明数据包不能被识别属于 哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。

按来源MAC匹配

  • -m mac --mac -source MAC

匹配某个 MAC 地址

例:iptables -A FORWARD -m mac-source XXXXXX -j DROP

#阻断来自某MAC 地址的数据包,通过本机

注意:报文经过路由后,数据包中原有的mac 信息会被替换,所以在路由后的 iptables 中使用 mac 模块时没有意义的

按包速率匹配

  • -m limit --limit 匹配速率 [--burst 缓冲数量 ]

用一定速率去匹配数据包

例:iptables -A FORWARD -d 172.16.1.1 -m limit --limit 50/s -j ACCEPT

iptables -A FORWARD -d 172.16.1.1 -j DROP

注意:limit 英语上看是限制的意思,但实际上只是一定速率去匹配而已,50/s 表示 1 秒转发 50 个数据包,要想限制的话后面在跟一条DROP。

多端口匹配

  • -m multiport <--sport | --dports | --ports > 端口 1 [,端口 2,....端口n]

 

一次性匹配多个端口,可以区分源端口,目的端口或不指定端口

 

例:iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT #必须与 -p 参数一起使用

 

 

防火墙常见配置

查看默认配置

    # iptables -L -n
    -L  list    列表显示表的链和规则信息
    -n  number  将部分信息以数字形式显示
    
    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         
    REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
    
    Chain OUTPUT (policy ACCEPT)
    target     prot opt source               destination   

Filter 表配置方法

1. 阻止用户访问远程服务22端口

INPUT链:
    iptables -A INPUT  -s 10.0.0.1 -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT  -s 172.16.1.0/24 -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT  -i eth1  -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT  -p tcp --dport 22 -j DROP(ACCEPT DROP* REJECT)
    
OUTPUT链:
    iptables -A OUTPUT  -d 10.0.0.1 -p tcp --sport 22 -j ACCEPT
    iptables -A OUTPUT  -d 172.16.1.0/24 -p tcp --sport 22 -j ACCEPT
    iptables -A OUTPUT  -o eth1  -p tcp --sport 22 -j ACCEPT
    iptables -A OUTPUT  -p tcp --sport 22 -j DROP(ACCEPT DROP* REJECT)

2. 允许外网地址可以连接22端口(10.0.0.6)

iptables -I OUTPUT -o eth0 -d 10.0.0.6 -p tcp --sport 22  -j ACCEPT

3. 除了10.0.0.1地址可以访问80端口,其他主机都不能访问80端口

方法一:

iptables -A INPUT -s 10.0.0.1 -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP

方法二:

iptables -A INPUT -s 10.0.0.1 -p tcp --dport 80 -j ACCEPT
默认规则阻止
iptables -P INPUT DROP

方法三:

iptables -A INPUT ! -s 10.0.0.1 -p tcp --dport 80 -j DROP

4. 允许10.0.0.6用户访问防火墙服务 80 81 82 83端口

iptables -A INPUT -s 10.0.0.6 -p tcp --dport 80:83 -j ACCEPT

5. 允许10.0.0.6用户访问防火墙服务 80,443,8080端口

iptables -A INPUT -m multiport  -s 10.0.0.6 -p tcp --dport 80,443,8080 -j ACCEPT

6. 删除规则信息

iptables -D INPUT 2

7. 实现禁ping功能

# 其他主机 --- 禁止访问防火墙服务器
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP
    
# 禁止防火墙主机 --> 其他主机
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j DROP
    
# icmp 0: 回显应答(Ping应答)
# icmp 8: 回显请求(Ping请求)
    
#总结禁ping
iptables -A INPUT -m icmp -p icmp --icmp-type any -j DROP
    
# 问题: 还回接口(逻辑接口) loopback
iptables -I INPUT -i lo -m icmp -p icmp --icmp-type any -j ACCEPT

8. 实现网络流量数据包限速

# -m limit     --- 使用限速功能(数据包发送频率)
# --limit n/{second/minute/hour}:     --- 限制每秒钟/每分钟/每小时产生多少个数据包
# --limit-burst [n]                   --- 定义限制数据包一个标准

iptables -I INPUT -s 10.0.0.6 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT
iptables -A INPUT -m icmp -p icmp --icmp-type any -j DROP

企业内网主机访问外网

内网访问外网主机环境

主机名内网外网
forewalld 10.0.0.5 172.16.1.5
web01 N/A 172.16.1.7

配置内网主机

#架构里面的所有主机通过一个外网让用户访问,所以内网的所有网关是外网主机的私网ip地址

# ifdown eth0  
在内网网卡配置文件中添加信息
GATEWAY=172.16.1.5
DNS1=223.5.5.5
# ifdown eth1 && ifup eth1

配置防火墙服务器

防火墙策略配置:
# iptables -t nat -A POSTROUTING  -s 172.16.1.7 -o eth0 -j SNAT --to-source 10.0.0.5
POSTROUTING: 表示数据包在从一个接口要流出, 做一个地址映射
PREROUTING:  表示数据包在从一个接口要流入, 做一个地址转换
OUTPUT:      表示将防火墙自身产生的数据流量做地址或者端口转换

需要将防火墙服务器开启路由转发功能
# tail -1 /etc/sysctl.conf 
net.ipv4.ip_forward=1
# sysctl -p
实现企业内部主机服务可以被外网主机访问:
第一个历程: 确认内部主机是否有防火墙服务器开启
第二个历程: 配置防火墙服务策略
#iptables -t nat -A PREROUTING -d 10.0.0.5 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:80
posted @ 2019-12-27 14:31  kerwin-  阅读(333)  评论(0编辑  收藏  举报