linux自身的安全访问控制可以从以下几个层次实现。
以太网层和网络层:arptables ---工作在以太网层防止arp欺骗,
网络层和传输层:iptables ---根据通信双方的协议数据包的某些特征来实现过滤。
工作在应用层:tcpwrappers
应用层针对于网络的可以使用squid实现访问控制。
特别说明一下杀毒软件和网络访问没有关系。
什么是防火墙
防火墙是一组工作在网路或者主机的边缘,对于进出本网络或主机的数据包根据实现预制好的规则进行检查,并且能够在实现数据包匹配之由规则指定的动作进行处理的组件的组合
防火墙的分类
包过滤型防火墙,工作在TCP/IP层
tcp,ip
根据tcp首部或ip首部数据进行判断
应用层网关防火墙,工作在应用层
根据数据包传输的实际数据进行判断
包过滤型防火墙的分类
简单包过滤
tcp,ip
带状态检测的包过滤
NEW 该包想要开始一个新的连接
ESTABLISHED 该包属于某个已经建立的连接
INVALID 无法识别的状态
RELATED 相关联的
防火墙功能
filter:INPUT,OUTPUT,FORWORD 过滤 表示不允许访问
nat:PRERONTING,POSTROUTING,OUTPUT 地址转换
mangle:PRERONTING,POSTROUTING,OUTPUT,FORWORD,INPUT 把数据包首部拆开修改后再结合
防火墙如何工作的
防火墙要放在内核进行实施,规则在用户空间定义,但规则要在内核实现,所以在内核空间内要具有接受用户定义规则的接口,这个接口叫Netfilter:网络过滤器,本身不过滤数据包只要有放上规则之后才进行过滤,多条规则组成ipchains ,多个ipchaices 组成tables。
iptables
iptables 是一个工具,具体命令格式如下
iptables:[-t TABLE](指定表) COMMAND CHAINS(链) [createria] -j ACTTON
特别注意:链要大写,表要小写
-t :指定表名,有filter,nat,managle。
COMMAND:子命令,是由选项的格式构成的,这个表示对特定的表中的特定的链,进行特定的操作的规则
关于规则选项有:
-A, append 表示在链的尾部,追加一条规则。
-I n, insert 表示插入一条规则,n表示插入到第几条
-D n, delete 表示删除第几条。
-R n, replace 表示修改第几条规则。
关于链操作的链(表)
-F, flush 表示清空整条规则链。(但不会清除默认规则)
-N, new 表示新建一条用户自定义的规则链。
-X, 用于删除一条用户自定义的空链,链中有规则是不能删的。
-Z, zero, 把一条链中的计数器重新置零,(每一条规则都有两个计数器,pkts表示被本规则匹配到得数据包的个数,另外一个bytes用于计数被匹配到得数据包的总的大小。
-P, policy{ACCEPT|DROP} 表示策略,表示把某一个链的默认规则设定为ACCEPT(通)或DROP(拒绝)
-L, list 表示列出
-n, numeric 表示以数字的方式显示,不加-n则会把ip地址反向解析为主机名,速度会比较慢
-v, verbose 表示显示信息,v越多越详细。
-vv,
-vvv
-x, exactly 表示显示计数器时使用精确的计数,而不做单位转换。
--line-numbers 表示显示行号的。
CHAIN:链,
有五个链分别为:OUTPUT,INTPUT,FORWORD,PREROUTING,POSTROUTING
createria:数据包的匹配标准:
通用匹配 可以使用“!”表示取反
-s 指定匹配数据包的源地址标准
-d 指定匹配数据包的目的地址标准
-p {icmp|tcp|udp} 指定匹配数据包的协议。
-i 指定数据包的流入接口(通常跟网卡的设备名称)
-o 指定数据包的流出接口
扩展匹配
隐含扩展,隐含扩展是指对前面指定的协议的扩展
-p tcp
--sport :用于做源端口匹配
--dport : 目的端口匹配
--tcp-flags 用于做tcp的标志位的匹配。check_list 必须为1的位
tcp的首部有六个标志位分别为:SYN,ACK,FIN,PSH,URG,RST
--tcp-flags ACK,SYN,FIN,RST SYN 简写为 --syn
SYN:表示同步。
ACK:表示确定
FIN:发起连接断开请求
PSH:表示推送位
URG:表示紧急为,配合紧急指针使用
RST:重置为
-p udp
--sport
--dport
-p icmp
--icmp-type {8|0} icmp的数据包类型。当ping别人时数据包类型是8,当被人回应你是数据包类型是0:0表示回响应答。
-p icmp
--icmp-type
8:echo-request 请求
0:echo-reply 响应
显式扩展
-m state --state NEW /INVALID.. 状态检测
NEW 该包想要开始一个新的连接,syn=1,ack=0的包
ESTABLISHED 该包属于某个已经建立的连接
INVALID 无法识别的状态
RELATED 相关联的
-m multiport 指定间断端口
-source-ports
-destination-ports
--ports
-m iprange 指定地址范围的
--src-range ip-ip
--dst-range ip-ip
并发连接限制
-m connlimit ! --connlimit-above 2 -j DROP
-m limit 速率限定
--limit rate 2/miniute 表示每分钟2个 (速率)
--limit-burst number 峰值速率
-m string
--algo bm|kmp
--string "STRING"
-m time 设置时间
--timestart 8:00 --timestop 18:00 -j DROP
--days
--datestart
--datestop
-j TARGET -j:表示跳转,表示匹配到数据包后怎么处理
ACCEPT 表示接受,
DROP 表示丢弃,不作出回应(网络防火墙常用这个选项
REJECT 表示拒绝,做出回应
DNAT 表示做地主转换
SNAT
REDIRECT 表示做端口重定向
LOG 表示做日志。
保存iptables规则
#service iptables save
表示保存iptables的规则到/etc/sysconfig/iptables
每次开机会重读这个文件
#iptables-save > /etc/sysconfig/iptables.my
表示把规则保定到特定的位置。
启用iptables
#service iptables start 启动iptables
即执行了:iptables-restore < /etc/sysconfig/iptables
这条命令,把iptables中的规则重新生效一下
iptables不是一种服务,它的启动脚本只是执行了,保存规则和重读规则。
例子说明
清空数据链上的某个表中的规则:
#iptables -t filter -F OUTPUT
删除某条链上的规则
#iptables -t table -D CHAIN N
或者
#iptables -t table -D CHAIN 规则的详细写入
开放本机到本机的访问:
#iptables -I INPUT 1 -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#iptables -I OUTPUT 1 -s 127.0.01 -d 127.0.0.1 -j ACCEPT
开通ICMP ping 规则:
#iptables -t filter -A OUTPUT -s 192.168.0.34 -p icmp --icmp-type 8 -j ACCEPT
#iptables -A INPUT -d 192.168.0.34 -p icmp --imcp-type 0 -j ACCEPT
开通被ping
#iptables -t filter -A INPUT -d 192.168.0.34 -p icmp --icmp-type 8 -j ACCEPT
#iptables -A OUTPUT -s 192.168.0.34 -p icmp --imcp-type 0 -j ACCEPT
配置一个网络防火墙,是用户只能访问80服务
1,打开farewell 的ssh服务和server的ssh服务。
#iptables -filter
2.client和server的网关指向,
#route add default gw host_ip
3.打开firewall的路由功能。
#sysctl -w net.ipv4.ip_forward=1 临时生效
#echo 1 > /proc/sys/net/ipv4/ip_forward 永久生效
3.在FORWARD链上开放左右双向httpd服务的规则。
#iptables -A FORWARD -s 192.168.0.73 -d 192.168.10.20 -p tcp --dport 80 -j ACCERT
#iptables -A FORWARD -s 192.168.10.20 -s 192.168.0.73 -p tcp --sport 80 -j ACCEPT
4.修改forward的默认规则
#iptables -P FORWARD DROP
5.保存规则。
防火墙基于tcp的状态检测功能。对于一个完整的tcp链接来说,只有请求了才能相应。
tcp的标志位里要求syn为一,ack ,rst,fin为零,表示第一次握手。