关于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 #启动/关闭/重启 防火墙