防火墙的基础知识
首先需要认识到什么是防火墙,防火墙是通过一些有顺序的规则。给从网络中进入到主机应用层之间的通道上设置很多道拦截的口,每个口会有一堆规则去匹配。匹配上,如果是匹配结果是通过就放行,如果是匹配结果是拒绝,就不允许数据包通过。
防火墙的最大功能就是帮助你限制某些服务的访问来源。
所以防火墙的功能就是
1.切割被信任的与不信任的域或者网段。
2.划分出可提供的服务与被限制的服务
3.分析出可以接收的和不可接受的数据包状态。
iptables
主要的防火墙有数据包过滤性的Netfilter与依据服务软件程序作为分析的TCP Wrappers。
Netfilter(数据包过滤)
所谓数据包过滤是分析进入主机的网络数据包,这就需要对IP,TCP,ICMP,HTTP等头部报头很熟悉了。将数据包提取出来进行分析。以决定是放行还是阻挡。所以可以过滤包括硬件地址,IP地址,TCP等进行过滤。
TCP Wrappers (程序处理)
这个不是针对端口去限制的,而是针对软件进程的名字有关。比如。我限制httpd这个服务,我不管你监听在80
端口,还是基于虚拟主机的8080端口。我就是限制你。
1.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 标记
2.iptables的举例应用
安装程序
[root@localhost ~]# yum install iptables-services.x86_64
启动服务设置开机启动
[root@localhost ~]# systemctl start iptables
[root@localhost ~]# systemctl enable iptables
ln -s '/usr/lib/systemd/system/iptables.service' '/etc/systemd/system/basic.target.wants/iptables.service'
查看已有的策略
查看iptables列表
iptables -t filter -nL 查看filter表中的策略(不加-t则默认为filter表)
iptables -F 刷掉filter表中的测量,当没有用-t指定表名称时默认为filter
service iptables save 保存当前策略
iptables -A INPUT -j REJECT 拒绝所有主机的数据来源
iptables -D INPUT -p tcp --dport 80 -j REJECT 删除允许接入80端口的策略
iptables -N WESTOS 增加链WESTOS
iptables -E WESTOS redhat 改变链名称
iptables -X redhat 删除redhat 链
iptables地址伪装(路由器)
地址伪装就是为两个处在不同IP段的主机提供通信服务
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.117
iptables -t nat -A PREROUTING -i eth0 -j DNAT --to-dest 172.25.17.217
环境配置
服务端两块网卡
添加策略
开启内核路由
客户端只需将网关设置好即可
现在我们来测试一下
现在我这两台机器处在不同网段是无法通信的,但是我用刚刚做好的路由器可以使他们通信
看吧可以ping通了,下面我们试一下能不能ssh连接呢
没毛病,第一条伪装策略成功,下面看看第二条伪装策略怎么样
上图可以看出我们明明是连接root@172.25.254.117这台主机的可是连上去发现是172.25.17.217难道连接错了?
并没有因为我们第二条策略就是把所以连接我172.25.254.117这个ip的数据都扔到172.25.17.217上。所以我们第二条策略也成功的。
删除策略
[root@localhost ~]# iptables -t nat -D PREROUTING -i eth0 -j DNAT --to-dest 172.25.17.217
[root@localhost ~]# iptables -t nat -D POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.117
删除之后同样需要保存重启服务
service iptables save
systemctl restart iptables