linux 防火墙:

      netfilter: 框架

      iptables: 数据报文过滤,NAT,mangle等规则生成的工具

      规则包括匹配标准和处理方法

数据报文过滤:

      hook function 钩子函数:

        prerouting

        input

        forward

        output

        postrouting

      规则链:

        PREROUTING

        INPUT

        FORWARD

        OUTPUT

        POSTROUTING

      filter(过滤表):

        INPUT

        FORWARD

        OUTPUT

      Nat(地址转换表):

        PREROUTING

        POSTROUTING

      mangle(拆开,修改,封装 表):

        INPUT

        FORWARD

        OUTPUT

      raw():

        POSTROUTING

        OUTPUT

linux 防火墙

iptables由4个表5个链组成

能否使用自定义链:

     可以使用自定义链,但只在被调用时才能发挥作用,而且如果没有匹配自定义链中的任何规则还应该有返回的机制

     可以删除自定义的空链

     默认链无法删除

每条规则都有两个内置的计数器:

     被匹配的报文个数

     被匹配的报文大小之和

规则的匹配标准:

     通用匹配

         -s, --src:指定源地址

         -d, --dst:指定目标地址

         -p: 指定协议

         -i INTERFACE: 指定数据报文流入的接口

           PREROUTING FORWARD INPUT

         -o INTERFACE: 指定数据报文流出的接口

           PREROUTING FORWARD OUTPUT链

     扩展匹配

         隐含扩展: 不用特别指明由那个模块进行的扩展,此时使用-p{tcp|udp|icmp}

              -p tcp :

                   --sport port 源端口

                   --dport port 目标端口

                   --tcp-flags mask comp 只检查mask指定的标志位,是逗号分隔的标志位列表 comp:此列表中出现的标志位必须为1,comp没有出现而mask出现的标志位必须为0

                   --tcp-flages SYN,FIN,ACK,RST SYN,ACK  tcp三次握手的第一次握手等于--syn

              -p icmp :

                   --icmp-type

                      0: echo-reply

                      8: echo-request

              -p udp :

                   --sport port 源端口

                   --dport port 目标端口

         显示扩展: 必须指明由那个模块进行的扩展,使用-m选项完成此功能

               使用额外的配置机制

              -m extestion --spe-opt

         state: 状态扩展

              结合ip_conntrack追踪会话的状态

                 NEW: 新请求

                 INVALID: 非法请求

                 ESTABLISHED: 已建立的连接

                 RELATED: 相关联的

          -m state --state NEW,ESTABLISHED -j ACCEPT


          multiport: 离散的多端口匹配扩展

                --source-ports

                --destination-ports

                --ports

         -m multiport --destination-ports 21,22,80 -j ACCEPT

         -m iprange: 指定ip地址的范围

                --src-range

                --dst-range

iptables -A INPUT -p tcp -m iprange --src-range 172.16.100.7-172.16.100.100 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT

         -m connlimit: 连接数限制

                ! --connlimit-above n

iptables -A INPUT -d 172.16.100.7 -p tcp --dport 80 -m connlimt ! --connlimt-above 2 -j ACCEPT

         -m limit:

                --limit rate

                --limit-burst 7

iptables -I INPUT -d 172.16.100.7 -p tcp --dport 22 -m limit --limit 3/minute --limit-burst 3 -j ACCEPT

         -m string (要写在OUTPUT链上)

               --algo {kmp|bm}

                --string "string"    

iptables [-t table ] COMMAND CHAIN [num] 匹配标准 -j 处理办法

     -j :

        TARGET

        ACCEPT

        DROP

        REJECT  

命令:

   管理规则

      -A: 附加一条规则,添加在链的尾部

      -I CHAIN [num] : 插入一条规则,插入为对应CHAIN链上的Num条

      -D CHAIN [num] : 删除指定CHAIN链中的第num条规则

      -R CHAIN [num] : 替换指定CHAIN链中的第num条规则   

   管理链

      -F CHAIN: Flush 清空指定的规则链,如果省略CHAIN,就会删除对应表中的所有链

      -P CHAIN: 设定指定链的默认策略

      -N: 自定义一个新的空链

      -X: 删除一个自定义的空链(必须为空的链)

      -Z: 置零指定链中的所有规则的计数器

      -E: 重命名自定义的链

   查看类

      -L: 显示指定表中的所有规则

        -n: 以数字格式显示主机地址和端口号

        -v: 显示链及规则的详细信息

        -vv: 更加详细信息

        -x: 显示计数器的精确值

        --line-numbers: 显示规则号码

   动作(target)

      accept: 允许通过

      drop: 丢弃

      reject: 拒绝

      dnat: 目标地址转换

      snat: 源地址转换

      redirect: 端口重定向

      masquerade: 地址伪装

      log: 日志

      mark: 打标记

iptables不是服务都有服务脚步,其作用为保存和管理规则

修改三条链为drop

      iptables -P INPUT DROP

      iptables -P OUTPUT DROP

      iptables -P FORWARD DROP  

iptables规则保存在/etc/sysconfig/iptables 文件里

service iptables save 保存规则到指定文件里 /etc/sysconfig/iptables里

或使用iptables-save > /path   保存到任意文件

iptables-restore < /path 读取文件里规则到iptables里

iptables -F 清空规则



iptables -A INPUT -d 172.16.100.7 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACEPT


iptables -A OUTPUT -s 172.16.100.7 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT


sysctl -w net.ipv4.ip_conntrack_max=65536


iptables -A INPUT -i lo -j ACCEPT

iptables -A OUTPUT -o lo -j ACCEPT


新建自定义链

    iptables -N 链名

# iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP

# iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP


# iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP

# iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP

# iptables -A clean_in -d 172.16.100.7 -j RETURN 


利用iptables的recent模块来抵御DOS***

ssh: 远程连接

iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH

iptables -I INPUT  -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP


1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;


2.利用recent和state模块限制单IP在300s内只能与本机建立3个新连接。被限制五分钟后即可恢复访问。


下面对最后两句做一个说明:

1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH

--set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目


2.第三句是指SSH记录中的IP,300s内发起超过3次连接则拒绝此IP的连接。

--update 是指每次建立连接都更新列表;

--seconds必须与--rcheck或者--update同时使用

--hitcount必须与--rcheck或者--update同时使用


3.iptables的记录:/proc/net/ipt_recent/SSH

也可以使用下面的这句记录日志:

iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"



在linux系统主机上如果开启了ip_forward功能,那么这是服务器就相当于路由器具有地址转换功能

 /proc/sys/net/ipv4/ip_forward=1

或修改/etc/sysctl.con 文件选项


iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 123.2.3.2


端口映射

iptables -t nat -R PRERROUTING 1 -d 172.16.100.7 -p tcp --dport 80 -j DNAT --to-destination 192.168.10.22:8080