1.防火墙的基础知识
首先需要认识到什么是防火墙,防火墙是通过一些有顺序的规则。给从网络中进入到主机应用层之间的通道上设置很多道拦截的口,每个口会有一堆规则去匹配。匹配上,如果是匹配结果是通过就放行,如果是匹配结果是拒绝,就不允许数据包通过。
防火墙的最大功能就是帮助你限制某些服务的访问来源。
所以防火墙的功能就是
1.切割被信任的与不信任的域或者网段。
2.划分出可提供的服务与被限制的服务
3.分析出可以接收的和不可接受的数据包状态。
其实iptables是很强大的,可以使用iptables的功能配置一个NAT服务器。还可以转发,比如搭配arp欺骗,使用iptables的转发功能做一个局域网内的dns劫持。如下图
主要的防火墙有数据包过滤性的Netfilter与依据服务软件程序作为分析的TCP Wrappers。
Netfilter(数据包过滤)
所谓数据包过滤是分析进入主机的网络数据包,这就需要对IP,TCP,ICMP,HTTP等头部报头很熟悉了。将数据包提取出来进行分析。以决定是放行还是阻挡。所以可以过滤包括硬件地址,IP地址,TCP等进行过滤。
TCP Wrappers (程序处理)
这个不是针对端口去限制的,而是针对软件进程的名字有关。比如。我限制httpd这个服务,我不管你监听在80
端口,还是基于虚拟主机的8080端口。我就是限制你。
2.iptables的详解
借马哥一张图,这个图就很好的讲述了iptables的四表五链。(马哥讲的真心不错)
首先在主机内核中有几个hook(钩子函数)系统调用。每当有数据包从某个通道流过去时。钩子都会将这些数据钩起来然后和对比一番,符合标准就放行。
下面就介绍一下4个表
1.filter(过滤)
旗下的链(INPUT,OUTPUT,FORWARD)
2.nat(地址转换)
旗下的链(PREROUTING,OUTPUT,POSTROUTING)
3.mangle (拆开,修改,封装)
旗下的链(PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING)
4.raw(不做修改)
旗下的链(PREOUTING,OUTPUT)
每个链中又有很多的规则。后面说着说着就明白了。
再说说每个链的意义
INPUT:与进入linux主机的应用层的数据包有关(这里要知道,数据包进入了内核层面并不意味着就可以和本机的应用程序打交道了)
OUTPUT:与从linux主机的应用层出来的数据包有关。
FORWARD:这个数据包需要经过该主机转发一下,和主机的应用层没有半毛钱关系。
PREROUTING:在进行路由判断之前要进行的规则(DNAT,REDIRECT)
POSTROUTING:在进行路由判断之后要进行的规则(SNAT,MASQUERADE)
在说之前先说一下iptables命令的用法
iptables [-t TABLE] COMMAND CHAIN [num] 匹配标准 -j 处理办法
其中匹配标准:
通用标准:
-s 指定源地址
-d 指定目标地址
-p {tcp|udp|icmp} 指定协议
-i 指定数据流入的网卡 一般都是PREROUTING,INPUT,FORWARD
-o 指定数据流出的网卡 一般都是OUTPUT,POSTROUTING,FORWARD
隐式扩展:
-p tcp
--sport 源端口 (下面就是-p指定的那个协议可以指定的报头选项,所以说数据报头很重要,tcp建立连接的过程也很重要)
--dport目的端口
--tcp-flags syn 1 SYN为1的(fin,ack,rst等就省略了)
显式扩展:
-m EXTESTION --sep-opt
-m multiport --destination-ports 22,80,21 -j ACCEPT (一次匹配3个端口)
处理办法:
管理规则:
-A 附加一条规则,加在末尾
-I CHAIN [num] :插入一条规则,默认加载队首。可指定插在哪里
-D CHAIN [num]: 删除指定链的规则
-R CHAIN [num]:指定替换指定的规则
管理链:
-F [CHAIN]:清空指定的规则链,若不指定则清空所有
-P CHAIN:指定链的默认策略
-N :自定义一个新的空链
-X:删除一个自定义的空链
-Z:置零指定链的所用规则的计数器(这个我还没学到)
-E:重命名自定义的链
查看类:
-L:显示指定表中的规则:
-n:以数字形式显示
-v:详细说明(-vv更详细,-vvv再详细)
-x:显示计数器的精确值
-line-numbers:显示规则的号码
-j target:
ACCPET 放行
DROP 默默的丢弃该包
REJECT 丢掉该包后还返回一个报错
DNAT 目标IP NAT
SNAT 源IP NAT
REDIRECT 地址伪装
LOG 日志
MARK 标记
3.iptables的举例应用
iptables是一个内核模块。
当关闭iptables时会卸载这些模块。
为了做实验,我的主机是suse(192.168.1.178)
而远程通过ssh连接的主机是ns(192.168.1.234)。
首先我操作234的ns,使之放行ssh服务。
第一行是说,过滤这张表的input这个链,允许源为192,目的为本机234 的tcp的22端口放行。
第二行就是活,过滤这张表的output这个链,允许tcp22端口本机与234的通信放行。
现在禁止所有通信!!(修改了默认的规则)
因为之前填写了允许192.1.1.0/24的主机可以ssh那个ns(234)主机,所以ssh没有断开。现在ns主机的应用层除了开放了对本网段的ssh之外,是与世隔绝的。
不信??各种试试。
1.ns(234)不允许ping所有人
[root@ns ~]# ping 192.168.1.192
PING 192.168.1.192 (192.168.1.192) 56(84) bytes of data.
ping: sendmsg: 不允许的操作
ping: sendmsg: 不允许的操作
ping: sendmsg: 不允许的操作
2.suse(192)也ping不同ns
[root@suse ~]# ping 192.168.1.234
PING 192.168.1.234 (192.168.1.234) 56(84) bytes of data.
^C
--- 192.168.1.234 ping statistics ---
75 packets transmitted, 0 received, 100% packet loss, time 75138ms
3.ns的网页访问不了
4.ns也访问不了百度了
(就不上图了)
那我现在上网访问网页怎么办呢。
放行对,80,8080,4xx(https忘了)的访问就好了。
那么我想ping别人。而不允许别人ping我怎么办
icmp的type有0,回应报文 8,请求报文
而别人是ping不通我(ns。234)的
开放ns服务器上的dns服务。
[root@ns ~]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
[root@ns ~]# iptables -A INPUT -p udp --dport 53 -j ACCEPT
[root@ns ~]# iptables -A INPUT -p tcp --sport 53 -j ACCEPT
[root@ns ~]# iptables -A INPUT -p udp --sport 53 -j ACCEPT
[root@ns ~]#
[root@ns ~]# iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
[root@ns ~]# iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
[root@ns ~]# iptables -A OUTPUT -p tcp --sport 53 -j ACCEPT
[root@ns ~]# iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
[root@ns ~]#
一共8个
还有一个是跟踪的(ip_conntrack)
有种病毒是反弹式的,就是主机被植入病毒后,会在所有开放的端口中顺便找一个然后出去寻找自己的控制者。而服务器如果是个web服务器,他的80端口是肯定会开放的,那么就必须追踪一下,就是只有外边连接80端口才可以回应。没人请求80端口的话,就不准本机的进程通过80端口出去。这就很好的防范了这个病毒。(简单的说,外边有人叫你,你才能出去,没人叫你,不准出去)
首先安装 iptstate(监控所有的链接状态)
[root@suse netfilter]# !yum
yum search iptstate
Loaded plugins: product-id, refresh-packagekit, security, subscription-manager
This system is not registered to Red Hat Subscription Management. You can use subscription-manager to register.
rhel6 | 3.9 kB 00:00 ...
========================================== N/S Matched: iptstate ===========================================
iptstate.x86_64 : A top-like display of IP Tables state table entries
输入iptstate查看(查看了当前建立的连接)
很屌屌的命令吧!
但这是在内存空间中有限的,所以可以跟踪的是有限的。所以连接数就被限制了,所以这在web服务器时等非常繁忙的服务器上不要使用这个功能,他会限制连接数的。
iptables的显式扩展
state 扩展状态:
结合ip_conntrack追踪会话。
NEW: 新连接请求
ESTABLISHED:已建立连接
INVALID:非法连接 (某些黑客会发送syn=1,fin=1的奇怪报文,其实是非法的)
RELATED:相关连的
-m state --state NEW,ESTABLISHED -j ACCEPT
iptables是默认查看iptables文件的。如果重启的话可能有些条目会改变
但是可以使用service iptables save 保存起来
或者去使用 iptables-save > /etc/sysconfig/iptables.2016.12.8
下去去读那个文件iptables-restore < /etc/sysconfig/iptables.2016.12.8
现在假设我的ns(234)是一个web服务器。当然我这台主机就不会用来上网用了,现在监视一下
先看看ssh的(因为我是远程连接)
因为我加了扩展匹配,所以加载了conntrack功能
这就是实现了别人叫你,你才能出去,你不能主动出去
也就是说,别人ssh服务器时可以,服务器不允许ssh别人,防止病毒去找主人。
这时先看看234的web可以访问吗?
同样。执行该命令。
[root@ns ~]# iptables -A INPUT -d 192.168.1.234 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
[root@ns ~]# iptables -A OUTPUT -s 192.168.1.234 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
[root@ns ~]# iptables -A OUTPUT -s 192.168.1.234 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
好了,234的web可以访问了,而且还是很安全的。
最后再说一下自定义链的生成和调用
1.创建一个新链
2.再新链中创建规则
3.链尾中添加结尾可以使跳转回调用处
4.再默认链中调用自定义链