一、iptables 概念

1、iptables 概述

netfilter/iptables: IP 信息包过滤系统,由netfilter和iptables组成

netfilter组件:称为内核空间,是内核的一部分,由一些信息包过滤表组成,这些表是内核用来控制信息包过滤处理的规则集

iptables组件是一种工具,也称为用户空间,方便插入、修改和除去信息包过滤表中的规则。

netfilter/iptables 后期简称iptables,iptables是基于内核的防火墙

iptables内置了 filter,nat和 mangle 三张表

所有规则配置后,立马生效

2、三张表

  • filter:负责过滤数据包,包括的规则链有,input,output和forward
  • nat 则涉及到网络地址转换,包括的规则链有,prerouting,postrouting和output
  • mangle表主要应用在修改数据包内容上,用来做流量整形的,给数据包打标,默认规则链有 input,output,nat,postrouting,prerouting

3、五个链

  • input:匹配目标ip 是本机的数据包
  • output 出口数据包,一般不在此链做配置
  • forward 匹配流经本机的数据包
  • prerouting 用来修改目的地址用来做DNAT,如把内网的80端口映射到路由器外网端口上
  • postrouting 用来修改源地址用来做SNAT,如内网通过路由器NAT转换功能实现内网PC机通过一个公网ip地址上网

-数据结构

表 --》 链–》 规则

Iptables 过滤封包流程

graph LR
request--> prerouting
prerouting--> Route
Route--> forward
forward--> postrouting
postrouting--> response
Route--> input
input--> output
output--> postrouting

request:来源机器
response:目的机器
Route:不是链

4、数据包分类

  1. 发给防火墙本身的数据包
  2. 需要经过防火墙的软件包

5、链上执行顺序

  1. 表间的优先顺序
raw > mangle > nat > filter
  1. 链间的匹配顺序
入站数据:prerouting,input 
出站数据:putput,postrouting
转发数据:prerouting,forward,postrouting
  1. 链内的匹配顺序
自上而下按顺序依次进行检查,找到相匹配的规则即停止
若在该链内找不到相匹配的规则,则按该链的默认策略处理(未修改情况,默认策略为允许)

6、iptables 安装

  • 检查是否安装iptables
rpm -qf `which iptables`
  • 安装iptables
yum install iptables
  • iptables 配置文件路径
/etc/sysconfig/iptables-config
  • iptables 服务启动
/etc/init.d/iptables start
  • iptables 是否开机启动
chkconfig --list iptables

二、iptables 操作

1、iptables 语法

1.1. iptables 命令的语法格式
iptables [-t 表名] 管理选项 [链名] [条件匹配] [-j 目标动作或跳转]

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

举例:

iptablestablecommandchainparametertarget
iptables-t filter-Ainput-p-j ACCEPT
  • command 选项
-A :增加
-D: 删除
-I
-R
-L
-F: 清空规则
-Z
-N
-X
-P : 设置某个链的默认规则

  • parameter选项
-P:协议类型
-s:来源地址
-d:目的地址
-i:流入
-o:流出
-sport:来源端口
-dport:目标端口

  • target
-j ACCEPT
-j DROP
-j REJECT

2、命令(command)相关

2.1.增加一条规则

在filter 表的input 链里追加一条规则,匹配所有访问本机IP的数据包,匹配到的丢弃

# 拒绝所有人访问服务器
iptables  -t filter -A INPUT -j DROP

2.2.查看规则
iptables  -L
2.3.删除规则
  • 按照序号 删除规则
# 方式1,按照序号

# 删除filter表的input 链的第一条规则
iptables  -t filter -D INPUT 1
  • 按内容删除规则
# 方式2,按内容

# 删除filter表的input链中内容为 "-s 192.168.0.1 -j DROP" 的规则
iptables  -t filter -D INPUT -s 192.168.0.1 -j DROP
2.4.设置某个链的默认规则
iptables -p INPUT DROP
2.5. 查看默认规则
iptables -L

2.6. 清空规则
# 清空filter表INPUT链的所有规则
iptables  -t filter -F INPUT 

# 清空filter表的所有链的规则
iptables  -t filter -F

注意事项

  1. -F 不清除默认规则
  2. -P 设置了DROP后,使用-F 一定要小心
  3. 如不写链名,默认清空某表里所有链里的所有规则
2.7. 查看指定链的所有规则(iptalbes -[vnx]L)
# nat 表PREROUTING 链的所有规则

iptables -t nat -vnL PREROUTING

3. 匹配条件

3.1. 按流入网络接口匹配(-i)
-i 匹配数据进入网络接口    #主要用于nat表
# 例子
-i eth0 匹配是否从网络接口eth0进来
-i ppp0 匹配是否从网络接口ppp0进来
3.2. 按流出网络接口匹配(-o)
iptables -t nat -o eth0 条件  动作
3.3. 按来源地址匹配(-s)
-s 匹配来源地址,可以是ip,net,domain ,也可空(任何地址)

例如:

-s 192.168.0.1     匹配来自192.168.0.1的数据包
-s 192.168.1.0/24  匹配来自192.168.1.0/24 的数据包
-s 192.168.0.0/16  匹配来自192.168.0.0/16 的数据包
3.4. 按目的地址匹配(-d)
-d 匹配来源地址,可以是ip,net,domain ,也可空(任何地址)

例如:

-d 192.168.0.1     匹配去往192.168.0.1的数据包
-d 192.168.1.0/24  匹配去往192.168.1.0/24 的数据包
-d 192.168.0.0/16  匹配去往192.168.0.0/16 的数据包
3.5. 按协议匹配(-p)
-p 匹配来源地址,可以是TCP、UDP,ICMP,也可为空

例如:

-p tcp     匹配协议为 tcp的数据包
-p udp     匹配协议为 udp的数据包
-p icmp    匹配协议为 icmp的数据包
3.6. 按来源端口匹配(sport)

例如:

--sport 1000          匹配源端口是1000的数据包
--sport 1000:3000     匹配源端口是1000-3000的数据包
--sport :3000         匹配源端口是3000以下的数据包
--sport 1000:        匹配源端口是1000以上的数据包
3.7. 按来源端口匹配(dport)

例如:

--dport 1000          匹配目的端口是1000的数据包
--dport 1000:3000     匹配目的端口是1000-3000的数据包
--dport :3000         匹配目的端口是3000以下的数据包
--dport 1000:        匹配目的端口是1000以上的数据包

注意:

1. --sport 和 --dport 必须和 -p 配合使用
2. 条件越多,匹配越精确,范围越小

数据包结构

目标端口目标ip地址内容址源端口源ip地址
80192.168.1.64xxx3211192.168.1.65

4. 动作(处理方式)

4.1. ACCEPT(接受)

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

格式: -j ACCEPT
# 允许所有访问本机ip的数据包通过

iptables -A INPUT -j ACCEPT
4.2. DROP (丢弃,不给对方任何回应)

丢弃,不允许数据包通过本链而丢弃它

格式: -j DROP
# 阻止来源地址为192.168.80.39的数据包通过本机

iptables -A FORWARD -s 192.168.80.39 -j DROP
4.3. REJECT (拒绝,给对方一个回应)

4.4. SNAT(上网)

原地址转化,snat 支持转化为单ip,也支持转化到ip地址池

格式: -j SNAT  --to IP[-IP][:端口-端口]   
适用范围: nat表的 postrouting
  • 单个地址情况
# 将内网 192.168.0.0/24的源地址修改为公网IP地址 1.1.1.1 

iptables -t nat -A POSTROUNTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
  • 多个地址情况
# 将内网 192.168.0.0/24的源地址修改为公网IP地址 1.1.1.1- 1.1.1.10

iptables -t nat -A POSTROUNTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
4.5. DNAT(端口映射)

目标地址转化,DNAT 支持转化为单ip,也支持转化到ip地址池

格式: -j DNAT  --to IP[-IP][:端口-端口]   
适用范围: nat表的 prerouting
  • 单个地址情况
# 把eth0进来的要访问TCP/80的数据包目的地址改为192.168.0.1

iptables -t nat -A PREROUNTING  -i eth0 -p tcp -dport 80   -j SNAT --to 192.168.0.1
  • 多个地址情况
# 把eth0进来的要访问TCP/80的数据包目的地址改为192.168.0.1-192.168.0.10

iptables -t nat -A PREROUNTING  -i eth0 -p tcp -dport 80   -j DNAT --to 192.168.0.1-192.168.0.10
4.6. MASQUERADE(伪装ip地址)

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

# 将源地址是192.168.0.0/24的数据包进行地址伪装,转换成eth0上的ip地址,eth0为路由器外网IP地址
iptables -t nat -A POSTROUNTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE

5. 附加模块

5.1 按包状态匹配
#格式
-m state --state 状态
状态:NEW、RELATED、ESTABLIShED、INVALID

NEW:         有别于tcp的syn
RELATED:     衍生态
ESTABLISHED: 连接状态
INVALID:    不能被识别属于哪个连接或没有任何状态
# 将连接状态为RELATED 和ESTABLISHED 的访问数据包通过
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
5.2 按来源MAC匹配
#格式
-m mac --mac-source mac地址
#阻断来自某mac 地址数据包通过本机
iptables -A FORWARD -m mac --mac-source xxxx -j DROP
5.3 按包速率匹配
#格式
-m limit --limit 匹配速率 [--burst 缓冲数量]
# 只允许192.168.0.1 一秒发送50个数据包
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
5.4 多端口匹配
#格式
-m multport <--sports|--dports|--ports>
一次行匹配多个端口,可以区分源端口,目的端口或不制定端口
# 允许所有客户端访问本服务器的21、22、 25和 80端口的服务
iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80 -j ACCEPT

注意: 必须与 -p 参数一起使用

三、网络基本拓扑图

graph LR
终端用户--> 互联网
互联网--> 防火墙
防火墙--> 路由器
路由器--> 交换机
交换机--> 服务器

四、案例

  1. 对web服务器保护
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp -m mutiport --dports 22,80 -j ACCEPT
iptables -A INPUT -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT DROP
  1. 让内网pc机上网

192.168.1.63 公网ip
192.168.2.0/24 网络不能直接上网

iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.1.63

参考

https://www.bilibili.com/video/av22230927?p=1
https://www.bilibili.com/video/av22230927?p=2
https://www.bilibili.com/video/av22230927?p=3
https://www.bilibili.com/video/av22230927?p=4
https://www.bilibili.com/video/av22230927?p=5
https://www.bilibili.com/video/av22230927?p=6
https://www.bilibili.com/video/av22230927?p=7
https://www.bilibili.com/video/av22230927?p=8

其他

使修改网络生效

sysctl -p
Logo

K8S/Kubernetes社区为您提供最前沿的新闻资讯和知识内容

更多推荐