iptables/netfilter

防火墙简介

防火墙:使之设置在不同网络或网络安全域之间的一系列部件的组合,它能增强机构内部网络的安全性。 机制:通过访问控制机制,确定哪些内部服务允许外部访问。可以根据网络传输的类型决定IP包是否可以传进或传出内部网。 工作原理:通过审查经过的每一个数据包,判断它是否有相匹配的过滤规则,根据规则的先后顺序,根据的先后顺序进行一一比较,直到满足其中一条为止,然后依据控制机制做出相应的动作。入股不满足,则将数据包丢弃,从而保护网络的安全。

防火墙机制

一种机制是阻拦传输流通行 一种机制是允许传输了通过 一些防火墙偏重拦阻传输流的通行,而另一些防火墙则偏重允许传输流通过。 防火墙实现功能: 控制内网往之间网络系统的访问; 可以保护易受攻击的服务; 集中管理内网的安全性,降低管理成本; 提高网络的保密性和私有性; 记录网络的使用状态,为安全规划和网络维护提高依据。 防火墙类似于过滤器的功能,其中的规则就是网孔,允许的才能通过,不允许的只能在网外被丢弃掉或者是被原路发送回去。

不同内核版本与不同防火墙版本之间的对应关系。

netfilter/iptables 分别是内核态模块和用户管理工具,netfilter 是位于Linux内核中的包过滤功能体系,iptables位于 /sbin/iptables,用于管理防火墙规则的工具,管理员通过iptables 给netfilter 变更规则实现防火墙作用。

        kenel 2.0.x     ipfw        ipfwadmin
        kenel 2.2.x     ipchains    ipchains
        kenel 2.4.x     netfilter   iptables
        kenel 3.13.x    firewall    nftables>iptables

image_46

netfilter/iptables预设的规则表 表作用:容纳各种规则链 划分依据:根据防火墙对数据的处理方式 规则表: raw表:确定是否对该数据包进行状态跟踪 mangle表:为数据包设置标记 nat表:修改数据包中的源、目标IP地址或者端口 filter表:确定是否放行该数据包(过滤) netfilter/iptables预设的规则链 规则的作用:对数据包进行过滤或者处理 链的作用:容纳各种防火墙规则 链的分类依据:处理数据包的不同时机 规则链: INPUT:处理入站数据包 OUTPUT:处理出站数据包 FORWARD:处理转发数据包 POSTROUTING链:在进行路由选择后处理的数据包 PREROUTING链:在进行路由选择前处理数据包

image_47

规则表之间的顺序

raw——mangle——nat——filter

规则链之间的顺序

入站:PREROUTING INPUT
出站:OUTPUT POSTROUTING
转发:PREROUTING FORWARD POSTROUTING

规则链内的匹配顺序

按顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配规则,则按该链的默认策略处理

image_48

语法构成及注意事项

语法

iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]

注意事项

不指定表名时,默认指filter表
不指定链名时,默认指表内所有的链
除非设置链的默认策略,否则必须指定匹配条件
选项、链名、控制类型使用大写字母,其余均为小写

保存和恢复 iptables 规则

防火墙规则只在计算机处于开启状态时才有效。如果系统被重新引导,这些规则就会自动被清除并重设。要保存规则以便今后载入,请使用以下命令:
sbin/service iptables save
保存在 /etc/sysconfig/iptables 文件中的规则会在服务启动或重新启动时(包括机器被重新引导时)被应用。

数据包的常见控制类型

ACCEPT:允许通过
DROP:直接丢弃,不给出任何回应
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志信息,然后传给下一条规则继续匹配

添加新的规则

-A:在链的末尾追加一条规则

-i:在链的开头(或指定序号)插入一条规则

# iptables -t filter -A INPUT -p tcp -j ACCEPT

# iptables -i  INPUT -p udp -j ACCEPT

# iptables -i  INPUT  2 -p icmp -j ACCEPT

查看规则列表

-L:列出所有的规则条目

-n:以数字形式显示地址、端口等信息

-v:以更详细的方式显示规则信息

--line-numbers:查看规则时,显示规则的序号

删除、清空规则

-D:删除链内指定序号(或内容)的一条规则

-F:清空所有的规则

设置默认策略

-P:为指定的链设置默认规则

条件匹配

通用匹配 可直接使用,不依赖于其他条件或扩展 包括网络协议、IP地址、网络接口等条件

常见的通用匹配条件
协议匹配:-p 协议名
地址匹配:-s 源地址、-d 目的地址
接口匹配:-i 入站网卡、-o 出站网卡

隐含匹配 要求以特定的协议匹配作为前提 包括端口、TCP标记、ICMP类型等条件

常用的隐含匹配条件
端口匹配:--sport 源端口、--dport 目的端口
ICMP类型匹配:--icmp-type ICMP类型

显式匹配 要求以“-m 扩展模块”的形式明确指出类型 包括多端口、MAC地址、IP范围、数据包状态等条件

常用的显式匹配条件
多端口匹配:-m multiport  --sport 源端口列表
            -m multiport  --dport 目的端口列表
IP范围匹配:-m iprange --src-range IP范围
MAC地址匹配:-m mac –mac1-source MAC地址
状态匹配:-m state --state 连接状态

SNAT策略的典型应用环境

局域网主机共享单个公网IP地址接入Internet

image_49.png

SNAT策略的原理

源地址转换,Source Network Address Translation
修改数据包的源地址

前提条件

局域网各主机正确设置IP地址/子网掩码
局域网各主机正确设置默认网关地址
Linux网关支持IP路由转发

实现方法

编写SNAT转换规则

image_50

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 218.29.30.31
# 这里的eth0是指网关服务器上的外网网卡
# 此条防火墙规则是在网关服务器上设置

MASQUERADE —— 地址伪装

适用于外网IP地址非固定的情况,对于ADSL拨号连接,接口通常为 ppp0、ppp1,将SNAT规则改为MASQUERADE即可

iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
# 此条防火墙规则是在网关服务器上设置
# 应用条件:网关服务器的外网IP地址获取不唯一

DNAT策略的典型应用环境

image_51.png
在Internet中发布位于企业局域网内的服务器

DNAT策略的原理

目标地址转换,Destination Network Address Translation
修改数据包的目标地址

前提条件

局域网的Web服务器能够访问Internet,网关的外网IP地址有正确的DNS解析记录,Linux网关支持IP路由转发

实现方法

image_52.png

编写DNAT转换规则
iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.6

发布时修改目标端口

在DNAT规则中以“IP:Port”的形式指定目标地址

iptables -t nat -A PREROUTING -i eth0 -d 218.29.30.31 -p tcp --dport  2346 -j DNAT --to-destination 192.168.1.6:22

状态机制

状态机制是iptables中特殊的一部分,连接跟踪可以让Netfilter知道某个特定的连接状态。允许连接跟踪的防火墙称为带有状态机制的防火墙。状态防火墙比非状态防火墙要安全,因为它允许编写更严密的规则。在iptables中,包和被跟踪连接的四种不同状态有关,即NEW、ESTABISHED、RELATED和INVALID。

1.NEW

NEW说明这个包,即从哪track模块看到的某个连接的第一个包,它即将匹配。比如看到一个SYN包,是所留意连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。

2.ESTABISHED

已经注意到两个方向上的传输,而且会继续匹配这个连接的包。

3.RELATED

当一个连接和某个已经处于ESTABISHED连接状态的连接有关系时,被认为是该状态。FTP就是一个RELATED状态。

脚本编写

    #!/bin/bash
    #this is a iptables SNAT regular
    sysctl -w net.ipv4.ip_forward=1
        #开启地址转发功能
    INET_IFACE='eth1'
        #定义外网网卡是哪个
    INET_IP=200.200.200.10
        #定义网关服务器上外网IP地址
    LAN_IFACE=eth0
        #定义内网网卡是哪个
    LAN_IP=192.168.1.20
        #定义网关服务器上内网IP地址
    LAN_IP_RANGE=192.168.1.0/24
        #定义内网允许访问的地址范围
    IPT="/sbin/iptables"
        #给iptables命令设置别名
    /sbin/modprobe ip_tables
    /sbin/modprobe ipt_iprange
    /sbin/modprobe ipt_REJECT
    /sbin/modprobe ip_conntrack
    /sbin/modprobe xt_tcpudp
    /sbin/modprobe xt_state
    /sbin/modprobe xt_multiport
    /sbin/modprobe xt_mac
    /sbin/modprobe ip_conntrack_ftp
    /sbin/modprobe ip_nat_ftp
    /sbin/modprobe ipt_LOG
        #加载必要的内核模块
    for TABLE in filter nat mangle;do
    $IPT -t $TABLE -F
    done
        #清除默认策略
    $IPT -P INPUT DROP
    $IPT -P OUTPUT DROP
    $IPT -P OUTPUT ACCEPT
        #设置默认策略
    $IPT -t nat -A POSTROUTING -s $LAN_IP_RANGE -o $INET_IFACE -j SNAT --to-source $INET_
    IP
        #添加防火墙规则

频繁使用的模块

    $MOD ip_tables
    $MOD ip_conntrack
    $MOD ipt_REJECT
    $MOD ipt_LOG
    $MOD ipt_iprange
    $MOD xt_tcpudp
    $MOD xt_state
    $MOD xt_multiport
    $MOD xt_mac
    $MOD ip_nat_ftp
    $MOD ip_conntrack_ftp
    # 这里的MOD=/sbin/modprobe

调整/proc内核参数

    $CTL -w net.ipv4.ip_forward=1
    $CTL -w net.ipv4.ip_default_ttl=128
    $CTL -w net.ipv4.icmp_echo_ignore_all=1
    $CTL -w net.ipv4.icmp_echo_ignore_broadcasts
    $CTL -w net.ipv4.tcp_syncookies=1
    $CTL -w net.ipv4.tcp_syn_retries=3
    $CTL -w net.ipv4.tcp_synack_retries=3
    $CTL -w net.ipv4.tcp_fin_timeout=60
    $CTL -w net.ipv4.tcp_max_syn_backlog=3200
    # 这里的CTL指 /sbin/sysctl

具体的规则

    $IPT -t filter -X
    $IPT -t nat -X
    $IPT -t filter -F
    $IPT -t nat -F
    $IPT -P INPUT DROP
    $IPT -P FORWARD DROP
    $IPT -P OUTPUT ACCEPT
    $IPT -t nat -A POSTROUTING -s $LAN_NET -o $INET_IF -j SNAT --to-source $INET_IP
    $IPT -t nat -A PREROUTING -i $INET_IF -d $INET_IP -p tcp --dport 80 -j DNAT --to-destination $LAN_WWW_IP

    # 这里的IPT指 /sbin/iptables

黑白名单机制

    WHITE_LIST="/opt/myipfw.wlist"
    for i in $(grep -v "^#" $WHITE_LIST)
    do
        $IPT -I INPUT -s $i -j ACCEPT
        $IPT -I OUTPUT -d $i -j ACCEPT
        $IPT -I FORWARD -s $i -j ACCEPT
        $IPT -I FORWARD -d $i -j ACCEPT
    done
    # 白名单脚本规则
    BLACK_LIST="/opt/myipfw.blist"
    for i in $(grep -v "^#" $BLACK_LIST)
    do
        $IPT -I INPUT -s $i -j DROP
        $IPT -I OUTPUT -d $i -j DROP
        $IPT -I FORWARD -s $i -j DROP
        $IPT -I FORWARD -d $i -j DROP
    done
    #黑名单脚本规则

Q.E.D.