iptables

作者 chris.Yun 日期 2018-06-06
iptables

云主机设置防火墙的时候需要用到iptables命令,正好自己不是很熟悉,网上学习了一番,顺便做一个总结。

iptables是一个命令行工具,操作人员通过iptables命令将防火墙配置设定到真正的安全框架Netfilter中。Netfilter是Linux 2.4.x引入的一个子系统,Netfilter提供的是一套HOOK框架,其优势是易于扩充。

链 Chain

Netfilter在IPv4协议中定义了5个HOOK函数,这些钩子函数在数据报流过协议栈的5个关键点被调用。iptables利用这些HOOK将其对应到规则链表中,对消息数据进行规则匹配及筛选。

iptables

PREROUTING

所有发给主机的报文先被该链处理。

INPUT

目的地为本机的报文经过PREROUTING后,被该链处理。PREROUTING -> INPUT -> 应用。
通常我们设置的防火墙规则都是在这个链上。

OUTPUT

本机发出的报文先被该链处理。

FORWARD

本机转发的报文经过PREROUTING后,被该链处理。PREROUTING -> FORWARD -> POSTROUTING。

POSTROUTING

报文(本机或非本机)在离开主机之前,最后被该链处理。

表 table

将具有相同功能的规则集合叫做”表”,iptables定义了四种表,也就意味着我们定义的规则都在这四个分类中。

filter

负责过滤、防火墙功能。

nat

负责网络地址转换功能。

mangle

负责拆解报文、修改报文、重新封装报文的功能。

raw

关闭nat表上启用的连接追踪机制。

表链关系

链与表的关系,执行顺序为raw -> mangle -> nat -> filter

  • PREROUTING的规则存在于:raw表、mangle表、nat表
  • INPUT的规则存在于:mangle表、filter表(centos7中还有nat表)
  • OUTPUT的规则存在于:raw表、mangle表、nat表、filter表
  • FORWARD的规则存在于:mangle表、filter表
  • POSTROUTING的规则存在于:mangle表、nat表

表与链的关系,实际配置中更关心该关系

  • raw:PREROUTING、OUTPUT
  • mangle:PREROUTING、INPUT、FORWARD、OUTPUT、POSTROUTING
  • nat:PREROUTING、OUTPUT、POSTROUTING(centos7中还有INPUT)
  • filter:INPUT、FORWARD、OUTPUT

规则的顺序很重要,排名靠前的规则先执行,如果不符合拒绝或者丢弃,则后面的规则都没有机会执行了。

处理动作

  • ACCEPT:允许数据包通过
  • DROP:直接丢弃数据包,请求方会等到超时
  • REJECT:拒绝数据包通过,必要时会给数据的发送方一个响应
  • SNAT:源地址转换,解决内网用户用同一个公网上网的问题
  • MASQUERADE:是SNAT的一种特殊形式,适用于动态、临时IP
  • DNAT:目标地址转换
  • REDIRECT:在本机做端口映射
  • LOG:在/var/log/messages文件中记录日志信息

命令

实际操作中设置的相关规则都是在filter表的INPUT链中。

iptables-command

相关规则查询

iptables -t filter/nat/mangle/raw -L #查询表的规则
iptables -L INPUT #查询链的规则,省略-t默认为filter
iptables --line -nvL #查询详细信息

规则配置

# 新增
iptables -A INPUT -p icmp -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
iptables -A INPUT -s 192.168.1.102 -j ACCEPT
# -I insert头部插入 -A append尾部追加
iptables -I INPUT -j DROP   

# 删除
iptables -t filter -D INPUT 1
iptables -D INPUT -s 192.168.1.102 -j ACCEPT
# 删除指定链下的所有表规则
iptables -t 表名 -F 链名 

# 修改
iptables -t filter -R INPUT 1 -s 192.168.1.102 -j REJECT

# 修改链的默认策略
iptables -t filter -P FORWARD DROP

iptables命令

service iptables save #会将配置刷到文件中,下次重启后配置还在
service iptables restart

配置文件

配置文件位置/etc/sysconfig/iptables,第一次执行save命令会生成该文件,格式如下:

# Generated by iptables-save v1.4.7 on Wed Jun  6 04:35:36 2018
*raw
:PREROUTING ACCEPT [2705:175227]
:OUTPUT ACCEPT [2150:166613]
COMMIT
# Completed on Wed Jun  6 04:35:36 2018
# Generated by iptables-save v1.4.7 on Wed Jun  6 04:35:36 2018
*nat
:PREROUTING ACCEPT [1339:62046]
:POSTROUTING ACCEPT [5:357]
:OUTPUT ACCEPT [5:357]
COMMIT
# Completed on Wed Jun  6 04:35:36 2018
# Generated by iptables-save v1.4.7 on Wed Jun  6 04:35:36 2018
*mangle
:PREROUTING ACCEPT [2705:175227]
:INPUT ACCEPT [2705:175227]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [2150:166613]
:POSTROUTING ACCEPT [2150:166613]
COMMIT
# Completed on Wed Jun  6 04:35:36 2018
# Generated by iptables-save v1.4.7 on Wed Jun  6 04:35:36 2018
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [187:22349]
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT 
-A INPUT -p tcp -m tcp --dport 28207 -j ACCEPT 
-A INPUT -p icmp -j ACCEPT
-A INPUT -j DROP 
COMMIT
# Completed on Wed Jun  6 04:35:36 2018