关于Iptable的学习,学习资料主要摘自如下网站:https://blog.konghy.cn/2019/07/21/iptables/,感谢“旷世的忧伤”博主
iptables
是 Linux 系统上的 IP 信息包过滤系统。
一.表/链/规则
“表"(table)中含有“链”(chain),“链”中又含有“规则”(rules)
1.表(table)
表总共有五类,分别是raw、fliter、nat、mangle、security。常用的为filter(过滤表)、nat和mangle
表 | 作用 |
---|---|
Fliter | 为 iptables 默认的表,在操作时如果没有指定使用哪个表,iptables 默认使用 filter 表来执行所有的命令。filter 表根据预定义的一组规则过滤符合条件的数据包。在 filter 表中只允许对数据包进行接收、丢弃的操作,而无法对数据包进行更改 |
NAT | 即 Network Address Translation,主要是用于网络地址转换(例如:端口转发),该表可以实现一对一、一对多、多对多等 NAT 工作 |
Mangle | 主要用于对指定包的传输特性进行修改。某些特殊应用可能需要改写数据包的一些传输特性,例如更改数据包的 TTL 和 TOS 等 |
表的匹配顺序为:Mangle→NAT→Fliter
2.链(chain)
链是数据包传输的路径,对应着报文的五个行动方向(INPUT、OUTPUT、FORWARD...),也就是说,一个表中,可以有五个链:
INPUT | 处理入站数据包,当接收到访问本机地址的数据包(入站)时,应用此链中的规则 |
OUTPUT | 处理出站数据包,当本机向外发送数据包(出站)时,应用此链中的规则 |
FORWARD | 处理转发数据包,当接收到需要通过本机发送给其他地址的数据包(转发)时,应用此链中的规则 |
PREROUTING | 在对数据包作路由选择之前,应用此链中的规则 |
POSTROUTING | 在对数据包作路由选择之后,应用此链中的规则 |
一个报文到来时,根据对应的方向从一个链中的第一个规则开始过滤,直到最后一个规则,如果没有匹配的规则,则执行默认的规则
INPUT, OUTPUT 链更多的应用在本机的网络控制中,即主要针对本机进出数据的安全控制。而 FORWARD, PREROUTING, POSTROUTING 链更多地应用在对主机对于整个网络的控制中,特别是机器作为网关使用时的情况。
Ⅰ.Filter
Filter表的内建链为:INPUT、OUTPUT、FORWAND
Ⅱ.NAT
NAT包含的内建链为:
- PREROUTING 链 – 处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标 IP 地址(destination ip address),通常用于 DNAT(destination NAT),主要还是外网转内网时使用(进)。
- POSTROUTING 链 – 处理即将离开本机的数据包。它会转换数据包中的源 IP 地址(source ip address),通常用于 SNAT(source NAT),主要是内网转外网的时候使用(出)。
- OUTPUT 链 – 处理本机产生的数据包
3.规则(rules)
处理动作(target) 也分为基本动作和扩展动作。以下列举一些常用的动作:
- ACCEPT: 允许数据包通过
- DROP: 直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应
- QUEUE: 将数据包移交到用户空间
- RETURN: 停止执行当前链中的后续规则,并返回到调用链(The Calling Chain)中
- REJECT: 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息
- DNAT: 目标地址转换
- SNAT: 源地址转换,解决内网用户用同一个公网地址上网的问题
- MASQUERADE: 是 SNAT 的一种特殊形式,适用于动态的、临时会变的 ip 上
- REDIRECT: 在本机做端口映射
- LOG: 记录日志信息,除记录外不对数据包做任何其他操作,仍然匹配下一条规则
总之,记住数据包的处理顺序为:
- 1、一条规则包括一个条件和一个动作(target)
- 2、如果满足条件,就执行处理动作
- 3、如果不满足条件,就继续匹配下一条规则
4.数据包流向

- 本机发出的包:本机进程 -> OUTPUT 链 -> 路由选择 -> POSTROUTING 链 -> 出口网卡
- 本机收到的包:入口网卡 -> PREROUTING 链 -> 路由选择 -> 此时有两种可能的情况:
- 目的地址为本机:INPUT 链 -> 本机进程
- 目的地址不为本机:FORWARD 链 -> POSTROUTING 链 -> 网卡出口(内核允许网卡转发的情况下)
二.Iptables常用命令
1.查看Iptable服务是否启动
命令格式:service iptable status
2.查看当前的规则表
命令格式:iptable -nL --line-number
3.制定规则
命令格式:iptable 【-t 表】 【命令选项】【报文的行动方向】【匹配选项】【操作选项】
例如:iptable -t filiter -A INPUT -s 10.10.10.0/24 -j ACCEPT #在fliter这个表中添加一个入站链规则
Ⅰ.【命令选项】
-A --append | 在指定链的末尾添加一条新的规则 |
-D --delete | 删除指定链中的某一条规则,按规则序号或内容确定要删除的规则 |
-I --insert | 在指定链中插入一条新的规则,默认在链的开头插入 |
-R --replace | 修改、替换指定链中的一条规则,按规则序号或内容确定 |
-F --flush | 清空指定链中的所有规则,默认清空表中所有链的内容 |
-N --new | 新建一条用户自己定义的规则链 |
-X --delete-chain | 删除指定表中用户自定义的规则链 |
-P --policy | 设置指定链的默认策略 |
-Z, --zero | 把指定链或表中的所有链上的所有计数器清零 |
-L --list | 列出指定链中的所有的规则进行查看,默认列出表中所有链的内容 |
-S --list-rules | 以原始格式列出链中所有规则 |
-v --verbose | 查看规则列表时显示详细的信息 |
-n --numeric | 用数字形式显示输出结果,如显示主机的 IP 地址而不是主机名 |
--line-number | 查看规则列表时,同时显示规则在链中的顺序号 |
Ⅱ.【报文的行动方向】
INPUT | 处理入站数据包,当接收到访问本机地址的数据包(入站)时,应用此链中的规则 |
OUTPUT | 处理出站数据包,当本机向外发送数据包(出站)时,应用此链中的规则 |
FORWORD | 处理转发数据包,当接收到需要通过本机发送给其他地址的数据包(转发)时,应用此链中的规则 |
Ⅲ.【匹配选项】
-i --in-interface | 匹配输入接口,如 eth0,eth1 |
-o --out-interface | 匹配输出接口 |
-p --proto | 匹配协议类型,如 TCP、UDP 和 ICMP等 |
-s --source | 匹配的源地址 |
--sport | 匹配的源端口号 |
-d --destination | 匹配的目的地址 |
--dport | 匹配的目的端口号 |
-m --match | 匹配规则所使用的过滤模块 |
例如:iptable -A INPUT -i eth1 -s 10.10.10.0/24 -j REJECT
Ⅳ.【操作选项】
ACCEPT | 允许数据包通过 |
REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息 |
QUEUE | 将数据包移交到用户空间 |
RETURN | 停止执行当前链中的后续规则,并返回到调用链(The Calling Chain)中 |
DROP | 直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应 |
DNAT | 目标地址转换 |
SNAT | 源地址转换,解决内网用户用同一个公网地址上网的问题 |
MASQUERADE | 是 SNAT 的一种特殊形式,适用于动态的、临时会变的 ip 上 |
REDIRECT | 在本机做端口映射 |
LOG | 记录日志信息,除记录外不对数据包做任何其他操作,仍然匹配下一条规则 |
4.常用命令收集
iptables -A INPUT -j ACCEPT #同意所有包的进出
iptables -A INPUT -s 10.10.10.0/24 -d 135.15.15.0/24 -j REJECT
iptables -D INPUT 1 #删除入站的第一条规则
iptables -A INPUT --dport 80 -j ACCEPT #匹配入站的目的端口为80的报文,动作为同意
iptables -F #清除链中的所有规则
iptables -X #删除用户定义的链
iptables -P #设定默认规则
例如:iptables -P INPUT DROP #默认入包如果没有规则匹配,则丢弃数据包
iptables -P OUTPUT ACCEPT #默认出包没有匹配规则,则允许发送
iptables -P FORWARD ACCEPT #默认转发的包没有匹配规则,则允许发送
/etc/init . d/iptables save #保存设定好的防火墙规则,存入主机中,这样重启防火墙后也不会消失
service iptables start/stop/restart #启动/关闭/重启 防火墙
# 保存当前规则
iptables-save > iptables.20190721
# 恢复备份规则
iptables-restore < iptables.20190721
三.NAT专题
本专题主要是记录,路过想让一台服务器充当ROUTE的话,需要怎么做。
注意:设定NAT一定要在NAT表中设定,不能在Fliter表中设定
1.SNAT(源地址转换,出)
我的服务器的eth0网卡连接着公网,我想用这个网卡来做转发,让我172.16.1.0/24这个网段的内网机子能访问外网
#首先要打开机子的网卡转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
#建立NAT规则
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j MASQUERADE(SNAT的特殊形式,用于动态IP)
#或者,也可以设置转换成一个固定的IP,例如10.10.10.1
iptable -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to 10.10.10.1
2.DNAT(目的地址转换,进)
我的一台172.168.1.0/24网段的机子想访问10.10.10.1网段的机子80端口的服务,但是没有路由,所以我想用一台服务器来当route,用这台服务器eth0网口的(或者是ip 172.168.1.1)8080端口来做一个端口映射+转发。
#首先要打开机子的网卡转发功能
echo 1 > /proc/sys/net/ipv4/ip_forward
#建立NAT规则,这条是用eth0来转发
iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 8080 -j DNAT --to 10.10.10.1:80
#这条是用一个固定ip来转发,也就是访问这个ip的8080端口,可以跳转到目的ip的80端口
iptables -t nat -A PREROUTING -p tcp -d 172.168.1.1 --dport 8080 -j DNAT --to 10.10.10.1:80
#保存设置
/etc/init . d/iptables save #保存设定好的防火墙规则,存入主机中,这样重启防火墙后也不会消失
service iptables start/stop/restart #启动/关闭/重启 防火墙
Comments NOTHING