iptables

iptables是设置包过滤规则的工具,真正提供过滤功能的是Netfilter。

Netfilter

在Linux内核设立检查点(hook),供核心模块注册使用,这样便可对网络层中每一个通过检查点的包进行过滤,决定要允许通过或予以丢弃。

由于内核的子系统位于系统保护区,用户无法直接操作,Netfilter便提供一个用户态空间下的工具iptables,利用iptables便可以在各个检查点建立规则,对包进行过滤。

ubuntu下没有关闭iptables的方法,只能通过清除规则来完成,不过在清除规则之前要确保所有表的所有链的默认处置都是ACCEPT,免得连不上机器。

iptables

iptables内置有3个表(table),分别是filter、nat、mangle。各表内置有若干个链(chain)。

对每一个报文,iptables依次测试每一条规则,看报文与规则是否相匹配。一旦找到一条匹配的规则,就根据此规则中指定的行动,对报文进行处置,而对后面的规则不再进行测试。

filter表

主要用来过滤包,是iptables默认的规则表。filter表内置的链:


链                 说明
INPUT            过滤目的地是本机的包
FORWARD     不是本机产生的包,目的地是其他主机
OUTPUT         过滤本机产生的包

nat表

主要作用是包地址转换。nat表内置的链有:


链                        说明
PREROUTING         包到达网络接口时,改写其目的地址
OUTPUT                改写本机产生的包的目的地址
POSTROUTING      包要离开主机前,改写其来源地址

mangle表

主要作用是修改包的表头和内容,如改变MARK、TOS和TTL等。内置的链有:


链                        说明
PREROUTING         进入防火墙后、路由判断前,对包进行修改
INPUT                   包经过路由判断后,在本机进程接收到它之前,对包进行修改
OUTPUT                本机产生的包,在决定包目的地址之后,对包进行修改
FORWARD             路由判断之后,要到另一个接口之前,对包进行修改
POSTROUTING      路由判断之后,要离开主机之前,对包进行修改

iptables语法

iptables的语法由3部分组成:iptables命令本身、条件判断、对包的处置方式(称为target)。
iptables语法组成

注意:所有链 名必须大写,表名必须小写,动作必须大写,匹配必须小写

iptables的主要参数

  • -A:向规则链中添加一个规则,默认被添加到末尾。
  • -T:指定要操作的表,默认是filter。
  • -D:从规则链中删除规则,可以指定序号或者匹配的规则来删除。例如 iptables -D INPUT 3(按号码匹配)将删除 filter 表 INPUT 链中的第三条规则(不管它的内容是什么)
  • -R:进行规则替换。例如 iptables -R INPUT 9 -j ACCEPT 将原来编号为 9 的规则内容替换为“-j ACCEPT”。
  • -I:插入一条规则,默认被插入到首部。
  • -F:清空所选的链,重启后恢复。
  • -P:设置某个链的默认规则。如iptables -P INPUT DROP将filter表的INPUT链的默认规则设为DROP。
  • -N:新建用户自定义的规则链。
  • -X:删除用户自定义的规则链。
  • -p:对比协议,可以是tcp, udp, icmp等,也可以是数字的协议号。
  • -s:指定源地址。
  • -d:指定目的地址。
  • -i:进入接口。
  • -o:流出接口。
  • -j:采取的动作。可以是ACCEPT, DROP, SNAT, DNAT, MASQUERADE
  • -sport port:源端口。
  • -dport port:目的端口,端口必须和协议一起配合使用。
  • --tcp-flags:对比TCP状态,可以有:SYN(同步)、ACK(应答)、FIN(结束)、RST(重设)、URG(紧急)、PSH(强迫推送)等,还可以使用ALL、NONE进行对比。例如:iptables -p tcp --tcp-flags SYN,FIN,ACK SYN
  • --icmp-type:对比ICMP的类型编号,可以使用代码或数字编号进行对比。如:iptables -A INPUT -p icmp --icmp-type 8
  • -m limit --limit:用来对比某段时间内包的平均流量。iptables -A INPUT -m limit --limit 3/sec用来对比每秒平均流量是否超过一次3个包。
  • -m state --state:根据状态进行对比。如iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT允许已建立的连接接收数据。

在添加的规则时,REJECT(拒绝)目标和 DROP(放弃)目标这两种行动有所不同。REJECT 会拒绝目标分组的进入,并给企图连接服务的用户返回一个 connection refused 的错误消息。DROP 会放弃分组,而对 telnet 用户不发出任何警告。

保存配置

机器重启后,iptables中的配置信息会被清空。iptables-saveiptables-restore是用来保存和恢复设置的。 可以在/etc/network/interfaces文件中添加2行:


pre-up    iptables-restore  <   /etc/iptables.up.rules
post-down   iptables-save  >  /etc/iptables.up.rules

举例

iptables -L -n -v:显示防火墙的运行状态。-L列出规则,-v显示详细信息,-n以数字形式显示IP和端口,不使用DNS解析。

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 允许已建立的连接接收数据。

iptables -A INPUT -p tcp -i eth0 --dport ssh -j ACCEPT:允许接收到的所有目标端口为22的TCP报文通过。

iptables -A INPUT -p tcp -i eth0 --dport 80 -j ACCEPT:开启80端口。

iptables -I INPUT -s 172.16.0.201 -j DROP:屏蔽指定IP的访问。

iptables -I INPUT -p tcp --dport 80 -s 172.16.0.201/24 -j DROP:屏蔽指定IP段( 172.16.0 )的访问。

iptables -D INPUT -p tcp --dport 80 -s 172.16.0.201/24 -j DROP:解除屏蔽。

-A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m limit --limit 1/sec -j ACCEPT: 屏蔽 SYN_RECV 的连接。

-A FORWARD -f -m limit --limit 100/sec --limit-burst 100 -j ACCEPT: 限制IP碎片,每秒钟只允许100个碎片,用来防止DoS攻击。

-A FORWARD -p icmp -m limit --limit 1/sec --limit-burst 10 -j ACCEPT: 限制ping包每秒一个,10个后重新开始。

-A FORWARD -p icmp -m icmp --icmp-type 8 -m limit --limit 1/sec -j ACCEPT: 限制ICMP包回应请求每秒一个。


欢迎关注我的微信公众号: coderbee笔记,可以更及时回复你的讨论。

发表回复

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

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据