iptables 初步入门

jopen 10年前

iptables

防火墙简述

新的防火墙子系统/包过滤引擎 Nftables 将在 Linux 3.13 中替代有十多年历史的iptables。iptables/netfilter在2001年加入到2.4内核中。诞生于2008年的 NFTables 设计替代 iptables, 它提供了一个更简单的kernel ABI,减少重复代码,改进错误报告,更有效的支持过滤规则。除了iptables,NFTables还将替代ip6tables、arptables和 ebtables。Linux内核的第一代包过滤机制是ipfwadm(1.2.1内核,1995年),之后是ipchains(1999 年),Netfilter,Nftables是第四代。

iptables基础

Netfilter/IPTables是继2.0.x的IPfwadm、2.2.x的IPchains之后,新一代的Linux防火墙机制。 Netfilter采用模块化设计,具有良好的可扩充性。其重要工具模块IPTables连接到Netfilter的架构中,并允许使用者对数据报进行过滤、地址转换、处理等操作。
Netfilter提供了一个框架,将对网络代码的直接干涉降到最低,并允许用规定的接口将其他包处理代码以模块的形式添加到内核中,具有极强的灵活性。

Netfilter/IPTables的体系结构可以分为三个大部分:

  • Netfilter的HOOK机制
    Netfilter的通用框架不依赖于具体的协议,而是为每种网络协议定义一套HOOK函数。这些HOOK函数在数据报经过协议栈的几个关键点时被调用,在这几个点中,协议栈将数据报及HOOK函数标号作为参数,传递给Netfilter框架。
    对于它在网络堆栈中增加的这些HOOK,内核的任何模块可以对每种协议的一个或多个HOOK进行注册,实现挂接。这样当某个数据报被传递给 Netfilter框架时,内核能检测到是否有任何模块对该协议和HOOK函数进行了注册。若注册了,则调用该模块的注册时使用的回调函数,这样这些模块就有机会检查、修改、丢弃该数据报及指示Netfilter将该数据报传入用户空间的队列。
    这样,HOOK提供了一种方便的机制:在数据报通过Linux内核的不同位置上截获和操作处理数据报。
  • IPTables基础模块
    IPTables基础模块实现了三个表来筛选各种数据报,具体地讲,Linux2.4内核提供的这三种数据报的处理功能是相互间独立的模块,都基于Netfilter的HOOK函数和各种表、链实现。这三个表包括:filter表,nat表以及mangle表。
  • 具体功能模块
    数据报过滤模块
    连接跟踪模块(Conntrack)
    网络地址转换模块(NAT)
    数据报修改模块(mangle)
    ** 其它高级功能模块

iptables 的启动停止

ubuntu中启动及关闭iptables,在ubuntu中由于不存在 /etc/init.d/iptales文件,所以无法使用service等命令来启动iptables,需要用modprobe命令。

启动iptables

modprobe ip_tables  iptable-restore < /etc/iptables.rule

关闭iptables

iptables -F  iptables -X  iptables -Z  iptables -P INPUT ACCEPT  iptables -P OUTPUT ACCEPT  iptables -P FORWARD ACCEPT  modprobe -r ip_tables

命令基本格式

iptables 语法分成三部分:

命令本身            条件准则            处置方式  iptables -A INPUT  -p tcp --dport 22   -j ACCEPT
  • 列出当前iptables的策略和规则
    iptables -L      # --list 列出当前所有table的配置规则  iptables -L -n   # -n: 用数字形式显示  iptables -L -v   # -v: 打印详细的信息  iptables -F      # 清除规则  iptables -X      #

实例:限定指定IP段访问服务器的80端口

  • 命令操作:
iptables -A INPUT -s 118.144.38.90/32 -p tcp -m multiport --dports 80 -j ACCEPT  iptables -A INPUT -s -p tcp -m multiport --dports 80 -j DROP
  • 查看状态 iptables -L
Chain INPUT (policy ACCEPT)  target     prot opt source               destination  ACCEPT     tcp  --  118.144.38.90        anywhere             multiport dports http  DROP       tcp  --  anywhere             anywhere             multiport dports http    Chain FORWARD (policy ACCEPT)  target     prot opt source               destination    Chain OUTPUT (policy ACCEPT)  target     prot opt source               destination
  • 查看状态 iptables-save
# Generated by iptables-save v1.4.12 on Tue Apr 22 14:55:51 2014  *filter  :INPUT ACCEPT [1689:106559]  :FORWARD ACCEPT [0:0]  :OUTPUT ACCEPT [1608:154769]  -A INPUT -s 118.144.38.90/32 -p tcp -m multiport --dports 80 -j ACCEPT  -A INPUT -p tcp -m multiport --dports 80 -j DROP  COMMIT  # Completed on Tue Apr 22 14:55:51 2014  # Generated by iptables-save v1.4.12 on Tue Apr 22 14:55:51 2014  *raw  :PREROUTING ACCEPT [2498:166654]  :OUTPUT ACCEPT [2298:219551]  COMMIT  # Completed on Tue Apr 22 14:55:51 2014