zoukankan      html  css  js  c++  java
  • iptables介绍

    iptables防火墙可以用于创建过滤(filter)与NAT规则。所有Linux发行版都能使用iptables。
    iptables的结构:iptables-->Tables-->Chains-->Rules,tables则chains组成,chains由rules组成。

    iptables的表与链

    勾子函数(hook function)netfilter规则链:INPUT,OUTPUT,FORWARD,PREROUTING,POSTROUTING
    iptables具有Filter,NAT,Mangle,Raw四种内建表(四种功能)
    1.Raw表
    Raw表用于处理异常,它具有2个内建链
    PREROUTING chain
    OUTPUT chain
    2.Mangle表
    Mangle表用于指定如何处理数据包。它能改变TCP头中的QoS位。Mangle表具有5个内建链:
    PREROUTING
    OUTPUT
    FORWARD
    INPUT
    POSTROUTING
    3.NAT表
    NAT表有三种内建链
    PREROUTING链-处理刚到达本机并在路由转发前的数据包。它会转换数据包中的目标IP地址(destination ip address),通常用于DNAT。
    POSTROUTING链-处理即将离开本机的数据包。它会转换数据包中的源IP地址,通常用于SNAT。
    OUTPUT链-处理本机产生的数据包
    4.Filter表
    Filter表示iptables的默认表,因此如果你没有自定义表,那么就默认使用filter表,它具有以下三种内建链:
    INPUT-处理来自外部的数据
    OUTPUT链-处理向外发送的数据
    FORWARD链-将数据转发到本机的其他网卡设备上

    iptables规则(Rules)

    牢记以下三点是理解iptables规则的关键:
    Rules包括一个条件和一个目标(target)
    如果满足条件,就执行目标(target)中的规则或者特定值。
    如果不满足条件,就判断下一条Rules。
    目标值(Target Values)
    以下是可以在target里指定的特殊值:
    ACCEPT-允许防火墙接收数据包
    DROP-防火墙丢充包
    QUEUE-防火墙将数据包移交到用户空间
    RETURN-防火墙停止执行当前链中的后续Rules,交返回到调用链(the calling chain)中。
    查看可用的规则:

    iptables -t filter --list  
    iptables -t mangle --list  
    iptables -t nat --list  
    iptables -t raw --list
    

    清空所有iptables规则

    在配置iptables之前,需要使用iptables --list查看现有的规则
    iptables --flush
    或者
    iptables -F
    有的linux发行版上这个命令并不会清除NAT中的规则,此时只能手动清除:
    iptables -t NAT -F

    永久生效

    当删除、添加规则后,这些更改并不能永久生效,这些规则在重启系统或服务后会消失,为了让配置永久生效,根据平台的不同,具体操作也不同。

    Ubuntu

    首先保存现有的规则
    iptables-save > /etc/iptables.rules
    新建一个bash脚本,并保存到/etc/network/if-pre-up.d/目录下:

    #!bin/bash  
    iptables-restore < /etc/iptables.rules
    

    这样,每次系统重启后iptables规则都会被自动加载。
    注意:不要尝试在.bashrc 或者.profile中执行以上命令,因为用户通常不是root,而且这只能在登录时加载iptables规则。

    CentOS,RedHat

    保存iptables规则
    service iptables save
    查看当前规则:
    cat /etc/sysconfig/iptables

    追加iptables规则

    可以使用iptables -A 命令追加新规则,其中-A表示Append。因此,新的规则将追加到链尾。

    语法

    iptables -A chain firewall-rule
    -A chain-指定要追加规则的链
    firewall-rule-具体的规则参数

    描述规则的基本参数

    -p 协议(protocol)
    指定规则的协议,如tcp,udp,icmp等,可以使用all来指定所有协议;
    如果不指定-p参数,默认是all值;
    可以使用协议名(如tcp),或者是协议值(比如6代表TCP)来指定协议。映射关系请查看/etc/protocols;
    还可以使用-protocol参数代替-p参数;
    -s源地址(source)
    指定数据包的源地址;
    参数可以使用IP地址,网络地址,主机名;
    例如:-s 192.168.1.101指定IP地址;
    例如:-s 192.168.1.0/24指定网络地址;
    如果不指定-s参数,就代表所有地址;
    还可以使用-src或者-source
    -d 目的地址(destination)
    指定目的地址;
    参数和-s相同;
    还可以使用-dst或者-destination;
    -j 执行目标(jump to target)
    -j 代表“jump to target”;
    -j指定了当与规则(Rule)匹配时如何处理数据包;
    可能的值是ACCEPT,DROP,QUEUE,RETURN;
    还可以指定其他链(Chain)作为目标;
    -i输入接口(input interfqace)
    -i代表输入接口(input interface);
    -i指定了要处理来自哪个接口的数据包;
    这些数据包即将进入INPUT,FORWARD,PREROUTE链;
    如果不指定-i,那么处理进入所有接口的数据包;
    如果出现!-i eth0,那么将处理所有纲目eth0以外接口进入的数据包;
    如果再现-i eth+,将处理经由eth开头的接口进入的数据包;
    还可以使用-in-interface参数;
    -o 输出(out interface)
    -o代表"output interface";
    -o指定了数据包由哪个接口输出;
    这些数据包即将进入FORWARD,OUTPUT,POSTROUTING链;
    如果不指定-o选项,那么系统上所有接口都可以作为输出接口;
    如果出现! -o eth0,那么将从eth0以外的接口输出;
    如果出现-i eth+,那么将仅从eth开关的接口输出;
    还可以使用-out-interface参数;

    描述规则的扩展参数

    --sport源端口(source port),针对-p tcp或者-p udp
    缺省情况下,将匹配所有端口;
    可以指定端口号或者端口史称,例如"--sport 22"或者"--sport ssh";
    /etc/services文件描述了上述映射关系;
    从性能上讲,使用端口号更好;
    使用冒号可以匹配端口范围,如“-sport 22:100";
    还可以使用"-source-port";
    --dport目的端口(destination port)针对-p tcp或者-p udp*
    参数和--sport类似;
    还可以使用"--destination-port";
    --tcp-flags TCP标志,针对-p tcp
    可以指定由逗号分隔的多个参数;
    有效值可以是:SYN,ACK,FIN,RST,URG,PSH;
    可以使用ALL或者NONE;
    --icmp-type ICMP类型,针对-p icmp
    --icmp-type 0表示Echo Reply;
    --icmp-type 8表示Echo Request;

    追加规则的完整实例:仅允许SSH服务

    1.清空所有iptables规则
    iptables -F
    2.接收目标端口为22的数据包
    iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
    3.拒绝所有其他数据包
    iptables -A INPUT -j DROP

    更改默认策略

    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP

    配置应用程序规则

    SSH

    1.允许接收远程主机的SSH请求
    iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
    2.允许发送本地主机的SSH响应
    iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
    -m state:启动状态匹配模块(state matching module)
    --state:状态匹配模块的参数。当SSH客户端第一个数据包到达服务器时,状态字段为NEW;建立连接后数据包的状态字段都是ESTABLISHED
    --sport 22:sshd监听22端口,同时也通过该端口和客户端建立连接、传送数据。因此对于SSH服务而言,源端口就是22
    --dport 22:ssh客户端程序可以从本机的随机端口与服务器的22端口建立连接。因此对于SSH客户端而言,目的端口就是22
    如果服务器也需要使用SSH连接其他远程主机,则还需要增加以下配置:
    1.送出的数据包目的端口为22:

    iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state --state NEW,ESTABLISHED -j ACCEPT
    

    2.接收的数据包源端口为22

    iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state --state ESTABLISHED -j ACCEPT
    

    HTTP

    1.允许拦收远程主机的HTTP请求
    iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
    2.允许发送本地主机的HTTP响应
    iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT

  • 相关阅读:
    (转)十分钟搞定CSS选择器
    (转)我所理解的OOP——UML六种关系
    闲话:你今天OO了吗?
    oledb方式读取excel文件
    (转)asp.net 高质量缩略图
    (转载)重温SQL——行转列,列转行
    第九讲,资源表解析
    第八讲,TLS表(线程局部存储)
    第七讲,重定位表
    第六讲,导出表
  • 原文地址:https://www.cnblogs.com/feng-land/p/10351823.html
Copyright © 2011-2022 走看看