山楂片的博客

山楂片的博客

山楂片的博客

马上订阅 山楂片的博客 RSS 更新: https://szp15.com/index.xml

iptables教程

2020年7月10日 00:39

这篇文章深入地探讨了Linux的防火墙iptables的使用方法。主要内容参考自An In-Depth Guide to iptables, the Linux Firewall - Boolean World

iptables如何工作

iptabels是netfilter包过滤系统的命令行界面。本文中用iptables统称iptables及netfilter。

iptables有3种结构组成表(table)、链(chain)和目标(target)。表可以被用于指定处理包的方法,默认的表是filter,也有其他的表。

链归属于某个表,链被用于检查匹配一些包,并将它传给一个目标。目标决定了包的命运,例如接受或拒绝。

iptables会在链中逐一匹配规则,如果规则匹配了,就会跳转到对应的目标。否则,改链的默认政策(default policy)会被使用。默认政策也是一个目标。所有链的默认政策默认是接受。

在现代Linux中,有四张表:

  • filter:最常见的表,用于过滤包。
  • mangle:用于该表包的头,如TTL信息。
  • nat:允许通过修改包的目标和源构建NAT网络,如将内网的服务暴露给公网。
  • raw:iptables是一个有状态的防火墙。raw表使得你能够在内核追踪状态前,处理一些包。你也可以使某些包免于状态追踪。

除此之外,一些内核有别的表。如SELinux有security表。

某个表由几个默认的链组成。它们可以使:

  • PREROUTING:应用于刚从网络上抵达的包,出现在natmangleraw表中。
  • INPUT:应用于即将抵达本地进程的包,出现在manglefilter表中。
  • OUTPUT:应用于本地进程产生的包,出现在rawmanglenatfilter表中。
  • FORWARD:应用于略过主机的包,出现在manglefilter表中。 -POSTROUTING:应用于即将从网络上离开的包,出现在natmangle表中。

iptables流程图

目标

一些目标是终结的,也就是说它们立刻决定了包的命运。常见的有:

  • ACCEPT:iptables会接受该包。
  • DROP:iptables会丢弃包,就好像系统未曾接收到包。
  • REJECT:iptables会拒绝包,对于TCP会发送connection reset,对于UDP和ICMP会发送destination host unreachable。

另一些目标是非终结的。例如LOG目标,用于输出包的信息到内核日志。

此外你也可以创建自定义的链。

关于iptabels命令的一点说明

有两种网络协议,IPv4和IPv6。这两个协议是不同的,因而iptables为IPv4 提供了iptables命令,为IPv6提供了ip6tables命令。

这两个命令接受的参数差别不大。此外你需要以root身份运行这些命令。

屏蔽IP

屏蔽59.45.175.62发来的包可以采用下面的命令:

iptables -t filter -A INPUT -s 59.45.175.62 -j REJECT

-t参数指定规则在哪个表中,-A参数是说在哪个链的最后添加。-s是指定源IP,-j是说跳转到哪个目标。

-t filter可以省略,因为filter是默认表。

也可以采用CIDR记号指定源IP,类似-s 59.45.175.0/24

类似地,屏蔽前往31.13.78.35的包:

iptables -A OUTPUT -d 31.13.78.35 -j DROP

列出规则

使用-L开关可以列出某个表中的所有链和规则,使用--line-numbers可以标记行号。你也可以用-t指定显示哪个表。

iptables会对IP采用DNS查询。这通常是不必要,且使命令缓慢。使用-n开关可以组织这个行为。

删除规则

-A chain命令替换成-D chain命令就可以删除规则。此外,-D chain rulenum还可以接受第二个可选的参数,就是行号,可以用于删除指定行的规则。当你删除规则时,其后的规则行号会减少,所以一般从后往前删除规则。

使用-F [chain]后面跟链名,可以删除该链的所有规则。

插入和替换规则

使用-I chain [rulenum]命令可以插入规则到最开始或者指定的行号,行号从1开始计数。也可以使用-R chain rulenum命令替换掉某个行的规则。

协议和模块

使用-p...

剩余内容已隐藏

查看完整文章以阅读更多