iptables初步了解

1. 什么是防火墙?

  • 防火牆是通過自訂除一些有順序的規則,管理進入我們主機(網域)內的主機數據封包的一種機制。所以更廣義的理解,只要能夠分析與過濾進出我們管理之網域的封包數據,就可以稱為防火牆。

  • 防火牆還可以細分為軟件防火牆,硬件防火牆,現在我們要討論的是軟件防火牆。軟件防火牆即保護系統網路安全的軟件,例如Netfilter, TCP Wrappers。

  • Netfilter是封包过滤机制,TCP Wrappers是程序控管,因此与启动的port无关,只跟程序名称有关,Proxy代理服务器,代理用户的需求,为用户去服务器取得相关资料。

2. iptables是什么呢?

  • iptables是透過指令的方式來修改Netfilter。因此iptables会分析封包的表头数据。根据表头数据和定下的规则来决定封包是丢弃还是进入主机。下图为一个演示范例。

    iptables初步了解

    上图中所表述的内容为:当有一个封包进入,会先进过Netfilter,去比对用户所制定的每一条规则(这里即iptables的规则了),当满足规则即执行下列动作。如果都没有满足的规则就会进入预设动作。并且这个比对的过程是一个有顺序的switch,满足即离开。错误的顺序会极大的影响结果。

  • 在防火墙中有许多的table,上图中所列举出来的只是iptables众多表格中的一个chain。防火墙中有很多table,每个表格都定义出自己默认的规则,且有不同的用途。

    iptables初步了解

    一般而言我们的iptables都至少有三个表格,filter,nat,mangle,如有需要我们还可以添加我们自己定义的表格。

    • filter:主要跟进出主机的封包有关
      • INPUT:想要进入主机的封包
      • OUTPUT:想要从主机发送出去的封包
      • FORWARD:可以转递封包到后端计算机,与nat table相关性比较高。
    • nat:Network Address TRanslation的缩写。主要在处理来源与目的之IP或port转换,主要与主机后的局域网络比较相关
      • PREROUTING:在进入路由器之前的规则
      • POSTROUTING:进入路由器之后的规则
      • OUTPUT:与发送出去的封包有关
    • mangle(比较少使用):不是很理解,暂时先跳过。

    简单关系如下图所示

    iptables初步了解

    这张图描绘了封包进入后的3中流向A,B,C
    A是控制封包进入主机使用资源,主要通过filter INPUT进行管理。
    B是控制封包经由主机进行传递,没有使用主机资源。
    C是控制封包经由主机发送出去。

    iptables初步了解

    把mangle的东西拿掉

3. 检查现在iptable中的内容

iptables初步了解

通过iptables -L -n可以快速的格式化印出当前filter table的规则。如果需要较为消息的了解应该使用iptables-save

  • iptables [-t tables][-L][-nv]
    -t:切换table,预设是filter
    -L:list
    -n:不进行IP和hostname反查,显示信息会快很多
    -v:列出更多信息,这里暂时不讨论。
    在图中我们可以看到预设的filter table中有3个chain。在后面接的policy表示预设的动作。
    target:需要处理的行为。包含下列3种ACCEPT,REJECT,DROP
    prot:使用的封包协议,tcp,udp,icmp
    opt:额外的选项说明
    source:需要针对的来源IP
    destination:需要针对的目标IP

4. 清除现有iptable中的内容

  • 想要清除当前的iptables中的内容,直接执行下列3条指令就好了
  • iptables -F:清除所有已经指定自订的规则。
  • iptables -X:清除使用者自订的table。
  • iptables -Z:将所有chain的计数和流量归零。
  • 事实上前面两个指令就可以达到清空规则的目的,第三条这里暂时不讨论。

5. 制定policy

  • 这里说的policy就是table预设的执行动作。如果封包比对规则的时候,没有符合的规则,就执行policy。
  • iptables [-t table_name] -P chain_name [ACCEPT,REJECT,DROP]
  • -P:policy大写

6. 制定规则

  • 现在开始了解如何制定最基础的IP和port的限制。这里是指OSI第三层的内容。
  • iptables [-AI chain_name] [-io 网络接口] [-p 协议] [-s source IP/net] [-d target IP/net] -j [ACCEPT REJECT DROP LOG]
  • -A:新加入一条规则。放置在现有规则之后。
  • -I:插入一条规则,如果不给顺序,默认放在第一位,之前的规则往后排。
  • chain_name:INPUT OUTPUT FORWORD等。
  • -io网络接口:设定封包进出的规范。
  • -i:封包所进入的网络接口,eth0,lo等接口,与INPUT配合。
  • -o:封包所传出的网络接口,与OUTPUT配合。
  • -p:规定适用于那种封包协议,协议包括有tcp,udp,icmp & all。
  • -s:目标来源IP,例如 IP:192.168.0.100,如果要表示不许则 !192.168.0.100。
  • -d:这里同 -s,不过时目标的IP/net。
  • -j:表示后续动作。
范例1:将lo设为可信任的来源,不管输入输出都不给予接受。
    iptables -A INPUT -i lo -j ACCEPT
这里没有-s,-d这些,说明不管来源来自哪里只要是出自lo这个界面就统统接受。说明一个重要的观点,没有描述的规则就是默认接受的。

范例2:eh1是一张接内网的网卡,来自内网IP 192.168.100.0/24 的统统接受
    iptables -A INPUT -i eth1 -s 192.168.100.0/24 -j ACCEPT
    
范例3:将特定的ip排除或者接受
    iptables -A INPUT -i eth1 -s 192.168.100.0 -j ACCEPT
    iptables -A INPUT -i eth1 -s 192.168.100.32 -j DROP

7. 记录某个规则的连线状况

  • 利用LOG可以将规则的结果log到核心信息中,在/var/log/message这个档案中
    iptables -A INPUT -s 192.168.2.200 -j LOG
    iptables -L -n
    target prot opt source         destination
    LOG    all  --  192.168.2.200  0.0.0.0/0   LOG flags 0 level 4

8. 对tcp,udp port进行设定

挡掉所有想要通过tcp访问port 21的封包。
    iptables -A INPUT -p tcp --dport 21 -j DROP 
如果不给 -p tcp/udp,那么--dport会变成一个未知参数

9. iptables外挂模块

  • 如果今天需要访问远端一个port 22
  • 那么我们需要主机A到远端B能够放行(output链)
  • 远端B要能够允许我们主机A链接(input链)
  • 那么如果我们需要设定10台机器,假设主机A output永远为accept,我们至少还需要设定10条规则。
  • iptables提供一些外挂模块,帮助我们能够快速解决这类问题。
  • iptables -A INPUT [-m state] [–state 状态]
  • -m:外挂模块
  • –state:一些封包状态:
    • INVALID:无效封包,有损坏的封包
    • ESTABLISHED:已经联机成功的状态
    • NEW:想要建立新的连接的封包状态
    • RELATED:表示这个封包是与我们主机发送出去的封包有关
范例:
iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
conntrack:封包追踪模组

10. 保存当前设定的内容

  • 一般而言设定的iptables在重启服务后并不会直接保存。因此如果需要保存之前设定的内容就需要使用 netfilter-persistent save

参考:http://cn.linux.vbird.org/linux_server/0250simple_firewall.php#netfilter