一篇博客轻松入门iptables

原创
2017/11/20 16:54
阅读数 408

参考资料

  1. Iptables Essentials: Common Firewall Rules and Commands
  2. The Beginner’s Guide to iptables, the Linux Firewall
  3. A Deep Dive into Iptables and Netfilter Architecture

几个图

都说一图胜千言,先上几个个人认为不错的图吧

第一个图是将网络流量来了以后,Linux内核是如何流转的

第二个图是其他的人做的一个思维导图

基本概念

iptables的结构:iptables -> Tables -> Chains -> Rules. 简单地讲,tables由chains组成,而chains又由rules组成。

规则表

iptables具有内建表包含:

  • raw
  • mangle
  • nat
  • filter
  • security

规则链

iptables具有内建规则链包含:

  • PREROUTING
  • INPUT
  • FORWARD
  • OUTPUT
  • POSTROUTING

规则

iptables中的规则有以下三个要点:

  • Rules包括一个条件和一个目标(target)
  • 如果满足条件,就执行目标(target)中的规则或者特定值
  • 如果不满足条件,就判断下一条Rules

target里指定的特殊值包含(待确定):

  • ACCEPT: 接收数据包
  • DROP: 丢弃,不会给回应
  • QUEUED: 将数据包移交到用户空间
  • REJECT: 拒绝,但是会给数据包请求方回应

规则参数

每条规则都对数据包的一些属性进行了描述,用于匹配数据包。常用规则参数有:

  • [!] -p或者--protocol,可选协议有`tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or all
  • [!] -s或者--source,表示源地址,可以是一个ip,也可以是一个网段
  • [!] -d或者--destination,表示目的地址,可以是一个ip,也可以是一个网段
  • [!] -i或者--in-interface,表示接收数据包的网卡名字(一般适用于INPUT,FORWARD和PREROUTING链)
  • [!] -o或者--out-interface,表示发送数据包的网卡名字(一般适用于FORWARD,OUTPUT和POSTROUTING链)
  • -j或者--jump,描述target,表示当数据包符合规则时执行的操作。值可以是用户定义的规则链、内建target或者是一个extension
  • --sport,表示源端口(source port)针对 -p tcp 或者 -p udp
  • --dport,表示目的端口(destination port)针对-p tcp 或者 -p udp

小结

每个规则表包含的数据链情况如下:

raw:      PREROUTING                        OUTPUT
mangle:   PREROUTING    INPUT    FORWARD    OUTPUT    POSTROUTING
dnat:      PREROUTING                        OUTPUT
filter:                  INPUT    FORWARD    OUTPUT
security:                INPUT    FORWARD    OUTPUT
snat:                    INPUT                         POSTROUTING

当数据包来到机器后,数据包流程规则表的顺序为:

raw  ->  mangle  -> dnat  ->  filter ->  security  ->  snat

数据包流经规则链的顺序为:

PREROUTING  ->  INPUT  ->  FORWARD  ->  OUTPUT  ->  POSTROUTING

对于机器内的数据包,可以根据其流入/流出方向触发的规则链:

  • 外部发过来的包,并且目的地就是本机器:PREROUTING -> INPUT
  • 外部发过来的包,但目的地址不是本机器:PREROUTING -> FORWARD -> POSTROUTING
  • 本机器产生的包, :OUTPUT -> POSTROUTING

常用操作

查看现有规则

  1. 可以通过-L或者--list来查看所有规则
  2. 操作规则时通过-t参数指定要查看的数据表名
  3. 不指定默认为filter表,后面操作都有这个隐式说明
  4. 可以通过添加参数-n来将域名解析为ip地址
  5. 可以通过添加参数--line-number来将规则在规则链中的位置打印出来
# iptables -t filter|nat|mangle|raw -L

保存现有规则

# iptables-save

清除所有规则

和查看所有规则一致,也可以通过-t指定表,默认是filter表

# iptables -t filter|nat|mangle|raw -F

查看默认规则

  1. 每个规则链都有自己默认的规则
  2. 当有数据包来了,但是没有匹配的现有规则的话,iptables采用默认规则
# iptables -L | grep policy

设置默认规则

  1. 可以通过-P或者--policy选项来设置默认规则
  2. 默认规则的target只能为ACCEPT或者DROP
# iptables --policy INPUT DROP
# iptables --policy OUTPUT DROP
# iptables --policy FORWARD DROP

创建规则链

可以通过-N或者--new-chain选项来创建新的规则链,创建后可以通过-L查看所有规则链

# iptables -N custom_chain
# iptables -L

删除规则链

可以通过-X或者--delete-chain选项来删除规则链,创建后可以通过-L查看所有规则链

# iptables -X custom_chain
# iptables -L

重命名规则链

可以通过-E或者--rename-chain选项来重命名规则链,创建后可以通过-L查看所有规则链

# iptables -E custom_chain custom
# iptables -L

添加规则

  1. 可以通过-A--append或者-I--insert来添加规则
  2. -A或者-I后面紧跟需要添加规则的链名称
  3. -A将规则添加到最后面,-I则可以根据参数指定插入的位置
# iptables -I INPUT 0 -p tcp -dport 22 -s 10.0.0.1 -j ACCEPT
# iptables -A INPUT -p tcp -dport 22 -j DROP

删除规则

通过-D或者--delete选项可以删除规则

# iptables -D INPUT 1
# iptables -D -p tcp -dport 22 -j DROP

替换/修改规则

可以通过-R或者--replace选项来修改规则

# iptables -R INPUT 1 -p tcp -dport 22 -s 10.0.0.1 -j DROP

未包含内容

对于根据数据包在数据链接中的状态来进行规则的创建并未覆盖,有兴趣的可以参考资料[3]

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部