iptables:强大的防火墙工具

2019-05-26  本文已影响0人  dshowing

iptables是内置于多数发行版中的网络防火墙包过滤器。我也不知道该怎么解释,,别看很轻量化,但是功能很强大~
iptables的引入是用来替换掉老的ipchains,ipclains在Linux内核2.2系列中使用,用来作为封包过滤和防火墙的功能。但是ipchains的功能和定制化很局限。在Linux内核2.3系列开始引入了netfilter项目,其中iptables防火墙就是这个项目的一部分,在2.4内核中iptables取代了先前的ipchains作为内置的包过滤器。
对于iptables的历史我没有深究,这篇博客重点在于iptables的用法和规则设定。在网上简单了解一下发现,Linux包过滤功能的历史并不长,本篇参考了以下几个地方的内容:

iptables工作机制

iptables分为五个规则链:

和四个表:

主机数据流

其中每个表对应多个链,都有不同,这是每个表的默认规则链:

iptables的策略

规则链确定了作用的位置;而表则划分出了不同的功能。filter表主要是过滤的功能,针对特定的IP、端口、网段进行限制;nat表主要定义地址转换的功能等。
iptables的策略主要分为两种:“通”策略和“堵”策略:

  1. 通策略,默认门是关着的,即默认规则为DROP,根据需要进行放行。
  2. 堵策略,默认门是开着的,即默认规则为ACCEPT,根据需要拦截数据包。

注意iptables的规则是严格按照先后顺序执行的,所以要将比较严格的规则前置,检查规则的时候是由上向下的顺序。
此外,iptables还支持自定义链,必须跟某种特定的链关联起来,在此先不做讨论。

iptables规则语法

iptables的命令格式:

iptables -t [tables] COMMAND chain rules -j ACTION

E.g.
禁止123.123.123.123地址对本机80端口的访问:

iptables -t filter -A INPUT -s 123.123.123.123 -p tcp --dport 80 -j DROP
iptables -t filter -A INPUT -s 123.123.123.123 -p tcp --dport 80 -j REJECT

默认OUTPUT链为“关”:

iptables -P OUTPUT DROP

查看详细规则:

iptables -L -n -v

COMMAND部分详解

链管理命令(立即生效)

-P:设置默认策略:开&&关

iptables -P OUTPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P OUTPUT REJECT

决定OUTPUT链默认接收或丢弃。不同的是REJECT是直接丢弃,而DROP是悄悄丢弃数据包。这在扫描端口的时候会有差别。

-F:清空规则链

iptables -t nat -F
iptables -F INPUT

分别是清空nat表的规则和清空filter表的INPUT链规则。
注意:由于是立即生效的命令,因此在清空filter表时先确定没有默认DROP的链,否则敲完回车后就会将你拒之门外了。有控制台还好,没有的话就麻烦的很了

-N:新建一个自定义链

iptables -N inboard_tcp_web

-X:用于删除用户自定义的空链
删除空链,因此删除之前最好先执行iptables -F

-E:用来给自定义链重命名

iptables -E oldname newname

-Z:清空链。清空链以及链默认规则的计数器:1.匹配数据吧个数;2.多少字节。

iptables -Z

规则管理命令

-A:追加规则。当前链的规则后新加一条规则。(iptables执行有前后顺序)
-I [num]:插入规则。插入为第几条规则

iptabels -t filter -I 1 -s 192.168.1.106 -p tcp --dport 80 -j DROP

-R [num]:替换。替换(修改)为第几条规则。相当于bash中的mv命令。
-D [num]:删除。删除第几条规则。

查看规则命令

iptables -L

子命令:

关于规则匹配

地址匹配

协议匹配

-p tcp:匹配TCP通信协议:

-p tcp --tcp-flags 指定TCP的标志位(SYN,ACK,FIN,PSH,RST,URG)。一般格式如下:

iptables -A INPUT -p tcp --tcpflags syn,ack,fin,rst  syn  ...
iptables -A INPUT -p tcp --syn  ...

一般分为前后两部分:syn,ack,fin,rst表示受检查的标志位;syn表示匹配必须为1的标志位,而且其他的必须为零。常用来匹配三次握手的第一个数据包。另一种写法是直接写成--syn

-p udp:匹配UDP通信协议(同tcp):

-p icmp:匹配icmp数据包,通常是ping包:

E.g.
以下操作中INPUT,OUTPUT默认丢弃
开放本机icmp请求权限:

iptables -A OUTPUT -s 192.168.1.100 -p icmp --icmp-type 8 -j ACCEPT

但是此时仍无反应,接下来开放本机的icmp应答权限:

iptables -A INPUT -d 192.168.1.100 -p icmp --icmp-type 0 -j ACCEPT

这时候就会成功ping通外部机器。但是此时外部主机是ping不通本机的,这就需要分别在INPUT和OUTPUT上做相反的规则,在此不做赘述。

-m 启用扩展模块:

ACTION部分

DROP:悄悄丢弃。一般使用DROP,效果与REJECT相同,可以隐藏身份和防火墙结构。
REJECT:明示拒绝,端口扫描显示被拒绝。
ACCEPT:接收数据包。

这三个是常用动作,续更…

状态检测

通常,对于整个TCP协议来讲,是一个保持连接的通信协议。在三次握手四次挥手过程中,第一次握手称之为NEW连接;从第二次握手以后,标志位ack都等于1,称之为已建立的连接:ESTABLISH;类似FTP连接,监听端口独立于数据传输端口而存在,包括20,21两个端口,我们称之为RELATED;对于我们无法识别的状态,称之为INVALID。

这样做,可以指定源地址可以连接,禁用其他连接:

iptables -A INPUT -s 192.168.1.106/24 -d 192.168.1.100 -p tcp --dport 22 -m state --state NEW,ESTABLISH -j ACCEPT
iptables -A OUTPUT -d 192.168.1.106 -m state --state ESTABLISH -j ACCEPT
iptables -P INPUT DROP
iptables -P OUTPUT DROP

在OUTPUT链仅开放192.168.1.106的规则太严格了,如果需要其他连接,可以改成这样:

iptables -R OUTPUT 1 -m state --state ESTABLISH -j ACCEPT
上一篇下一篇

猜你喜欢

热点阅读