目录
最近使用到了 IPtables 开放Linux 端口 ,但是遇到了坑,索性把Linux 防火墙基本知识进行一次学习
进行总结,看完这篇文章,你会用基础的iptables 操作命令,屏蔽端口,开放端口,屏蔽ip、地址段
以及协议的屏蔽,还有可以帮你排除一些可能遇到的坑,掌握contos6 contos7 的 iptables 命令区别
Linux 防火墙的概述 IPtables概述
Linux防火墙
从逻辑上来讲分为
主机防火墙:针对于单个主机进行防护
网络防火墙:往往处于网络入口或边缘,针对于网络入口进行防护,服务于防火墙背后的本地局域网。
从物理结构上来讲有
硬件防火墙:在硬件级别实现部分防火墙功能,另一部分功能基于软件实现,性能高,成本高。
软件防火墙:应用软件处理逻辑运行于通用硬件平台之上的防火墙,性能低,成本低。
IPtables
其实不是真正的防火墙,我们可以把它理解成一个客户端代理,用户通过iptables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才是真正的防火墙,这个框架的名字叫netfilter。
IPtables只是来操作这个框架的命令行工具我们知道iptables是按照规则来办事的,我们就来说说规则(rules),规则其实就是网络管理员预定义的条件,规则一般的定义为"如果数据包头符合这样的条件,就这样处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如TCP、UDP、ICMP)和服务类型(如HTTP、FTP和SMTP)等。当数据包与规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept)、拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加、修改和删除这些规则。
IPtables 表的概念 与链的概念
我们先来说说 链的概念,当客户端向服务端发送一个数据包,客户端会向服务端网卡发送报文,而TCP/IP协议属于内核的一部分,所以我们想让防火墙达到防火和屏蔽的作用,需要在内核处设置关卡,将经过的报文进行检查后在决定是否放行,这就出现了input 关卡 ,和 output 关卡 。这些关卡实际上就是“ 链 “ 。
在实际的使用过程中我们还需要了解几个概念 prerouting (路由前),forward (转发),postouting(路由后)。
报文的流向:
流向本机的报文 : prerouting -> input
由本机转发的报文:prerouting -> forward -> postouting
有本机发出的报文:output -> postouting
再来说说表的概念,我们说的这些链上可能会有一些雷同的规则,我们就可以把这些规则总结到一起,,这就引出了表的概念,
表分为4种filter 、nat 、mangle、raw他们分别存储这不同的规则:
filter :负责过滤功能 ,防火墙进出的一些规则(我们使用iptables 最常指定的就是这个表,如果不指定,默认为这个表)
nat :network address translation 服务网络地址翻译的规则
mangle :负责拆解报文,修改报文
raw:关闭nat表上启用的连接追踪机制。
IPtables 应用 操作方法
对匹配的值进行的处理动作表
ACCEPT | 允许数据包通过。 |
DROP | 直接丢弃数据包,不给任何回应信息,这时候客户端会感觉自己的请求泥牛入海了,过了超时时间才会有反应。 |
REJECT | 拒绝数据包通过,必要时会给数据发送端一个响应的信息,客户端刚请求就会收到拒绝的信息。 |
SNAT | 源地址转换,解决内网用户用同一个公网地址上网的问题。 |
MASQUERADE | 是SNAT的一种特殊形式,适用于动态的、临时会变的ip上。 |
DNAT | 目标地址转换。 |
REDIRECT | 在本机做端口映射。 |
LOG | 在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则,也就是说除了记录以外不对数据包做任何其他操作,仍然让下一条规则去匹配。 |
限制端口
iptables -t filter -A INPUT -s 192.168.1.146 -p tcp -m multiport --dports 22,36,80 -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
示例表示,禁止来自146的主机上的tcp报文访问本机的22号端口、36号端口以及80号端口。
"-m multiport --dports 22,36,80"表示使用了multiport扩展模块的--dports扩展条件,以同时指定了多个离散的端口,每个端口之间用逗号隔开。
-- dports 就是表示 目标端口
-- sports 表示远程访问的 源端口
iptables -t filter -A INPUT -s 192.168.1.146 -p tcp -m multiport --sports 22,36,80 -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
示例表示,禁止来自146的主机上的tcp从22号端口、36号端口以及80号端口发出的报文
限制IP地址
例子 :
iptables -t filter -A INPUT -s 192.168.1.146 -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
使用-I选项,指明将"规则"插入至哪个链中,-I表示insert,即插入的意思,所以-I INPUT表示将规则插入于INPUT链中,即添加规则之意。这里要注意的 是 -A -I 的区别 -A是家到规则表中的末尾,追加。而-I是追加到第一条。
这里就有坑了 因为它读取配置表是从上而下的 所以你得保证前面的规则中没有过滤掉这个IP 否者就不生效。
使用-s选项,指明"匹配条件"中的"源地址",即如果报文的源地址属于-s对应的地址,那么报文则满足匹配条件,-s为source之意,表示源地址。
使用-j选项,指明当"匹配条件"被满足时,所对应的动作,上例中指定的动作为DROP,在上例中,当报文的源地址为192.168.1.146时,报文则被DROP(丢弃)
多个IP地址可以用 ,号隔开依次类推 例子:
iptables -t filter -A INPUT -s 192.168.1.146,192.168.145 -j DROP
限制IP地址段
iptables -t filter -A INPUT -s 10.0.0.0/16 -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
限制协议
iptables -t filter -A INPUT -s 192.168.1.146 -p tcp -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
此时我们用ping命令 由146 ping 本机发现可以ping 通 因为我们ping 命令是基于icmp协议
我们把tcp换成icmp就不能了
centos6中,-p选项支持如下协议类型
tcp, udp, udplite, icmp, esp, ah, sctp
centos7中,-p选项支持如下协议类型
tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh
根据报文内容的限制
/sbin/iptables -t filter -A INPUT -m string --alog bm --string "OOXX" -j DROP
/etc/rc.d/init.d/iptables save
/etc/init.d/iptables restart
'-m string'表示使用string模块,'--algo bm'表示使用bm算法去匹配指定的字符串,' --string "OOXX" '则表示我们想要匹配的字符串为"OOXX" 设置完上图中的规则后,由于index.html中包含"OOXX"字符串,所以,146的回应报文无法通过126的INPUT链,所以无法获取到页面对应的内容。
--algo:用于指定匹配算法,可选的算法有bm与kmp,此选项为必须选项,我们不用纠结于选择哪个算法,但是我们必须指定一个。
--string:用于指定需要匹配的字符串。
centos7 的改动
centos7已经不再使用init风格的脚本启动服务,而是使用unit文件,所以,在centos7中已经不能再使用类似service iptables start这样的命令了,所以service iptables save也无法执行,同时,在centos7中,使用firewall替代了原来的iptables service,不过不用担心,我们只要通过yum源安装iptables与iptables-services即可(iptables一般会被默认安装,但是iptables-services在centos7中一般不会被默认安装),在centos7中安装完iptables-services后,即可像centos6中一样,通过service iptables save命令保存规则了,规则同样保存在/etc/sysconfig/iptables文件中。
配置好yum源以后安装iptables-service
yum install -y iptables-services
停止firewalld
systemctl stop firewalld
禁止firewalld自动启动
systemctl disable firewalld
启动iptables
systemctl start iptables
将iptables设置为开机自动启动,以后即可通过iptables-service控制iptables服务
systemctl enable iptables
详细的内容学习移步 :http://www.zsythink.net/archives/1544
他写的很全面。