首页 > 代码库 > 2-10~2-11 配置iptables防火墙增强服务 selinux简单讲解
2-10~2-11 配置iptables防火墙增强服务 selinux简单讲解
学习一个服务的过程:
1、此服务器的概述:名字,功能,特点,端口号
2、安装
3、配置文件的位置
4、服务启动关闭脚本,查看端口
5、此服务的使用方法
6、修改配置文件,实战举例
7、排错(从下到上,从内到外)
-------------------------------------
iptables概述
netfilter/iptables : IP信息包过滤系统,它实际上由两个组件netfilter 和 iptables 组成。
netfilter/iptables 关系:
netfilter 组件也称为内核空间(kernelspace),是内核的一部分,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。
iptables 组件是一种工具,也称为用户空间(userspace),它使插入、修改和除去信息包过滤表中的规则变得容易。
netfilter/iptables 后期简称为:iptables。 iptables是基于内核的防火墙,功能非常强大,iptables内置了filter,nat和mangle三张表。
所有规则配置后,立即生效,不需要重启服务。
三张表介绍:
filter负责过滤数据包,包括的规则链有,INPUT,OUTPUT和forward;
nat则涉及到网络地址转换,包括的规则链有,PREROUTING,POSTROUTING和OUTPUT;
mangle表则主要应用在修改数据包内容上,用来做流量整形的,给数据包打个标识,默认的规则链有:INPUT,OUTPUT,FORWARD,POSTROUTING,PREROUTING;
五个链:
INPUT匹配目标IP是本机的数据包,
OUTPUT 出口数据包,一般不在此链上做配置
forward匹配流经本机的数据包,
PREROUTING用来修改目的地址,用来做DNAT 。
如:把内网中的80端口映射到路由器外网端口上
POSTROUTING用来修改源地址用来做SNAT。
如:内网通过路由器NAT转换功能实现内网PC机通过一个公网IP地址上网。
总结:iptables三个表,五个链接
结构如图:
Raw表:用于处理异常,包括的规则链有,prerouting,output; 一般使用不到。
[root@xiaogan64 ~]# iptables -t raw -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
表中包含有链,链中含有规则,各表中同名链互不影响
表--> 链 --> 规则
[root@xiaogan64 ~]# iptables -t mangle -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
[root@xiaogan64 ~]# iptables -t filter -L
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere multiport dports ssh,http
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
###一般企业中多用物理防火墙 思科华为等等等
# 软件防火墙主要用来内网上网
Iptables过滤封包流程
说明: 整体数据包分两类: 1、发给防火墙本身的数据包 ;2、需要经过防火墙的软件包
① 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转送出去。
② 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。
本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出。
③ 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过FORWARD链,然后到达POSTROUTING链输出。
表间优先顺序
raw > mangle > nat > filter
链间匹配顺序
入站:PREROUTING,INPUT
出站:OUTPUT,POSTROUTING
转发:PREROUTING,FORWARD,POSTROUTING
链内匹配规则:
自上向下按顺序进行检查,找到相匹配的规则即停止(LOG选项表示记录相关日志)
若在该链内找不到相匹配的规则,则按该链的默认策略处理(若为修改状态下,默认策略为允许)
总结:
整体数据包分两类: 1、发给防火墙本身的数据包 ;2、需要经过防火墙的数据包注意:规则的次序非常关键,谁的规则越严格,应该放的越靠前,而检查规则的时候,是按照从上往下的方式进行检查的。
Iptables部署
Iptables实验比较单一,但是逻辑性又强,所以我们一个一个的实验疏通
安装:
查询是否已安装iptables
which iptables
安装iptables软件包
rpm -ivh /mnt/Packages/iptables-1.4.7-16.el6.x86_64.rpm
核心配置文件: ---> /etc/sysconfig/iptables
# 我们进行的各种iptables规则配置,都体现在这个文件中,所以我们也可以直接修改这个配置文件来实现配置防火墙iptables.
添加开机启动等
chkconfig --list iptables #查询iptables 开机启动状态
chkconfig iptables on #启用iptables开机启动
/etc/init.d/iptables start #启动iptables
service iptables start #同上
iptables使用方法:
Usage:
iptables [-t 表名] 管理选项 [链名] 匹配条件 [-j 动作或跳转]
# 不指定表名时,默认是filter
# 不指定链名时,默认表内所有链
# 除非设置规则链的缺省策略,否则需要指定匹配条件
-t table #指定要操作的表为table
commands #要进行的操作
-A chain #对链进行追加规则 append
-C chain #检查链的规则 check
-D chain rulenum #删除链的第rulenum条规则 Delete
-P chain target #设置链默认值 Policy
-I chain [rulenum] #向链中插入规则 Insert
-F [chain] #清空规则 FLUSH
-L [chain [rulenum]] #列出 LIST
举例:
-A <链名> APPEND,追加一条规则(放到最后)
iptables -t filter -A INPUT -j DROP #拒绝所有人访问服务器
# 作用: 在表filter的INPUT链中追击一条规则,匹配所有访问本机IP的数据包,匹配到的丢弃
# 谨慎使用
-I <链名> [规则号码] INSERT,插入一条规则
iptables -I INPUT -j DROP
# 作用: 在filter表中的INPUT链中插入一条规则,
iptables -I INPUT 3 -j DROP
# 作用: 在filter表中的INPUT链中到第三条规则
注意: 1、-t filter 可不写,不写则自动默认是 filter 表
2、-I 链名 [规则号码],如果不写规则号码,则默认是 1
3、确保规则号码 ≤ (已有规则数 + 1),否则报错配置
-D <链名> <规则号码 | 具体规则内容> DELETE,删除一条规则
iptables -D INPUT 1(按号码匹配)
# 删除 filter 表 INPUT 链中的第1条规则(不管它的内容是什么)
iptables -D INPUT -s 192.168.0.1 -j DROP(按内容匹配)
# 删除 filter 表 INPUT 链中内容为“-s 192.168.0.1 -j DROP”的规则(不管其位置在哪里)
注意:
1、若规则列表中有多条相同的规则时,按内容匹配只删除序号最小的一条
2、按号码匹配删除时,确保规则号码 ≤ 已有规则数,否则报错
3、按内容匹配删除时,确保规则存在,否则报错
-P <链名> <动作> POLICY,设置某个链的默认规则
iptables -P INPUT DROP
# 设置 filter 表 INPUT 链的默认规则是 DROP
注意:当数据包没有被规则列表里的任何规则匹配到时,按此默认规则处理。动作前面不能加 –j,这也是唯一一种匹配动作前面不加 –j 的情况。
-F [链名] FLUSH,清空规则
添加规则:
iptables -F INPUT #清除filter表中INPUT链上的规则
iptables -F #清除filter表中所有链上的规则
iptables -t nat -F #清空NAT表中所有链上的规则
iptables -t nat -F PREROUTING #清空NAT表中 PREROUTING链上的规则
注意:
1、-F 仅仅是清空链中规则,并不影响 -P 设置的默认规则。
2、-P 设置了 DROP 后,使用 -F 一定要小心!!!
##在生产环境中,使用-P DROP 这条规则,一定要小心,设置之前最好配置下面两个任务计划,否则容易把自己drop掉,链接不上远程主机。
配置crontab :
*/15 * * * * iptables -P INPUT ACCEPT
*/15 * * * * iptables –F
3、如果不写链名,默认清空某表里所有链里的所有规则
-L [链名] LIST,列出规则
v:显示详细信息,包括每条规则的匹配包数量和匹配字节数
x:在 v 的基础上,禁止自动单位换算(K、M)
n:只显示 IP 地址和端口号码,不显示域名和服务名称
--line-number 可以查看到规则号
iptables -L
# 粗略列出 filter 表所有链及所有规则
iptables -t nat -vnL
# 用详细方式列出 nat 表所有链的所有规则,只显示 IP 地址和端口号
iptables -t nat -vxnL PREROUTING
# 用详细方式列出 nat 表 PREROUTING 链的所有规则以及详细数字,不反解
常用组合:iptables -nvl
互动: iptables -L -n 可以执行成功
iptables -Ln 是否可以执行成功?
匹配条件
£流入、流出接口(-i、-o)
£来源、目的地址(-s、-d)
£协议类型 (-p)
£来源、目的端口(--sport、--dport)
按网络接口匹配
-i <匹配数据进入的网络接口> #此参数主要应用于nat表,例如目标地址转换
-i eth0 # 匹配是否从网络接口 eth0 进来
-i ppp0 # 匹配是否从网络接口 ppp0 进来
-o 匹配数据流出的网络接口
-o eth0
-o ppp0
按来源目的地址匹配
-s <匹配来源地址> # 可以是 IP、NET、DOMAIN,也可空(任何地址)
-s 192.168.0.1 # 匹配来自 192.168.0.1 的数据包
-s 192.168.1.0/24 # 匹配来自 192.168.1.0/24 网络的数据包
-s 192.168.0.0/16 # 匹配来自 192.168.0.0/16 网络的数据包
-d <匹配目的地址> # 可以是 IP、NET、DOMAIN,也可以空
-d 202.106.0.20 # 匹配去往 202.106.0.20 的数据包
-d 202.106.0.0/16 # 匹配去往 202.106.0.0/16 网络的数据包
-d www.abc.com # 匹配去往域名 www.abc.com 的数据包
按协议类型匹配
-p <匹配协议类型> # 可以是 TCP、UDP、ICMP 等,也可为空
-p tcp
-p udp
-p icmp --icmp-type 类型
ping: type 8 pong: type 0
按来源目的端口匹配
--sport <匹配源端口> # 可以是个别端口,可以是端口范围
--sport 1000 # 匹配源端口是 1000 的数据包
--sport 1000:3000 # 匹配源端口是 1000-3000 的数据包(含1000、3000)
--sport :3000 # 匹配源端口是 3000 以下的数据包(含 3000)
--sport 1000: # 匹配源端口是 1000 以上的数据包(含 1000)
--dport <匹配目的端口> # 可以是个别端口,可以是端口范围
--dport 80 # 匹配目的端口是 80 的数据包
--dport 6000:8000 # 匹配目的端口是 6000-8000 的数据包(含6000、8000)
--dport :3000 # 匹配目的端口是 3000 以下的数据包(含 3000)
--dport 1000: # 匹配目的端口是 1000 以上的数据包(含 1000)
注意:--sport 和 --dport 必须配合 -p 参数使用
匹配应用举例
1、端口匹配
-p udp --dport 53
# 匹配网络中目的端口是 53 的 UDP 协议数据包
2、地址匹配
-s 10.1.0.0/24 -d 172.17.0.0/16
# 匹配来自 10.1.0.0/24 去往 172.17.0.0/16 的所有数据包
3、端口和地址联合匹配
-s 192.168.0.1 -d www.abc.com -p tcp --dport 80
# 匹配来自 192.168.0.1,去往 www.abc.com 的 80 端口的 TCP 协议数据包
注意:
1、--sport、--dport 必须联合 -p 使用,必须指明协议类型是什么
2、条件写的越多,匹配越细致,匹配范围越小
动作(处理方式)
£ACCEPT
£DROP
£SNAT
£DNAT
£MASQUERADE
-j ACCEPT # 通过,允许数据包通过本链而不拦截它
iptables -A INPUT -j ACCEPT
# 允许所有访问本机 IP 的数据包通过
-j DROP # 丢弃,阻止数据包通过本链而丢弃它
iptables -A FORWARD -s 192.168.80.39 -j DROP
# 阻止来源地址为 192.168.80.39 的数据包通过本机
-j SNAT --to IP[-IP][:端口-端口](nat 表的 POSTROUTING 链)
# 源地址转换,SNAT 支持转换为单 IP,也支持转换到 IP 地址池
地址池(一组连续的 IP 地址)
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1
# 将内网 192.168.0.0/24 的原地址修改为 1.1.1.1,用于 NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to 1.1.1.1-1.1.1.10
# 同上,只不过修改成一个地址池里的 IP
-j DNAT --to IP[-IP][:端口-端口](nat 表的 PREROUTING 链)
# 目的地址转换,DNAT 支持转换为单 IP,也支持转换到 IP 地址池
地址池(一组连续的 IP 地址)
把从 eth0 进来的要访问 TCP/80 的数据包目的地址改为 192.168.0.1
方式1:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1
方法2:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1:80
把从 eth0 进来的要访问 TCP/80 的数据包目的地址改为 192.168.0.1-192.169.1.10
方法3:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.0.1-192.169.0.10
-j MASQUERADE # 动态源地址转换(动态 IP 的情况下使用)
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j MASQUERADE
# 将源地址是 192.168.0.0/24 的数据包进行地址伪装,转换成eth0上的IP地址。eth0为路由器外网出口IP地址
附加模块
£按包状态匹配 (state)
£按来源 MAC 匹配(mac)
£按包速率匹配 (limit)
£多端口匹配 (multiport)
按包状态匹配 (state)
-m state --state 状态
状态:NEW、RELATED、ESTABLISHED、INVALID
NEW:有别于 tcp 的 syn #如果我们发送一个流的初始化包,状态就会在OUTPUT链里被设置为NEW,当我们收到回应的包时,状态就会在PREROUTING链里被设置为ESTABLISHED。如果第一个包不是本地产生的,那就会在PREROUTING链里被设置为NEW状 态。
ESTABLISHED:连接态
RELATED:衍生态,与 conntrack 关联(FTP)
INVALID:不能被识别属于哪个连接或没有任何状态
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
四个状态:
State(状态) | Explanation(注释) |
NEW | NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。 |
ESTABLISHED | ESTABLISHED已经注意到两个方向上的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防 火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我们所发出的信息的应答。 |
RELATED | RELATED是个比较麻烦的状态。当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想 是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这 个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议 是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。 |
INVALID | INVALID说明数据包不能被识别属于哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP错误信息。一般地,我们DROP这个状态的任何东西。 |
这些状态可以一起使用,以便匹配数据包。这可以使我们的防火墙非常强壮和有效。以前,我们经常打开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那些有应答数据的端口,其他的都可以关闭。这样就安全多了。
TCP三次握手时,连接状态:
现在我们发出了三步握手的最后一个包,即ACK包,连接也就进入ESTABLISHED状态了。再传输几个数据 包,连接就是[ASSURED]的了。
下面介绍TCP连接在关闭过程中的状态。
配置vsftp服务器主动模式iptables规则:
iptables配置FTP的主动和被动模式
FTP协议有两种工作方式:PORT方式和PASV方式,中文意思为主动式和被动式。
Port模式:ftp server:tcp 21 <------client:dynamic ftp server:tcp 20 ------>client:dynamic
Pasv模式:ftp server:tcp 21 <----client:dynamic ftp server:tcp dynamic <----client:dynamic
PORT(主动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,客户端在命令链路上用PORT命令告诉服务器:“我打开了XXXX端口,你过来连接我”。于是服务器从20端口向客户端的XXXX端口发送连接请求,建立一条 数据链路来传送数据。
PASV(被动)方式的连接过程是:客户端向服务器的FTP端口(默认是21)发送连接请求,服务器接受连接,建立一条命令链路。当需要传送数据时,服务 器在命令链路上用PASV命令告诉客户端:“我打开了XXXX端口,你过来连接我”。于是客户端向服务器的XXXX端口发送连接请求,建立一条数据链路来 传送数据。
1、开放20、21端口:
# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
放行本地回环网络
iptables -A INPUT -i lo -j ACCEPT
放行21,22.80端口
iptables -A INPUT -p tcp -m multiport --dports 21,22,80 -j ACCEPT
放行已连接的网络状态
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
放行icmp协议
iptables -A INPUT -p icmp -j ACCEPT
Iptables 指南 1.1.19
https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#STATEMACHINEINTRODUCTION
如果不行:
3、上面还不行的话,再加载FTP额外模块:
modprobe ip_nat_ftp (我 做实验只加载这一块就ok了)
modprobe ip_conntrack
modprobe ip_conntrack_ftp
按来源 MAC 匹配(mac)
-m mac --mac-source MAC
匹配某个 MAC 地址
iptables -A FORWARD -m mac --mac-source xx:xx:xx:xx:xx:xx -j DROP
阻断来自某 MAC 地址的数据包,通过本机
注意:报文经过路由后,数据包中原有的 mac 信息会被替换,所以在路由后的 iptables 中使用 mac 模块是没有意义的
按包速率匹配 (limit)
-m limit --limit 匹配速率 [--burst 缓冲数量]
用一定速率去匹配数据包
iptables -A FORWARD -d 192.168.0.1 -m limit --limit 50/s -j ACCEPT
iptables -A FORWARD -d 192.168.0.1 -j DROP
注意:limit 英语上看是限制的意思,但实际上只是按一定速率去匹配而已,50/s表示1秒中转发50个数据包,要想限制的话后面要再跟一条 DROP
多端口匹配(multiport)
-m multiport <--sports|--dports|--ports> 端口1[,端口2,..,端口n]
一次性匹配多个端口,可以区分源端口,目的端口或不指定端口
iptables -A INPUT -p tcp -m multiport --dports 21,22,25,80,110 -j ACCEPT
注意:必须与 -p 参数一起使用
保存:/etc/init.d/iptables save
Iptables 实例:iptablesde 使用方法
实验环境:
服务端:xiaogan64.cn IP: 192.168.31.64 192.168.2.1
客户端:xiaogan63.cn IP: 192.168.2.63
服务端 xiaogan64.cn :
检测iptables是否安装,并安装启动
which iptables # 查看iptables命令是否已安装
rpm -qf `which iptables` #查看iptables命令由哪个安装包安装的
说明:由于iptables命令是以连接的形式放在/sbin/iptables的,所以要查询源地址才能查到,也可以直接按如下方法查询:
rpm -qf /etc/init.d/iptables
安装:
rpm -ivh /mnt/Packages/iptables-*.rpm
yum -y install iptables
开机启动:
chkconfig iptables on
chkconfig --list iptables
启动:
/etc/init.d/iptables start
例1:使用iptables防火墙保护公司web服务器
分析:允许单服务器的防护
对外服务对象
书写规则
网络接口lo处理
协议+端口的处理
状态检测的处理
配置如下:
服务端 xiaogan64.cn :
1.1 本地回环网络放行
iptables -A INPUT -i lo -j ACCEPT
1.2 放行ssh和web端口
iptables -A INPUT -p tcp -m multiport --dport 22,80 -j ACCEPT
1.3 放行已建立连接
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
#允许已经建立tcp连接的包以及该连接相关的包通过。状态防火墙能识别TCP或者UDP会话。非状态防火墙只能根据端口识别,不能识别会话
1.4 设置默认禁止
iptables -P INPUT DROP
注:一般iptables,OUTPUT出口一般都放行,不需要在出口上做限制。这样允许服务器主动访问外网所有数据。
1.5 启动httpd服务器
service httpd start
1.6 启动vsftpd服务
/etc/init.d/vsftpd start
2 客户端测试
2.1 安装 elinks和 lftp并测试服务器
yum -y install elinks
测试web访问80端口
elinks 192.168.247.64
yum -y install lftp
测试vsftpd访问
lftp 192.168.31.64
ls
例2:使用iptables搭建路由器,通过SNAT使用内网机器上网
分析: 内网机器,通过iptables服务器,访问互联网
内网机器与iptables服务器通信
iptables服务器将内网机器请求转发到外网网卡,实现内网机器上网
故,iptables服务器,开启内核路由转发功能
1.
echo 1 > /proc/sys/net/ipv4/ip_forward
vim /etc/sysctl.conf
修改net.ipv4.ip_forward = 0 为
net.ipv4.ip_forward = 1
将修改应用到系统
sysctl -p
2.
在配置iptables之前,需将iptables清空,以免上面的实验影响
在清空iptables 之前,首先将例1中INPUT的默认值改回来,不然会断掉
iptables -P INPUT ACCEPT
iptables -F
3.
设置eth0,为桥接模式,eth1 vmnet6模式
添加网卡eth1,并设置eth1使用vmnet6网络环境后,设置IP
ifconfig eth1 192.168.2.1/24
注意:如果要通过修改配置文件实现设置eth1网卡, 不要设置网关,不然服务器不能上网
设置iptables转发规则:(由于转发是不经过本机的,须在nat表的POSTROUTING链中修改)
iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -j SNAT --to 192.168.31.64
禁止访问服务器本身
iptables -A INPUT -s 192.168.2.0/24 -j DROP
禁止通过服务器访问其他主机
iptables -A FORWARD -d 192.168.31.0/24 -j DROP
4.
在客户端xiaogan63中
设置eth0 vmnet6模式
并修改eth0 IP:192.168.2.63 GATEWAY=192.168.2.1(服务器eth1地址) NETMASK=255.255.255.0
ping 192.168.2.1
ping 192.168.31.1
ping www.baidu.com
例3:拒绝访问服务器本身和拒绝通过服务器访问别的机器。
# 主要是考大家是否明白iptables每个链的作用
£过滤位置 filer 表 FORWARD 链
£匹配条件 -s -d -p --s/dport
£处理动作 ACCEPT DROP
总结:
添加规则,要添加在最靠近数据流源的链上,减少服务器不必要的资源开销。
禁止访问服务器本身
iptables -A INPUT -s 192.168.2.0/24 -j DROP
禁止通过服务器访问其他主机
iptables -A FORWARD -d 192.168.31.0/24 -j DROP
限制某个mac地址访问服务器
iptables -A INPUT --mac-source XX:XX:XX:XX:XX:XX -j DROP
限制某个IP访问服务器
iptables -A INPUT -s XXX.XXX.XXX.XXX -j DROP
限制某个
例4:使用DNAT功能把内网web服务器端口映射到路由器外网
分析:把内网web服务器的80端口映射到iptables服务器的80端口,让外网通过访问iptables的80端口,实现访问内网的web服务器
iptables -t nat -A PREROUTING -d 192.168.31.64 -t tcp --dport 80 -j DNAT --to 192.168.2.63:80
或
iptables -t nat -A PREROUTING -d 192.168.31.64 -j DNAT --to 192.168.2.63
或
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to 192.168.2.63:80
测试:宿主机浏览器访问:192.168.0.63:80 即可访问到64的内容
如果是ADSL则为:
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 -j DNAT --to 192.168.2.63:80
iptables命令使用总则总结:
£所有链名必须大写
INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING
£所有表名必须小写
filter/nat/mangle
£所有动作必须大写
ACCEPT/DROP/SNAT/DNAT/MASQUERADE
£所有匹配必须小写
-s/-d/-m <module_name>/-p
关于SNAT和DNAT的区别:
http://www.cnblogs.com/iceocean/articles/1616305.html
Selinux概述-状态切换
SELinux( Security Enhanced Linux 安全性增强的Linux)
由美国国家安全局NSA(National Security Agency)开发,构建在Kernel之上,拥有灵活的强制性访问控制结构,主要用在提高Linux的安全性,提供强健的安全保证,可以防御未知攻击,据称相当于B1级的军事安全性能(信息安全评估标准)!
信息安全评估标准:4类(D,C,B,A),7个级别:D,C1,C2,B1,B2,B3,A
Selinux已经整合到了2.6的Kernel以上的版本中
传统的Linux在没有Selinux保护的时候,倘若运行于之上的服务器被骇客攻陷,其服务器最高权限就可能随之丧失,但是倘若有了SElinux的保护,入侵的也只有服务本身,整个服务器的最高权限依然还健在!
一句话熟悉Selinux的作用:增强Linux系统安全性,一个例子:那么是我运行的Apache服务器被入侵,也只是入侵到了我httpd这个服务,可以把它禁锢到这里(相当于整个服务器运行了httpd,入侵了httpd而已),而系统的整个权限依然正常!
Selinux特点
1:MAC(Mandator Access Control) 对访问控制彻底化,对所有的文件,目录,端口的访问,都是基于策略设定的,这些策略都是由管理员设定的,一般用户无权限管理和更改
2:RBAC(Role Base Access Control) 对用户只赋予最小权限,对于用户来说,被划分一些role,即使是root用户,你要是不在sysadm_r里,也不能实行sysadm_t的管理操作
3:TE(Type Enforcement) 对进程只赋予最小运行权限,TE的概念在SElinux中非常重要,其特点是对文件赋予一个叫type的标签类型,对进程赋予一个叫domain的标签,可以规定某个标签进程只能执行某类文件,
例如:
我们熟悉的apache服务器,httpd进程只能在httpd_t 里运行,这个httpd_t 的domain能执行的操作,比如能读网页内容文件赋予httpd_sys_content_t,密码文件赋予shadow_t,TCP的80端口赋予 http_port_t等等。如果在access vector里我们不允许 http_t来对http_port_t进行操作的话,Apache启动都启动不了。反过来说,我们只允许80端口,只允许读取被标为 httpd_sys_content_t的文件,httpd_t就不能用别的端口,也不能更改那些被标为httpd_sys_content_t的文件(read only)
一句话:SELinux系统比起通常的Linux系统来,安全性能要高的多,它通过对于用户,进程权限的最小化,即使受到攻击,进程或者用户权限被夺去,也不会对整个系统造成重大影响。(这个进程只能执行某些标签的操作,你有了这个用户权限,也只能干这个标签的事儿)
Selinux工作原理
首先有系统策略,subject去访问object的时候,也会去看系统策略
当一个subject(如: 一个应用)试图访问一个object(如:一个文件),Kernel中的策略执行服务器将检查AVC (Access Vector Cache), 在AVC中,subject和object的权限被缓存(cached)。如果基于AVC中的数据不能做出决定,则请求安全服务器,安全服务器在一个矩阵中查找“应用+文件”的安全环境。然后根据查询结果允许或拒绝访问,拒绝消息细节位于/var/log/messages中。
只有当你系统策略和Selinux的策略都通过时,才能正常访问!
A ----B 系统权限 、selinux
selinux 启动 AVC –优先查找AVC----拒绝---查看Selinux Security Server---放入AVC—访问
[root@xiaogan63 ~]# vim /etc/sysconfig/selinux
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# 强制模式,只要Selinux不允许,就无法执行
# permissive - SELinux prints warnings instead of enforcing.
# 警告模式,将事件记录,依然执行
# disabled - No SELinux policy is loaded.
# 关闭Linux
SELINUX=disabled #默认启用,我们的实验环境关闭了,启用需要重启系统
# SELINUXTYPE= can take one of these two values:
# targeted - Targeted processes are protected, 这对主要的网络服务进行保护如apache,sendmail,bind,postgresql等,不属于那些domain的就都让他们在unconfined_t里,可导入性高,可用性好但是不能对整体进行保护。
# mls - Multi Level Security protection. 多层安全保护,MLS策略确保有适当许可(clearance)的Subject访问特定分类(classification)的Object。什么人什么等级可以访问不同内容!了解即可!
# Strict,是NAS开发的,能对整个系统进行保护,但是设定复杂,我认为虽然它复杂,但是一些基本的会了,还是可以玩得动的。
SELINUXTYPE=targeted #默认为targeted
服务开关
[root@xiaogan63 ~]# rpm -qa | grep selinux
//与selinux相关软件包,默认已经安装
libselinux-utils-2.0.94-5.3.el6_4.1.x86_64
libselinux-devel-2.0.94-5.3.el6_4.1.x86_64
selinux-policy-3.7.19-231.el6.noarch
libselinux-python-2.0.94-5.3.el6_4.1.x86_64
selinux-policy-targeted-3.7.19-231.el6.noarch
libselinux-2.0.94-5.3.el6_4.1.x86_64
[root@xiaogan63 ~]# ls /etc/sysconfig/selinux //配置文件位置
[root@xiaogan63 ~]# getenforce //查看当前selinux的运行状态
[root@xiaogan63 ~]# vim /etc/sysconfig/selinux
//编辑selinux配置文件,启用selinux
SELINUX=enforcing
#启用selinux,启用了Selinux需要重启系统,初次开启,需要更新文件标签,时间较久
Selinux状态切换
[root@xiaogan63 ~]# setenforce 0 //enforcing切换为permissive状态
[root@xiaogan63 ~]# getenforce
Permissive
[root@xiaogan63 ~]# setenforce 1 //permissive切换为 enforcing
[root@xiaogan63 ~]# getenforce
Enforcing
内核参数控制Selinux
关闭Selinux可以通过内核传递参数来控制
[root@xiaogan63 ~]# vim /boot/grub/grub.conf
……
kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=31f87693-32fa-4811-b5d4-7a5d35586f44 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=128M KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet selinux=0
#末尾添加selinux=0关闭selinux
……
或者在开机时编辑grub界面,给内核传递一个参数selinux=0 方法和进入单用户方式一样,不过是一次有效
上图,按E键,进入单用户模式
上图按E键,添加内核参数selinux=0
回车,按B键启动操作系统
[root@xiaogan63 ~]# getenforce
Disabled
[root@xiaogan63 ~]# vim /etc/sysconfig/selinux
……
SELINUX=enforcing #配置文件还是启用的,所以内核控制生效,如果在grub.conf配置文件,永久生效,启动单用户模式配置,当次有效,重启selinux将启用
……
[root@xiaogan63 ~]# reboot //重启会更新标签,是个”漫长”的过程
2-10~2-11 配置iptables防火墙增强服务 selinux简单讲解