iptables防火墙

一、linux防火墙基础
防火墙分为硬件防火墙和软件防火墙。
1.概述
linux 防火墙体系主要工作在网络层,针对TCP/IP数据包实施过滤和限制,属于典型的包过滤防火墙。
包过滤机制:netfilter
管理防火墙规则命令工具:iptables
netfilter 指linux内核中实现包过滤防火墙的内部结构,不依程序或文件的形式存在,属于“内核态”的防火墙功能体系
iptables 指管理linux防火墙的命令工具,属于“用户态”的防火墙管理体系
2.iptables的规则表、链结构
iptables的作用在于为包过滤机制的实现提供规则,通过不同的规则作出不同的反应.
iptables管理4个表、以及他们的规则链
filter,用于路由网络数据包。
INPUT 网络数据包流向服务器
OUTPUT 网络数据包从服务器流出
FORWARD 网络数据包经服务器路由
nat,用于NAT表.NAT(Net Address Translation )是一种IP地址转换方法。
PREROUTING 网络数据包到达服务器时可以被修改
POSTROUTING 网络数据包在即将从服务器发出时可以被修改
OUTPUT 网络数据包流出服务器
mangle,用于修改网络数据包的表,如TOS(Type Of Service),TTL(Time To Live),等
INPUT 网络数据包流向服务器
OUTPUT 网络数据包流出服务器
FORWARD 网络数据包经由服务器转发
PREROUTING 网络数据包到达服务器时可以被修改
POSTROUTING 网络数据包在即将从服务器发出时可以被修改
raw, 用于决定数据包是否被跟踪机制处理
OUTPUT 网络数据包流出服务器
PREROUTING 网络数据包到达服务器时可以被修改
3.数据包过滤匹配流程
1规则表之间的优先顺序
依次应用:raw、mangle、nat、filter表
2规则链之间的优先顺序
入站数据流向
转发数据流向
出站数据流向
3规则链内部各条防火墙规则之间的优先顺序
在数据包经由每条规则链的处理过程中,依次按第 1 条规则、第 2 条规则、第 3 条规则……的顺序进行匹配和处理,如果找到一条能够匹配的数据包规则,则不再继续检查后面的规则(使用 LOG 记录日志的规则例外)。如果找不到匹配规则,就按照规则链的默认策略进行处理

二、管理和设置iptables规则

iptables 的基本语法格式 iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转] 

在管理iptalbes防火墙的过程中,首先需要考虑的就是如何查看规则、添加规则、清空链内的规则等基本操作。

-A  在指定链的末尾添加(--append)一条新的规则

-D  删除(--delete)指定链中的某一条规则,按规则序号或内容确定要删除的规则

-I   在指定链中插入(--insert)一条新的规则,若未指定插入位置,则默认在链的开头插入

-R  修改、替换(--replace)指定链中的某一条规则,按规则序号或内容确定要替换的规则

-L  列出(--list)指定链中所有的规则进行查看,若未指定链名,则列出表中所有链的内容

-F  清空(--flush)指定链中的所有规则,若未指定链名,则清空表中所有链的内容

-N  新建(--new-chain)一条用户自己定义的规则链

-X  删除指定表中用户自定义的规则链(--delete-chain)

-P   设置指定链的默认策略(--policy)

-n   使用数字形式(--numeric)显示输出结果,如显示主机的IP地址而不是主机名

-v   查看规则列表时显示详细(--verbose)的信息

-V   查看iptables命令工具的版本(--version)信息

-h   查看命令帮助信息(--help)

-Z   将规则的计数器(数据包个数和字节个数)清零

--line-numbers    查看规则列表时,同时显示规则在链中的顺序号

1>.添加及插入规则
在Filter表的INPUT链的末尾添加一条防火墙规则
[root@s2 ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
在Filter表的INPUT链中插入一条防火墙规则
[root@s2 ~]# iptables -I INPUT -p udp -j ACCEPT
在Filter表的INPUT链中插入一条防火墙规则(为链中第二条规则)
[root@s2 ~]# iptables -I INPUT 2 -p icmp -j ACCEPT
2>.查看规则表
查看Filter表的INPUT链中的所有规则,同时显示顺序号
[root@s2 ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
2 ACCEPT icmp -- anywhere anywhere
3 REJECT icmp -- anywhere anywhere
查看filter表各链中所有规则的详细信息,以数字形式显示地址和端口信息
[root@s2 ~]# iptables -vnL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1189 154K ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
0 0 REJECT icmp -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-port-unreachable
2449 221K ACCEPT udp -- * * 0.0.0.0/0 0.0.0.0/0
3>.删除、清空规则
删除Filter表的INPUT链中的第2条规则
[root@s2 ~]# iptables -D INPUT 2
清空filter表、nat表、mangle表各链中的所有规则
[root@s2 ~]# iptables -F
[root@s2 ~]# iptables -t nat -F
[root@s2 ~]# iptables -t mangle -F
4>.设置规则链的默认策略
最基本的两种策略为ACCEPT(允许)、DROP(丢弃)
将filter表中的FORWARD规则链的默认策略设为DROP
[root@s2 ~]# iptables -t filter -P FORWARD DROP
将filter表中的OUTPUT规则链的默认策略设为ACCEPT
[root@s2 ~]# iptables -P OUTPUT ACCEPT
5>.获得iptables相关选项用法的帮助信息
查看iptables命令中关于icmp协议的信息
[root@s2 ~]# iptables -p icmp -h
6>.新增、删除自定义规则链

在 raw 表中新增一条自定义的规则链,链名为 TCP_PACKETS

[root@s2 ~]# iptables -t raw -N TCP_PACKETS 

清空raw表中自定义的所有规则链
[root@s2 ~]# iptables -t raw -X

、条件匹配

1、通用条件匹配

   a、协议匹配

   用于检查数据包的网络协议(--protocol),允许使用的协议名包含在/etc/protocols文件中,常见的tcp、udp、icmp、和all(针对所有IP数据包)。在iptables命令中使用“-p协议名”的形式。

例:拒绝进入防火墙的所有icmp协议数据包。

    iptables -I INPUT -p icmp -j REJECT

    允许防火墙转发除icmp协议外的所有数据包(使用惊叹号“!”可以将条件取反)。

    iptables -A FORWARD -p ! icmp -j ACCEPT

   b、地址匹配

   用于检查数据包的IP地址、网络地址。在iptables命令中使用“-s 源地址”和“-d 目标地址”的形式,分别对应于源(--source)地址和目标(--destination)地址。

例:拒绝转发来自192.168.0.222主机的数据,允许转发来自192.168.1.0/24网段的数据。

    iptables -A FORWARD -s 192.168.0.222 -j REJECT

    iptables -A FORWARD -s 192.168.1.0/24 -j ACCEPT

    c、网络接口匹配

    用于检查数据包从防火墙的哪一个接口进入或离开。在iptables命令中使用“-i网络接口名”和“-o 网络接口名”的形式,分别对应于接收数据包(--in-interface)的网卡和发送数据包(out-interface)的网卡。

例如:丢弃从外网接口(eth1)进入防火墙本机的源地址为私网地址的数据包。

      iptables -A INPUT -i eth1 -s 192.168.0.0/16 -j DROP

      iptables -A INPUT -i eth1 -s 172.16.0.0/12 -j DROP

      iptables -A INPUT -i eth1 -s 10.0.0.0/8 -j DROP

封堵IP地址段!并2小时后解锁
[root@s2 ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP
[root@s2 ~]# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
[root@s2 ~]# at now +2 hours      //设置在2小时后删除封堵规则
at> iptables -D INPUT 1
at> iptables -D FORWARD 1
at> <EOT>                     //此处按Ctrl+D组合键
job 1 at 2010-04-25 17:43

2、隐含条件匹配 www.2cto.com
通常需要以指定的协议匹配为前提,对应功能由iptables自动装载内核。常见的隐含匹配方式如下:
端口匹配:用于检查数据包的TCP或UDP端口号
仅允许系统管理员从202.13.0.0/16网段使用SSH方式远程登录防火墙主机
[root@s2 ~]# iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT
[root@s2 ~]# iptables -A INPUT -p tcp --dport 22 -j DROP
允许本机开放TCP端口的20 ~ 1024 提供的应用服务
[root@s2 ~]# iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
[root@s2 ~]# iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包
[root@s2 ~]# iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
[root@s2 ~]# iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
TCP标记匹配:用于检查数据包的TCP标记位
拒绝从外网接口(eth1)直接访问防火墙本机的数据包,但允许响应防火墙TCP请求的数据包进入
[root@s2 ~]# iptables -P INPUT DROP
[root@s2 ~]# iptables -I INPUT -i eth1 -p tcp --tcp-flags SYN, RST, ACK SYN -j REJECT
[root@s2 ~]# iptables -I INPUT -i eth1 -p tcp --tcp-flags ! --syn -j ACCEPT
ICMP类型匹配:用于检查ICMP数据包的类型,Echo-Request 数字代码为 8 请求 Echo-Replay 数字代码为 0 回显 destination-Unreachable 3 目标不可达
禁止其他主机ping防火墙主机,但是允许防火墙能ping其他主机
[root@s2 ~]# iptables -A INPUT -p icmp --icmp-type Echo-Request -j DROP
[root@s2 ~]# iptables -A INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
[root@s2 ~]# iptables -A INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT


3、显示条件匹配:需要额外的内核模块提供,因此需要手工指定匹配方式
MAC地址匹配:主要检查数据包的源MAC地址
[root@s2 ~]# iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP
多端口匹配:检查数据包的源端口、目标端口时,用于匹配多个不连续的端口号。
[root@s2 ~]# iptables -A INPUT -p tcp -m multiport --dport 20.21.24.11.1250:1280 -j ACCEPT
多IP地址匹配:检查数据包的源地址、目标地址时,用于匹配一段范围内的IP地址
[root@s2 ~]# iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
状态匹配:基于iptables的状态跟踪机制,检查数据包的连接状态
禁止转发与正常TCP连接无关的非--syn请求数据包
[root@s2 ~]# iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP

拒绝访问防火墙的新数据包,但允许响应或与已有连接相关的数据包
# iptables -A INPUT -p tcp -m state - -state NEW -j DROP
# iptables -A INPUT -p tcp -m state - -state ESTABLISHED,RELATED -j ACCEPT 

NEW:与任何连接无关的 

ESTABLISHED:响应请求或已经建立的连接 

RELATED:与已有连接有相关性


4.数据包控制
最常见处理方式;
ACCEPT:允许数据包通过
DROP:直接丢弃数据包,不给任何回应信息
REJECT:拒绝数据包通过,必要时发个响应信息
LOG: 记录日志信息,将数据包递给下一条规则
对于尝试通过SSH方式登录防火墙主机的访问数据,记录日志信息并禁止访问
[root@s2 ~]# iptables -I INPUT -p tcp --dport 22 -j DROP
[root@s2 ~]# iptables -I INPUT -p tcp --dport 22 -j LOG
用户自定义链:将数据传给用户自定义的链进行处理
自定义一个链MYLAN 转发至192.168.1.0/24 网段数据包交给该链中的规则处理。
[root@s2 ~]# iptables -t filter -N MYLAN
[root@s2 ~]# iptables -A FORWARD -s 192.168.1.0/24 -j MYLAN
[root@s2 ~]# iptables -A FORWARD -d 192.168.1.0/24 -j MYLAN
[root@s2 ~]# iptables -A MYLAN -p icmp -j DROP
SNAT:(源地址转换)修改数据包的源IP地址
DNAT:(目标地址转换)修改数据包的目标IP地址 

四、使用防火墙脚本 
4.1 导出、导入防火墙规则 导出
1.iptables-save 把当前设置的防火墙规则信息输出到终端 将当前调试好的 iptables 规则保存到配置文件# iptables-save > /etc/sysconfig/iptables 或 service iptables save (备份防火墙)

重新启动防火墙

# service iptables restart 

通过 iptables 服务脚本开机自动加载

# chkconfig - -level 35 iptables on 

2.iptalbes-restore 从已保存的配置文件中导入 iptables 规则 

# iptables-retore < /etc/sysconfig/iptables  (还原防火墙)
4.2 编写防火墙脚本 1. 设置网段、网卡、IP 地址等变量 2.加载包过滤相关的内核模块 3.开启路由转发功能 4.用户设置的 iptables 规则 

开启路由转发功能的三种方法:

(1)/sbin/sysctl -w net.ipv4.ip_forward=1

(2)eho 1 > /proc/sys/net/ipv4/ip_forward

(3)vim /etc/sysctl.conf

      net.ipv4.ip_forward = 1

      sysctl -p    //使/etc/sysctl.conf配置文件生效   

你可能感兴趣的:(iptables防火墙)