netfilter/iptables关系:netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
netfilter/iptables后期简称为:iptables。iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle、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 在表的最后面追加一条规则
-l 插入规则
- -I < 链名 > [ 规则号码 ] INSERT,插入一条规则
例2:
iptables -I INPUT 3 -j ACCEPT
注意:
- -t filter 可不写,不写则自动默认是 filter 表
- -I 链名 [ 规则号码 ],如果不写规则号码,则默认是 1
- 确保规则号码 ≤ (已有规则数 + 1),否则报错
-R 替换规则
- -R num:Replays 替换/修改第几条规则
格式: iptables -t filter -R INPUT 3 ...... 修改filter 的 INPUT 链第三条规则
-D 删除规则
- -D <链名> < 规则号码 | 具体规则内容 > DELETE,删除一条规则
例2:
iptables -D INPUT -s 172.16.1.51 -j DROP
(按内容匹配)
注意:
- 若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条
- 按号码匹配删除时,确保规则号码 ≤ 已有规则数,否则报错
- 按内容匹配删除时,确保规则存在,否则报错
-P 默认规则
- -P < 链名 > < 动作 > POLICY ,设置某个链的默认规则
注意:
当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理。动作前面不能加
-j
-F 清空规则
- -F [ 链名 ] FLUSH,清空规则
例2:
iptables -t nat -F
# 清空NAT表 所有链上的规则例3:
iptables -t nat -F PREROUTING
注意:
- -F 仅仅时清空链中的规则,并不影响 -P 设置的默认规则。需要手动更改
- -P 设置了DROP后,使用 -F 一定小心别把自己drop掉,否则连接不上远程主机需要去机房亲自打开规则
配置crontab: */15 * * * * iptables -P INPUT ACCEPT #每隔15分钟在INPUT链上 默认允许 */15 * * * * iptables -F3. 不写链名默认清空所用链里的所有规则
-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进入
-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
- -d < 匹配目的地址 >
-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 < 匹配协议类型 >
-p tcp
、-p udp
、-p icmp --icmp-type
按来源目的端口匹配
- --sport < 匹配源端口 > 可以是个别端口,可以是端口范围
--sport 1000:3000 匹配端口源是 1000-3000 的数据包
--sport :3000 匹配源端口号是 3000 一下的数据包(含 3000)
--sport 1000:
- --dport < 匹配目的端口 > 可以是个别端口,也可以是端口范围
--dport 6000:8000 匹配目的端口是 6000-8000 的数据包 (含 6000)
--dport :3000 匹配目的端口是 3000 以下的数据包 (含3000)
注意:
- --sport 和 --dport 必须配合 -p 参数使用 必须指定类型是什么
- 条件写的越多,匹配越细致,匹配范围越小
动作处理方式
- ACCEPT 通过
- DROP 丢弃
- SNAT 源地址转换
- DNAT 目的地址转换
- MASQUERADE 伪装
iptables -A INPUT -j ACCEPT
iptables -A FORWARD -s 172.16.1.2 -j DROP
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
例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:把从 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:把从 eth0 进入的要访问 tcp/80 的数据包目的地址改为 172.16.1.1-172.16.1.10
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to
- -j MASQUERADE 伪装
例1:
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE
- 按包状态匹配(state)
- 按来源 MAC 匹配(mac)
- 按包速率匹配(limit)
- 多端口匹配(multiport)
按包状态匹配
- -m state --state状态
NEW:有别于 tcp 的 syn #如果我们发送一个初始化包,状态就会在OUTPUT链里被设置为 NEW,当我们收到回应的包时,状态就会在PREROUTING 链里被设置为 ESTABLISHED。如果第一个包不是本地产生的,就会在PREROUTING 链里被设置为 NEW 状态。
ESTABLISHED:连接态
RELATED:衍生态,与 contrack关联(FTP)
INVALID:不能被识别属于哪个连接或没有任何状态
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 |
按来源MAC匹配
- -m mac --mac -source MAC
例:
iptables -A FORWARD -m mac-source XXXXXX -j DROP
#阻断来自某MAC 地址的数据包,通过本机
注意:报文经过路由后,数据包中原有的mac 信息会被替换,所以在路由后的
iptables
按包速率匹配
- -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
多端口匹配
- -m multiport <--sport | --dports | --ports > 端口 1 [,端口 2,....端口n]
例:
iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT
# 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
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 |
# 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