安全服务--Iptables
一、网络安全访问控制
我们都知道,Linux一般作为服务器使用,对外提供一些基于网络的服务,通常我们都需要对服务器进行一些网络控制,
类似防火墙的功能,
常见的访问控制包括:那些IP可以访问服务器,可以使用那些协议,那些接口。那些端口 是否需要对数据包进行修改等等。
如果某服务器受到***,或者来自互联网哪个区域或者哪个IP的***,这个时候应该禁止所有来自该IP的访问。
那么Linux底层内核集成了网络访问控制,通过netfilter模块来实现.
iptables作用: 1. 拦截基本的*** 2. 模拟ip段
iptables是一种程序,netfilter是控制模块
二、IPTables
Linux内核通过netfilter模块实现网络访问控制功能,
在用户层我们可以通过iptables程序对netfiter进行控制和管理
netfilter支持通过以下方式对数据包进行分类:
-源IP地址
-目标IP地址
-使用接口
-使用协议(TCP、UDP、ICMP等)
-端口号
-链接状态(new、ESTABLISHED、RELATED、INVALID)
三、Netfilter概念
外部访问是进来用INPUT
还没有经过路由的数据包 用PREROUTING
Netfileter分为:5条链和3张表
链 表( filter表 , nat表 ,mangle表 )
INPUT(输入进来的数据) 只支持filter和mangle表
FORWARD(转发的数据) 只支持filter和mangle表
OUTPUT(输出,出去的数据) 支持filter nat和mangle表
PREROUTING((DNAT)要把别人的公网地址转换成你们内部的IP,数据流入必然经过PRE) 支持nat和mangle表
POSTROUTING((SNAT)把内部的私有地址转换成公有地址,数据流出必然经过POS) 支持nat和mangle表
filter表--用以对数据进行过滤
nat表 --用以对数据包的源、目标地进行修改
mangle表--用以对数据进行高级修改
另一种说法:分4个表5个链
表是按照对数据包的操作区分的,链是按照不同的Hook点来区分的,表和链实际上是netfilter的两个维度
4个表:filter,nat,mangle,raw,默认表是filter(没有指定表的时候就是filter表)。表的处理优先级:raw>mangle>nat>filter。
filter:一般的过滤功能
nat:用于nat功能(端口映射,地址映射等)
mangle:用于对特定数据包的修改
raw:有限级最高,设置raw时一般是为了不再让iptables做数据包的链接跟踪处理,提高性能
5个链:PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING。
PREROUTING:数据包进入路由表之前
INPUT:通过路由表后目的地为本机
FORWARDING:通过路由表后,目的地不为本机
OUTPUT:由本机产生,向外转发
POSTROUTIONG:发送到网卡接口之前。
1:filter表 作用:过滤数据包 内核模块:iptables_filter.
***************************************************************************
INPUT 链 :应用于发往本机的数据包
OUTPUT 链 :应用于路由经过本地的数据包
FORWARD 链 :本地产生的数据包
***************************************************************************
2:nat表 作用:用于网络地址转换(IP、端口) 内核模块:iptable_nat
PREROUTING 链 :修改到达的数据包
OUTPUT 链 : 路由之前,修改本地产生数据包
POSTROUTING 链 : 数据包发送前,修改该包
****************************************************************************
3:mangle表 作用:修改数据包的服务类型、TTL、并且可以配置路由实现QOS内核模块:iptable_mangle(别看这个表这么麻烦,咱们设置策略时几乎都不会用到它)
PREROUTING 链 :(DNAT)要把别人的公网地址转换成你们内部的IP,数据流入必然经过PRE
INPUT 链 :应用于发送给本机的数据包
FORWARD 链 :修改经过本机路由的数据包
OUTPUT 链 :路由之前,修改本地产生的数据包
POSTROUTING 链 :(SNAT)把内部的私有地址转换成公有地址,数据流出必然经过POST
******************************************************
4.Raw表——两个链:OUTPUT、PREROUTING
作用:决定数据包是否被状态跟踪机制处理 内核模块:iptable_raw
(这个是REHL4没有的,不过不用怕,用的不多)
四、常用的功能
iptbales作为服务器使用;
(1)过滤到本机的流量 -input链、filter表
(2)过滤到本机的流量 -output链、filter表
iptbales作为路由器使用:
(1) 过滤转发的流量 -forward链、filter表
(2) 对转发数据的源、目标IP进行修改(NAT功能) -forward链、nat表
iptables规则属性
iptables -t filter -A INPUT -s 10.0.0.201 -j DROP
| | | |
表 链 匹配属性 动作
Iptables的基本语法格式:
Iptables [-t 表名] 命令选项 [链名] [条件匹配] [-j 目标动作或跳转]
说 明:表名、链名用于指定iptables命令所操作的表和链,命令选项用于指定管理iptables规则的方式(比如:插入、增加、删除、查看等;条件匹 配用于指定对符合什么样条件的数据包进行处理;目标动作或跳转用于指定数据包的处理方式(比如允许通过、拒绝、丢弃、跳转(Jump)给其它链处理。
一个iptables命令创建一个规则。主要包含以下几个部分
表:规定使用得表(filter nat mangle,不同的表不同的功能)
链:规定过滤点
匹配属性:规定匹配数据包的特征
匹配后的动作:放行、丢弃、记录
五、iptables参数定义
以配置参数可以自由组合
-v 显示端口流量
-a 所有 all缩写
-D 删除
-I 插入,往所有规则第一条上面插入
-s 源IP
--sport 源端口
-d 目标IP
--dport 目标端口
-i input
接口 eth0
-o Output
接口 eth0
-A 增加一条策略
-p 指定匹配的协议
-j 动作,是丢弃还是通过 DROP(丢弃包) REJECT(拦阻该封包) ACCEPT(允许放行)LOG(在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则)
防火墙处理数据包的四种方式:
ACCEPT 允许数据包通过
DROP 直接丢弃数据包,不给任何回应信息
REJECT 拒绝数据包通过,必要时会给数据发送端一个响应的信息。
LOG在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
iptables防火墙规则的保存与恢复
/etc/sysconfig/iptables 配置文件
service iptables save 保存规则
--line-numbers 显示规则编号
Iptables命令的管理控制选项:(-A追加规则、-D删除规则、-R修改规则、-I插入规则、-L查看规则)
-A 在指定链的末尾添加(append)一条新的规则
-n使用数字形式(numeric)显示输出结果
-v查看规则表详细信息(verbose)的信息
-V查看版本(version)
-h获取帮助(help)
命令 -D, --delete删除规则,范例 iptables -D INPUT 1 ( 规则编号)
命令 -R, --replace修改规则,范例 iptables -R INPUT 1 -s 192.168.0.1 -j DROP
命令 -I, --insert 插入规则,范例 iptables -I INPUT 1 --dport 80 -j ACCEPT,插入一条规则,原本该位置(这里是1)上的规则将会往后移动一个位。
命令 -L, --list,范例 iptables -L INPUT,列出某规则链中的所有规则。
命令 -F, --flush,范例 iptables -F INPUT, 删除某规则链(这里是INPUT规则链)中的所有规则。
命令 -Z, --zero,范例 iptables -Z INPUT, 将封包计数器归零。封包计数器是用来计算同一封包出现次数,是过滤阻断式***不可或缺的工具。
命令 -N, --new-chain,范例 iptables -N allowed, 定义新的规则链。
命令 -X, --delete-chain,范例 iptables -X allowed, 删除某个规则链。
命令 -P, --policy,范例 iptables -P INPUT DROP,定义过滤政策, 也就是未符合过滤条件之封包,预设的处理方式。
命令 -E, --rename-chain,范例 iptables -E allowed disallowed, 修改某自订规则链的名称。
六、IPTBALES案例
打开iptables 用/etc/init.d/iptables start或service iptables start
保存iptables配置用/etc/init.d/iptables save或service iptables save
如果想清空的话,先执行/sbin/iptables -P INPUT ACCEPT
然后执行/sbin/iptables -F
通过iptables -L 看到如下信息
注意:防火是先允许后拒绝,如果先拒绝的话。那么后面允许将不会生效。
filter 表操作
(1)允许10.0.0.254 PING我的主机10.0.0.201
# iptables -t filter -I INPUT 2 -s 10.0.0.254 -d 10.0.0.201 -p icmp -j ACCEPT
(2)禁止所有人PING我的主机10.0.0.201
# iptables -t filter -A INPUT -d 10.0.0.201 -p icmp -j DROP
(3)允许10.0.0.254 和我的笔记本 访问我的80端口和SSH端口
# iptables -t filter -A INPUT -s 10.0.0.254 -d 10.0.0.201 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A INPUT -s 10.0.0.3 -d 10.0.0.201 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A INPUT -s 10.0.0.254 -d 10.0.0.201 -p tcp --dport 80 -j ACCEPT
# iptables -t filter -A INPUT -s 10.0.0.3 -d 10.0.0.201 -p tcp --dport 80 -j ACCEPT
(4)其余的人全部拒绝连接SSH 端口号
# iptables -t filter -A INPUT -d 10.0.0.201 -p tcp --dport 22 -j DROP
nat表操作
POSTROUTING 链 是将本地ip地址伪装成公网ip地址<源>
-o eth0 是 –output eth0 的缩写
-i eth0 是 –input eth0 的缩写
PREROUTING 链 是将外网地址IP转换成内网地址 <目标>
DNAT 转换目标地址
SNAT 转换源地址
1024:65535 端口转换范围 中间段写法
1024-65535 端口转换范围 最后一段写法
any/0 所有IP地址,不限制范围 -d any/0 -s any/0
(1)、启动内部对外转址
将10.0.0.0 这个网段,伪装成118.251.117.250出去,此IP为防火墙外网IP。
(DNAT)要把别人的公网地址转换成你们内部的IP,数据流入必然经过PRE
#iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/16 -j SNAT --to-source 118.251.117.250
# iptables -L -t nat 查看
-----
|网口公网地址。
IPTABLES
|
|
LVS
\
WEB WE
\REDIS
\MYSQL
\
(2)、启动内部对外转址
将10.0.0.0/16 这个网段,允许访问外网的http 80端口,到公网后转换成118.251.117.250
#iptables -t nat -A POSTROUTING -o eth1 -p tcp -s 10.0.0.0/16 --dport 80 -j SNAT --to-source 118.251.117.250
(3):启动端口影射
将内网的web服务器10.0.0.201的80端口发布出去
当外网地址访问$FW_IP 80端口的时候,将其转发到10.0.0.201
#:$FW_IP=”118.251.117.250”
#iptables -t nat -A PREROUTING -i eth1 -p tcp -d 118.251.117.250 --dport 80 -j DNAT --to-destination 10.0.0.201
七、IPTBALES本章作业
(1)允许10.0.2.254可以PING你的地址,其它人全部禁止
# iptables -t filter -I INPUT 2 -s 10.0.0.254 -d 10.0.0.201 -p icmp -j ACCEPT
# iptables -t filter -A INPUT -d 10.0.0.201 -p icmp -j DROP
(2)允许10.0.2.254和你目前用的真实机可以ssh登陆你的机器,其它的全部禁止掉
# iptables -t filter -A INPUT -s 10.0.0.254 -d 10.0.0.201 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A INPUT -s 10.0.0.3 -d 10.0.0.201 -p tcp --dport 22 -j ACCEPT
# iptables -t filter -A INPUT -d 10.0.0.201 -p tcp --dport 22 -j DROP
(3)允许10.0.2.254访问你的20 和21号端口,其它人全部禁止
# iptables -t filter -A INPUT -s 10.0.0.254 -d 10.0.0.201 -p tcp --dport 21 -j ACCEPT
# iptables -t filter -A INPUT -s 10.0.0.254 -d 10.0.0.201 -p tcp --dport 20 -j ACCEPT
# iptables -t filter -A INPUT -d 10.0.0.201 -p tcp --dport 20 -j DROP
# iptables -t filter -A INPUT -d 10.0.0.201 -p tcp --dport 21 -j DROP
(4)禁止10.0.2.254访问你的53号端口。其它的人全部允许
#iptables -A FORWARD -s 10.0.2.254 -p tcp --dport 53 -j DROP
#iptables -A FORWARD -d 10.0.0.201 -p tcp --dport 53 -j ACCEPT
(5)禁止10.0.2.254访问你的80端口,其它人全部允许
#iptables -A FORWARD -s 10.0.2.254 -p tcp --dport 80 -j DROP
#iptables -A FORWARD -d 10.0.0.201 -p tcp --dport 80 -j ACCEPT
(6)允许10.0.0.2.254访问你的23端口。其它人全部禁止
#iptables -A FORWARD -s 10.0.2.254 -p tcp --dport 23 -j ACCEPT
#iptables -A FORWARD -d 10.0.0.201 -p tcp --dport 23 -j DROP
(7)通过NAT表WEB服务器10.0.2.231的80端口发布出去。
(8)通过NAT表FTP服务器10.0.2.232的20 21端口发布出去
1.拒绝进入防火墙的所有ICMP协议数据包
iptables -I INPUT -p icmp -j REJECT
2.允许防火墙转发除ICMP协议以外的所有数据包
iptables -A FORWARD -p ! icmp -j ACCEPT
说明:使用“!”可以将条件取反。
3.拒绝转发来自192.168.1.10主机的数据,允许转发来自192.168.0.0/24网段的数据
iptables -A FORWARD -s 192.168.1.11 -j REJECT
iptables -A FORWARD -s 192.168.0.0/24 -j ACCEPT
说明:注意要把拒绝的放在前面不然就不起作用了啊。
4.丢弃从外网接口(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
5.封堵网段(192.168.1.0/24),两小时后解封。
[root@server ~]# iptables -I INPUT -s 10.20.30.0/24 -j DROP
[root@server ~]# iptables -I FORWARD -s 10.20.30.0/24 -j DROP
[root@server ~]# at now +2 hours
at> iptables -D INPUT 1
at> iptables -D FORWARD 1
说明:这个策略咱们借助crond计划任务来完成,就再好不过了。
[1]+ Stopped at now +2 hours
6.只允许管理员从202.13.0.0/16网段使用SSH远程登录防火墙主机。
iptables -A INPUT -p tcp --dport 22 -s 202.13.0.0/16 -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP
说明:这个用法比较适合对设备进行远程管理时使用,比如位于分公司中的SQL服务器需要被总公司的管理员管理时。
7.允许本机开放从TCP端口20-1024提供的应用服务。
iptables -A INPUT -p tcp --dport 20:1024 -j ACCEPT
iptables -A OUTPUT -p tcp --sport 20:1024 -j ACCEPT
8.允许转发来自192.168.0.0/24局域网段的DNS解析请求数据包。
iptables -A FORWARD -s 192.168.0.0/24 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -d 192.168.0.0/24 -p udp --sport 53 -j ACCEPT
9.禁止其他主机ping防火墙主机,但是允许从防火墙上ping其他主机
iptables -I INPUT -p icmp --icmp-type Echo-Request -j DROP
iptables -I INPUT -p icmp --icmp-type Echo-Reply -j ACCEPT
iptables -I INPUT -p icmp --icmp-type destination-Unreachable -j ACCEPT
10.禁止转发来自MAC地址为00:0C:29:27:55:3F的和主机的数据包
iptables -A FORWARD -m mac --mac-source 00:0c:29:27:55:3F -j DROP
说明:iptables中使用“-m 模块关键字”的形式调用显示匹配。咱们这里用“-m mac –mac-source”来表示数据包的源MAC地址。
11.允许防火墙本机对外开放TCP端口20、21、25、110以及被动模式FTP端口1250-1280
iptables -A INPUT -p tcp -m multiport --dport 20,21,25,110,1250:1280 -j ACCEPT
说明:这里用“-m multiport –dport”来指定目的端口及范围
12.禁止转发源IP地址为192.168.1.20-192.168.1.99的TCP数据包。
iptables -A FORWARD -p tcp -m iprange --src-range 192.168.1.20-192.168.1.99 -j DROP
说明:此处用“-m –iprange –src-range”指定IP范围。
13.禁止转发与正常TCP连接无关的非—syn请求数据包。
iptables -A FORWARD -m state --state NEW -p tcp ! --syn -j DROP
说明:“-m state”表示数据包的连接状态,“NEW”表示与任何连接无关的,新的嘛!
14.拒绝访问防火墙的新数据包,但允许响应连接或与已有连接相关的数据包
iptables -A INPUT -p tcp -m state --state NEW -j DROP
iptables -A INPUT -p tcp -m state --state ESTABLISHED,RELATED -j ACCEPT
说明:“ESTABLISHED”表示已经响应请求或者已经建立连接的数据包,“RELATED”表示与已建立的连接有相关性的,比如FTP数据连接等。
15.只开放本机的web服务(80)、FTP(20、21、20450-20480),放行外部主机发住服务器其它端口的应答数据包,将其他入站数据包均予以丢弃处理。
iptables -I INPUT -p tcp -m multiport --dport 20,21,80 -j ACCEPT
iptables -I INPUT -p tcp --dport 20450:20480 -j ACCEPT
iptables -I INPUT -p tcp -m state --state ESTABLISHED -j ACCEPT
iptables -P INPUT DROP