Linux下的防火墙iptables

Linux防火墙简介:

    首先,网络封包要进入你主机,需要经过的流程:通过防火墙、服务器软件程序(验证账号)、SELinux与文件系统(权限rwx等)等。
    防火墙的主要类别:1,Netfilter (封包过滤机制);  2,TCP Wrappers (程序控管);  3,Proxy (代理服务器)。
        Netfilter可做的事:1,、拒绝让 Internet 的封包进入主机的某些端口口;
                                          2、拒绝让某些来源 IP 的封包进入
                                          3、拒绝让带有某些特殊旗标 (flag) 的封包进入
                                          4、分析硬件地址 (MAC) 来决定联机与否

        TCP Wrappers :是透过 /etc/hosts.allow, /etc/hosts.deny 这两个宝贝蛋来管理的一个类似防火墙的机制, 但并非所有的软件都可以透过这两个档案来控管,只有底下的软件才能够透过这两个档案来管理防火墙规则,分别是:1、由 super daemon (xinetd) 所管理的服务;2、有支援 libwrap.so 模块的服务。

        Proxy  :如图
Linux下的防火墙iptables_第1张图片

Netfilter :iptables机制

    因为iptables用得更多范围更广,所以这里只详细介绍Netfilter :iptables防火墙,其他两个,请想深入了解的读者自行百度。

iptables简介:

    注:当一个网络封包要进入到主机之前,会先经由 NetFilter 进行检查,那就是 iptables 的规则了。 检查通过则接受 (ACCEPT) 进入本机取得资源,如果检查不通过,则可能予以丢弃 (DROP) ! 上图中主要的目的在告知你:『规则是有顺序的』!例如当网络封包进入 Rule 1 的比对时, 如果比对结果符合 Rule 1 ,此时这个网络封包就会进行 Action 1 的动作,而不会理会后续的 Rule 2, Rule 3.... 等规则的分析了。
Linux下的防火墙iptables_第2张图片

    Linux 的 iptables 至少就有三个表格,包括管理本机进出的 filter 、管理后端主机 (防火墙内部的其他计算机) 的 nat 、管理特殊旗标使用的 mangle (较少使用) 。
    这里笔者只介绍filter:
        1、INPUT:主要与想要进入我们 Linux 本机的封包有关;
        2、OUTPUT:主要与我们 Linux 本机所要送出的封包有关;
        3、FORWARD:这个东东与 Linux 本机比较没有关系, 他可以『转递封包』到后端的计算机中,与 nat table 相关性较高。

iptables语法:

规则的观察与清除:

    查看:
   
 [root@www ~]# iptables [-t tables] [-L] [-nv] 
        选项与参数: -t :后面接 table ,例如 nat 或 filter ,若省略此项目,则使用默认的 filter 
                     -L :列出目前的 table 的规则 
                     -n :不进行 IP 与 HOSTNAME 的反查,显示讯息的速度会快很多!
                     -v :列出更多的信息,包括通过该规则的封包总位数、相关的网络接口等

    例如:iptables -L -n
    iptables-save 这个指令也可以观察防火墙规则。

    清除:
    [root@www ~]# iptables [-t tables] [-FXZ] 
        选项与参数: -F :清除所有的已订定的规则;
                     -X :杀掉所有使用者 "自定义" 的 chain (应该说的是 tables )啰;
                     -Z :将所有的 chain 的计数与流量统计都归零

定义预设政策 (policy):

    [root@www ~]# iptables [-t nat] -P [INPUT,OUTPUT,FORWARD] [ACCEPT,DROP] 
        选项与参数: -P :定义政策( Policy )。注意,这个 P 为大写啊! 
                        ACCEPT :该封包可接受 
                        DROP :该封包直接丢弃,不会让 client 端知道为何被丢弃。
    在本机方面的预设政策中,假设你对于内部的使用者有信心的话, 那么 filter 内的 INPUT 链方面可以定义的比较严格一点,而 FORWARD 与 OUTPUT 则可以订定的松一些!
 
       范例:将本机的 INPUT 设定为 DROP ,其他设定为 ACCEPT
            [root@www ~]# iptables -P INPUT DROP
            [root@www ~]# iptables -P OUTPUT ACCEPT
            [root@www ~]# iptables -P FORWARD ACCEPT


封包的基础比对:IP, 网域及接口装置:

   
 [root@www ~]# iptables [-AI 链名] [-io 网络接口] [-p 协议]  [-s 来源IP/网域] [-d 目标IP/网域] -j [ACCEPT|DROP|REJECT|LOG]
        选项与参数: -AI 链名:针对某的链进行规则的 "插入" 或 "累加" 
                      -A :新增加一条规则,该规则增加在原本规则的最后面。例如原本已经有四条规则, 使用 -A 就可以加上第五条规则! 
                      -I :插入一条规则。如果没有指定此规则的顺序,默认是插入变成第一条规则。 例如原本有四条规则,使用 -I 则该规则变成第一条,而原本四条变成 2~5 号 链 :有 INPUT, OUTPUT, FORWARD 等,此链名称又与 -io 有关,请看底下。
                      -io 网络接口:设定封包进出的接口规范
                      -i :封包所进入的那个网络接口,例如 eth0, lo 等接口。需与 INPUT 链配合; 
                      -o :封包所传出的那个网络接口,需与 OUTPUT 链配合;
                      -p 协定:设定此规则适用于哪种封包格式 主要的封包格式有: tcp, udp, icmp 及 all 。
                      -s 来源 IP/网域:设定此规则之封包的来源项目,可指定单纯的 IP 或包括网域,
                                例如: IP :192.168.0.100
                                       网域:192.168.0.0/24, 192.168.0.0/255.255.255.0 均可。 
                                                         若规范为『不许』时,则加上 ! 即可,例如: -s ! 192.168.100.0/24 表示不许 192.168.100.0/24 之封包来源; 
                      -d 目标 IP/网域:同 -s ,只不过这里指的是目标的 IP 或网域。
                      -j :后面接动作,主要的动作有接受(ACCEPT)、丢弃(DROP)、拒绝(REJECT)及记录(LOG)
                               


TCP, UDP 的规则比对:针对端口设定:

   
 [root@www ~]# iptables [-AI 链] [-io 网络接口] [-p tcp,udp]  [-s 来源IP/网域] [--sport 埠口范围]  [-d 目标IP/网域] [--dport 埠口范围] -j [ACCEPT|DROP|REJECT]
        选项与参数: --sport 埠口范围:限制来源的端口口号码,端口口号码可以是连续的,例如 1024:65535 
                     --dport 埠口范围:限制目标的端口口号码。
              注:因为仅有 tcp 与 udp 封包具有端口,因此你想要使用 --dport, --sport 时,得要加上 -p tcp 或 -p udp 的参数才会成功喔


iptables 外挂模块:mac 与 state:

    [root@www ~]# iptables -A INPUT [-m state] [--state 状态] 
        选项与参数: 
            -m :一些 iptables 的外挂模块,主要常见的有:
                   state :状态模块 
                --state :一些封包的状态,主要有: 
                            INVALID :无效的封包,例如数据破损的封包状态 
                            ESTABLISHED:已经联机成功的联机状态; 
                            NEW :想要新建立联机的封包状态;
                            RELATED :这个最常用!表示这个封包是与我们主机发送出去的封包有关
                   mac :网络卡硬件地址 (hardware address)
                --mac-source :就是来源主机的 MAC 啦!



ICMP 封包规则的比对:针对是否响应 ping 来设计:

    小知识:ICMP 协定当中我们知道 ICMP 的类型相当的多,而且很多 ICMP 封包的类型都是为了要用来进行网络检测用的!所以最好不要将所有的 ICMP 封包都丢弃!如果不是做为路由器的主机时,通常我们会把 ICMP type 8 (echo request) 拿掉而已,让远程主机不知道我们是否存在,也不会接受 ping 的响应就是了。
   
 [root@www ~]# iptables -A INPUT [-p icmp] [--icmp-type 类型] -j ACCEPT 
        选项与参数:
               --icmp-type :后面必须要接 ICMP 的封包类型,也可以使用代号, 例如 8 代表 echo request 的意思。


IPv4 的核心管理功能: /proc/sys/net/ipv4/*

    echo "1" > /proc/sys/net/ipv4/tcp_syncookies
        阻断式服务 (DoS) 攻击法当中的一种方式,就是利用 TCP 封包的 SYN 三向交握原理所达成的, 这种方式称为 SYN Flooding,上面指令就是启用核心的 SYN Cookie 模块来防止这种情况。
    echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
        让核心自动取消 ping 的响应。/proc/sys/net/ipv4 内的 icmp_echo_ignore_broadcasts (仅有 ping broadcast 地址时才取消 ping 的回应) 及 icmp_echo_ignore_all (全部的 ping 都不回应)。

    /proc/sys/net/ipv4/conf/网络接口/*
        rp_filter:称为逆向路径过滤 (Reverse Path Filtering), 可以藉由分析网络接口的路由信息配合封包的来源地址,来分析该封包是否为合理。举例来说,你有两张网卡,eth0 为 192.168.1.10/24 ,eth1 为 public IP 。那么当有一个封包自称来自 eth1 ,但是其 IP 来源为 192.168.1.200 , 那这个封包就不合理,应予以丢弃。这个设定值建议可以启动的。
        log_martians:这个设定数据可以用来启动记录不合法的 IP 来源, 举例来说,包括来源为 0.0.0.0、127.x.x.x、及 Class E 的 IP 来源,因为这些来源的 IP 不应该应用于 Internet 啊。 记录的数据默认放置到核心放置的登录档 /var/log/messages。
        accept_source_route:或许某些路由器会启动这个设定值, 不过目前的设备很少使用到这种来源路由,你可以取消这个设定值。
        accept_redirects:当你在同一个实体网域内架设一部路由器, 但这个实体网域有两个 IP 网域,例如 192.168.0.0/24, 192.168.1.0/24。此时你的 192.168.0.100 想要向 192.168.1.100 传送讯息时,路由器可能会传送一个 ICMP redirect 封包告知 192.168.0.100 直接传送数据给 192.168.1.100 即可,而不需透过路由器。因为 192.168.0.100 与 192.168.1.100确实是在同一个实体线路上 (两者可以直接互通),所以路由器会告知来源 IP 使用最短路径去传递数据。但那两部主机在不同的 IP 段,却是无法实际传递讯息的!这个设定也可能会产生一些轻微的安全风险,所以建议关闭他。
        send_redirects:与上一个类似,只是此值为发送一个 ICMP redirect 封包。 同样建议关闭。

事例

以下介绍是基于一台服务器,系统为centos7:
#!/bin/bash

#网卡信息,环境变量
EXTIF="eno1"	#公网网卡接口
INIF="eno16777736"	#内部LAN接口
INNET="192.168.1.0/24"	#内部网
FILEDIR="/usr/local/erdangjiade/iptables/"	#allow、deny文件的存放路径

export EXTIF INIF INNET FILEDIR


#设定核心的网络功能
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts

for i in /proc/sys/net/ipv4/conf/*/{rp_filter,log_martians}; do
	echo "1" > $i
done

for i in /proc/sys/net/ipv4/conf/*/{accept_source_route,accept_redirects,send_redirects}; do
	echo "0" > $i
done


#设定规则

PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin;
export PATH

iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p TCP -m state --state NEW -i $INIF -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#允许内网ping
iptables -A INPUT -i $INIF -p icmp -j ACCEPT

#个别设定
if [ -f ${FILEDIR}iptables.deny ]; then
	sh ${FILEDIR}iptables.deny
fi
if [ -f ${FILEDIR}iptables.allow ]; then
	sh ${FILEDIR}iptables.allow
fi


#防止大量ping
#AICMP="0 3 3/4 4 11 12 14 16 18"
#for tyicmp in $AICMP
#do
#	iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
#done


#对某些服务开放端口

#SSH
iptables -A INPUT -p TCP -i $EXTIF --dport 22 --sport 1024:65534 -j ACCEPT

#WWW
iptables -A INPUT -p TCP -i $EXTIF --dport 80 --sport 1024:65534 -j ACCEPT

	

#保存以上修改
service iptables save
    如果想将上述事例的防火墙设置开机启动,可以将事例文档的路径写入/etc/rc.d/rc.local(只需将路径写入,不用在前面加bash执行),注:rc.local默认是不可执行的,需要将它开启:chmod  +x  /etc/rc.d/rc.local


参考文章:《鸟哥的私房菜,服务器篇》

    转载请标明原文出处:http://blog.csdn.net/u012367513/article/details/40628197


    

你可能感兴趣的:(centos,网络,防火墙,服务器,iptables)