说到访问控制那就不得不先说说防火墙了。
所谓防火墙指的是一个由软件和硬件设备组合而成、在内部网和外部网之间、专用网与公共网之间的界面上构造的保护屏障.是一种获取安全性方法的形象说法,它是一种计算机硬件和软件的结合,使Internet与Intranet之间建立起一个安全网关(Security Gateway),从而保护内部网免受非法用户的侵入,防火墙主要由服务访问规则、验证工具、包过滤和应用网关4个部分组成,
防火墙类型:基于工作的层次不同可分为:
网络层防火墙
代理服务器(应用层网关)
基于纯软件的iptables
前身是ipfirewall,要想生效就必须放到内核中
之后是ipchains 可以定义多条规则,形成一条列
最后是iptables 定义规则的工具,本身并不是防火墙
iptables/netfilter:网络过滤器/网络防火墙的工作框架
iptables写规则的工具,netfilter工作在内核,让规则生效。
----------------------------------------------------------
NetFilter定义了五个位置:五个内置的规则链,如图所示。
内置的5个规则链chains:
PREROUTING:路由前
input:数据包的流入接口
forward:转发接口
output:从内部网络出来的接口
postrouting:路由后
防火墙策略: 通 (防火墙的门默认是关着的,必须定义谁能进出)
堵 (防火墙的门默认是开着的,必须定义谁不能进出)
3个表:
filter(过滤):允许/不允许
nat:地址转换
mangle:修改报文原数据
iptables中的3表5链
---------------------------------------------------------------
表:来定义从一个链上不同的规则,自上而下依次过滤
对于过滤:只能做在3个链上:input,forward,output
nat:prerouting,output,postrouting
mangle:prerouting,input,forward,output,postrouting
只有使用iptables才能写进链上。写进就会立即生效。
匹配规则范围越小的越往上放。
跳转机制,就是指在该表中定义指向另一个表。在另一个表中查看匹配规则,若没有匹配的规则,则重新回到该表中继续匹配之后的规则。
-------------------------------------------------------------------------
如何写规则:
iptables写规则的工具,netfilter工作在内核,让规则生效。
iptables [-t table] command chain vritiria -j
filter 在那个链上操作 匹配标准 指定处理机制
nat
mangle
先来举一个简单的例子,让你有一个总体性的把握。然后在具体细化。
在filter表中添加一条规则:
#iptables -t filter -A INPUT -s 172.16.0.0/16 -p udp --dport 53 -j DROP
在filter表中替换一条规则:
#iptables -t filter -R INPUT -s 1 172.16.0.0/16 -p udp --dport 53 -j DROP
查看iptables所定义的规则,如果你不加表则默认是filter表
#iptables -L -n 查看定义的规则
#iptables -L -n -v 查看规则的详细信息
--------------------------------------------------------------
表上面我已经介绍过了,这里就不多说了。
command:
对于链管理命令
-p ,设定默认策略,门是关的还是开的。通和堵
#iptables -p INPUT {DROP|ACCEPT}
-F ,flush ,规则链清空
#iptables -t nat -F PREROUTING 清空那个表的哪个链
-N ,new ,创建一个链
#iptables -N inbound_tcp_web 被其他表的链指向
-X ,删除用户自定义的空链
-E ,给用户自定义的链重命名。
-Z ,用于清空链默认规则和其他链中的计数器的
------------------------
规则管理命令
-A ,在当前链的最后追加链
#iptables -A INPUT -s 172.16.0.0、16 -p udp --dport 53 -j ACCEPT
-I ,插入链,后跟数字,表示插入第几条链。1 就表示插入第一条链。则原来的1变为2,2变为3...
#iptables -I INPUT 1 -s 172.16.0.0、16 -p udp --dport 53 -j ACCEPT
-R ,修改规则,后跟数字,表示替换第几条规则
#iptables -R INPUT 1 -s 172.16.0.0、16 -p tcp --dport 80 -j ACCEPT
-D num,删除第几条规则。
#iptables -D INPUT 1,默认删除filter表的INPUT链的第一条规则
------------------------
查看命令
-L 查看
-n ,数字的方式查看
-v ,查看详细信息,-vv,-vvv越详细
-x ,精确值,不做单位换算
--line-numblers ,显示行号。
-----------------------------------------
匹配标准:
(1)通用匹配:
-s ,做源地址匹配,不能使用主机名,使用IP,NETOWORK/MASK,加!表示取反
-d ,做目标地址匹配,
-p ,用于匹配协议的
{tcp|udp|icmp}
-i ,数据的流入接口,后面接网卡
-o ,数据的流出接口
(2)扩展匹配:对于特定功能的扩张
隐含扩展:对特定协议扩展
-p tcp
--dport ,目标端口 0-65535
--sport ,源端口
--tcp-flags ,检查的标志位 必须为1的标志位。跟两个参数,第一个参数表示标志,第二个参数表示为1的标志。
六个标志:SYN,ACK,FIN,PSH,RST,URG
--tcp-flags syn,ack,fin,rst syn ,就表示syn必须为1,其他的为0。整个就表示匹配tcp连接第一次握手建立。可以简写为--syn
-p udp
--dport
--sport
-p icmp
--icmp-type
两种类型:
echo-request 8匹配ping出去的数据包
echo-reply 0 响应的数据包
显式扩展
各扩展模块
-p tcp -m multiport --dports 21,23,80多端口扩展
-------------------------------------------------------
-j Action
DROP 悄悄丢弃
REJECT 明确拒绝
ACCEPT 接受
custom_chain 转向自定义的链
DNAT
SNAT
MASQUERADE 源地址伪装
REDIRECT 主要实现端口重定向
MARK
RETURN 如果自定义的链没有匹配在返回
----------------------------------------------------------------
来自172.16网段的主机访问172.16.100.1的基于tcp的22端口都允许
#iptables -t filter -A INPUT -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -j ACCEPT
#iptables -t filter -A INPUT -s 172.16.100.1 -d 172.16.0.0/16 -p tcp --sport 22 -j ACCEPT
------------------------------------------------------------------------
三次握手:
我们可以通过状态检测来定义规则
4种状态:
第一次为全新连接NEW,syn为1,ack,rst,fin=0
第二三次为已建立的连接ESTABLISHED。
相关联的连接RELATED
其他的则为无法识别的连接的INVALID
#iptables -R INPUT 2 -s 172.16.0.0/16 -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
#iptables -R OUTPUT 1 -m state --state ESTABLISHED -j ACCEPT
-------------------------------
允许ping
#iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT
#iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
允许127网段的
#iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
要想开机生效
#service iptables save
保存在/etc/sysconfig/iptables
使用命令,追加:
#iptables-save > /etc/sysconfig/iptables
生效:
#iptables-restore < /etc/sysconfig/iptables
-------------------------------------------------------
源地址转换,目标地址转换
(1) 源地址转换
例如内网用户想访问外网的web服务,必须在出去内网,进入外网之时将自己的ip转换为可以在公网上使用的ip,只有这样才能够实现通信。
例如上图:我将来自192.168.0.0/24网段主机的ip都转换为123.18.1.30。
#iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -p tcp --dport 80 -j SNAT --to-source 123.18.1.30
若地址是动态获取的,则使用地址伪装
MASQUERADE
#iptables -t nat -A POSTROUTING -s 192.168.10.0/24 -j MASQUERADE
----------------------------------------------------------
(2)目标地址转换
当内网有web服务时,外网用户想要访问内网的web服务。则需要将外网ip转换为内网使用的ip。
#iptables -t nat -A PREROUTING -d 123.18.1.30 -p tcp --dport 80 -j DNAT --to-destination 192.168.0.15
常用模块的使用,
connlimit 允许多少个并发连接
--connlimit -above n 对超过n个的连接,采取措施
---------------------------------------------------
iprange
--src-range ip-ip
--dst-range ip-ip
#iptables -A FORWARD -m iprange --src-range 172.16.100.1-172.16.100.100 --dst-range 172.16.0.1-172.16.0.5 -p tcp --dport 80 -j ACCEPT
---------------------------------------------------
limit
--limit rate 平均速率限定
--limit-burst number
---------------------------------------------------
mac
--mac-source 跟你的防火墙在同一个网络的原MAC
----------------------------------------------------
multiport
--source-ports
--destination-ports
--potrs
#iptables -A FORWARD -p tcp -m multiport --destination-ports 22,80,110,25 -m iprange --src-range 172.16.0.1-172.16.0.100 -m state --state NEW,ESTABLISHED -j ACCEPT
--------------------------------------------------------
string 搜索匹配字符
--algo bm|kmp
--from offset
--to offset
--string pattern
#iptables -A FORWARD -m string --string "qq.com" --algo bm -j REJECT
-----------------------------------------------------------
time 设定时间
--timestart value
--timestop value
--days listofdays
--datestart date
--datestop date
-m time --timestart --timestop
---------------------------------------------------------------
LOG
--log-prefix 加上前缀
#iptables -A INPUT -d 172.16.100.1 -p tcp --dport 22 -m limit --limit 6/minute -j LOG --log-prefix "IPtables SSHD:"
--------------------------------------------------------------
REJECT
--reject-with type
icmp-net-unreachable
icmp-host-unreachable
icmp-port-unreachable
icmp-proto-unreachable
--------------------------------------------------------------
ftp
由于ftp在传输数据时,服务器会产生一个大于1023的随机端口。因此你很难用端口指定的方法来设置ftp,因此我们可以使用状态检测,使用相关联的连接来设置。
#iptables -A INPUT -d 172.16.100.1 -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
相关联的状态检测:
在设置ftp时,你需要加上两个模块,分别为ip_conntrack_ftp,ip_nat_ftp
安装这两个模块:
# modprobe ip_conntrack_ftp
# modprobe ip_nat_ftp
#iptables -A INPUT -d 172.16.100.1 -p tcp -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT