Iptables

简介:

Iptabels是与Linux内核集成的包过滤防火墙系统。事实上Iptables只是netfilter的一个客户端代理,通过iptables将用户的设定执行到netfilter。
netfilter才是防火墙真正的安全框架(framework),netfilter位于内核空间。
netfilter/iptables组成Linux平台下的包过滤防火墙,具有封包过滤、封包重定向和网络地址转换(NAT)等功能。主要工作在网络层。
虽然netfilter/iptables包过滤系统被称为单个实体,但它实际上由两个组件netfilter 和 iptables 组成。

原理:

具体原理如上图:
iptable提供五种链实现对网络数据的监控和处理,每条链上拥有一个类似于钩子程序作用的监控,当有数据包通过是检查数据包的规则进行数据的处理。

链、表、规则:

链(chains)
如上图所示,”链“ 表示的是数据流经过的一个一个的关卡,一共有五个链:PREROUTING, INPUT, FORWORD, OUTPUT, POSTROUTING

  • 到本机某进程的报文:PREROUTING -> INPUT
  • 从本机某进程出去的报文:OUTPUT -> POSTROUTING
  • 由本机转发的报文:PREROUTING -> FORWARD -> POSTROUTING

链是数据包传播的路径,每一条链其实就是众多规则中的一个检查清单,每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

表(tables):
"表" 表示的是每个链上设置的规则的分类,一共有四类,采用 -t 命令指定表

  • filter 表:负责过滤功能,防火墙;内核模块:iptable_filter
  • nat 表:网络地址转换功能;内核模块:iptable_nat
  • mangle 表:对报文进行拆分和修改;内核模块:iptable_mangle
  • raw 表:关闭 nat 表上启用的连接追踪机制:iptable_raw

表的优先级
raw——mangle——nat——filter

表和链的关系
并不是所有的链上都同时存在上面四个表,同时每个表也不会存在所有的链上,如下图

规则(rules)
规则(rules)其实就是网络管理员预定义的条件,规则一般的定义为“如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

规则命令:

- -s: 指定源地址,可以匹配多个 ip 地址,用逗号隔开,也可以指定一个 ip 段
- -d: 指定目标地址
- -p: 指定协议类型,可以是 tcp/udp/icmp/sctp/esp 等
- -i: 表示指定从哪个网卡流入的,只能用于 INPUT,PREROUTING,FORWARD 链
- -o: 表示指定从哪个网卡留出的,只能用于 OUTPUT,POSTROUTING,FORWORD 链
- -m: 指定扩展模块,可以指定扩展模块,扩展模块中可以定义一系列的匹配规则
- --dport/--sport: 表示源端口和目标端口,依赖于 tcp 扩展模块(-m tcp),而且必须指定协议 -p tcp,--dport/--sport 是 tcp 扩展模块中的一个扩展匹配条件
- -m multiport --dports 334,80:通过扩展模块 multiport 使一条规则中同时指定多个端口 

规则操作:

- -F:指定一个链,清空对应链中的所有规则
- -I: 指定一个链,表示要加入一条规则在链中,放在所有规则的首部
- -A:指定一个链,追加一条规则,放在所有规则尾部
- -D: 删除一条规则,删除规则时必须指定表和链,可以根据 --line-number 返回的行号删除,也可以根据规则具体信息(匹配规则和动作)删除
- -S:指定链,查看规则定义,有时候我们想直接使用已有规则进行复制产生新的规则,可以使用 -S
- -P: 指定一个链,给某个链设置默认规则

规则动作:
通过 -j 命令实现动作

ACCEPT 将数据包放行,进行完此处理动作后,将不再比对其它规则,直接跳往下一个规则链(natostrouting)。

REJECT 拦阻该数据包,并传送数据包通知对方,可以传送的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接 中断过滤程序。 范例如下:
iptables -A FORWARD -p TCP --dport 22 -j REJECT --reject-with tcp-reset

DROP 丢弃包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。

REDIRECT 将包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。 这个功能可以用来实作通透式porxy 或用来保护 web 服务器。例如:
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080

MASQUERADE 改写数据包来源 IP为防火墙 NIC IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则(mangleostrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨号连接时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:linux基础
iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 1024-31000

LOG 将封包相关讯息纪录在 /var/log 中,详细位置请查阅 /etc/syslog.conf 配置文件,进行完此处理动作后,将会继续比对其规则。例如:
iptables -A INPUT -p tcp -j LOG --log-prefix "INPUT packets"

SNAT 改写封包来源 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将直接跳往下一个规则(mangleostrouting)。范例如下:
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 194.236.50.155-194.236.50.160:1024-32000

DNAT 改写封包目的地 IP 为某特定 IP 或 IP 范围,可以指定 port 对应的范围,进行完此处理动作后,将会直接跳往下一个规炼(filter:input 或 filter:forward)。范例如下:
iptables -t nat -A PREROUTING -p tcp -d 15.45.23.67 --dport 80 -j DNAT --to-destination
192.168.1.1-192.168.1.10:80-100

MIRROR 镜像数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包送回,进行完此处理动作后,将会中断过滤程序。

QUEUE 中断过滤程序,将数据包放入队列,交给其它程序处理。透过自行开发的处理程序,可以进行其它应用,例如:计算联机费.......等。

RETURN 结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则链看成是一个子程序,那么这个动作,就相当提早结束子程序并返回到主程序中。

MARK 将数据包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 2

总结:

最后引用网上截图总结数据包经过防火墙流程:

发表评论

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Captcha Code