Linux运维之防火墙之iptables策略管理服务

一、实验环境(rhel7.0版本)

主机环境:rhel7.0

各主机信息

主机名IP
server172.25.254.183
desktop172.25.254.133
物理机172.25.254.83

 

二、iptables介绍

 

iptables 并不是真正的防火墙,可以理解为一个客户端代理。用户通过iptables这个代理,将用户的安全设定执行到对应的“安全框架”(netfilter)。所以说,iptables其实是一个命令行工具,位于用户空间,我们用iptables操作整体的框架。
iptables是按照规则办事的,即rules,规则一般制订了源地址、目的地址、传输协议(tcp、udp)等。当数据包与规则匹配时,iptables就会根据定义的规则来处理数据包,如accept(接受)、reject(拒绝)、drop(丢弃)三种动作。

 

三、iptables的三张表和五条链介绍

 

三张表:filter表(访问本机内核的);nat表(和本机无关的);mangle表

五条链:input;output;prerouting;postrouting;forward

表链之间的关系:

  • 1.filter表:负责过滤工程,防火墙
input对服务来说,input就是系统的请求(与本机内核有关)
forward在路由器中,使得两块网卡可以进行通信,是通过内核来传递的(用内核来做的数据通信)
output对服务来说,output就是系统的输出(与本机的内核有关)
  • 2.nat表:网络地址转换功能 network address translate
input不经过内核,转达消息
prerouting数据包进入路由表之前,即路由之前转换
postrouting发送到网卡接口之前,即路由之后转换
output不经过内核,转达消息

  • 3.mangle表(用的少):拆解报文,做出修改,并重新封装
input
prerouting
postrouting
forward
ouput

优先级:

当3张表出现在同一条链上的时候,优先级别是:
mangle—->nat—>filter
3张表只可能同时间出现在INPUT链或者OUTPUT链上。

 

四、iptables的配置(实验的主机是server虚拟机,IP为172.25.254.183)

 

1、安装配置

 

  1. "systemctl    search  iptables"。搜索与iptables服务相关的软件
  2. "systemctl    install    iptables-services"。安装iptables服务
  3. "systemctl    start   iptables"。打开iptables服务
  4. "systemctl    enable   iptables"。设置iptables服务开机自启动

 

在使用iptables功能时,需要关闭firewalld;

  1. "systemctl   stop   firewalld"。关闭firewalld服务
  2. "systemctl   disable   firewalld"。设置firewalld服务开机不自启动
  3. "systemctl   mask   firewalld"。冻结firewalld

 

2、iptables后跟参数的含义:

 

iptables    -nL查看规则
iptables    -F清空规则
iptables    -t制定操作的表
iptables    -P默认规则
iptables    -A添加规则
iptables    -I插入,可以指定规则添加的位置
iptables    -R修改某条规则
iptables    -n表示不做解析
iptables    -L查看表的策略信息
iptables    -p指定某个协议(tcp,udp)
iptables    -N自动以添加链名
iptables    -E修改规则链名称
iptables    -X删除自定义链
  1. "iptables  -L"。查看默认表filter的规则,此时做了相应的解析,显示的是anywhere而不是IP地址
  2. "iptables  -nL"。查看默认表filter的规则,且不做解析,显示的是IP地址
  • 注意:这两条命令显示出来的规则,是之前讲解firewalld时用到的Direct  Rules,所设定的规则

 

  1. "iptables  -t   nat   -L"。查看nat表的规则,做解析
  2. "iptables  -t   nat    -nL"。查看mangle表的规则,不做解析
  • 注意:因为之前讲解firewalld时,在Direct  Rules没有往nat表中添加规则,所以此时看不出命令"iptables   -t   nat   -L"和命令"iptables   -t   nat   -nL"的区别。

 

  1. "iptables  -t   mangle   -L"。查看mangle表的规则,做解析
  2. "iptables  -t   mangle   -nL"。查看mangle表的规则,不做解析
  • 注意:因为之前讲解firewalld时,在Direct  Rules没有往mangle表中添加规则,所以此时看不出命令"iptables   -t   mangle   -L"和命令"iptables   -t   mangle   -nL"的区别。

 

  • "iptables   -F"。清空默认表filter中的规则。但是此清空操作是临时的,只要重启iptables服务,该filter表中的规则又会出现
  1. 如果要清空nat表中的规则:"iptables   -t   nat   -F"。但是此清空操作是临时的,只要重启iptables服务,该nat表中的规则又会出现
  2. 如果要清空mangle表中的规则:"iptables   -t   mangle   -F"。但是此清空操作是临时的,只要重启iptables服务,该managle表中的规则又会出现

 

  • "service  iptables   save"。保存默认表filter的策略到/etc/sysconfig/iptables文件中
  1. 注意:没有保存表nat和表mangle的策略的命令。

 

  • "iptables   -P   INPUT   DROP"。修改默认表fliter的INPUT链的规则为DROP。这个修改是临时修改,只重启iptables服务,又会恢复之前的样子。
  1. 如果要修改nat表的INPUT链的规则为DROP:"iptables   -t   nat   -P  INPUT  DROP"。(这个是有错误的。这个表不可以这样做)

  2. 如果要修改mangle表的INPUT链的规则为DROP:"iptables   -t   mangle   -P  INPUT  DROP"。这个修改是临时修改,只重启iptables服务,又会恢复之前的样子。

 

  • "iptables   -N   xin"。往默认表filter中添加链xin。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
  1. 如果要往nat表中添加链xin:"iptables   -t   nat   -N  xin"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
  2. 如果要往mangle表中添加链xin:"iptables   -t   mangle   -N  xin"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。

 

  • "iptables   -E  xin   XIN"。将默认表filter中的链xin的名字修改为XIN。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
  1. 如果要将nat表中的链xin的名字修改为XIN:"iptables  -t  nat  -E  xin   XIN"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
  2. 如果要将mangle表中的链xin的名字修改为XIN:"iptables  -t  mangle  -E  xin   XIN"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。

 

  • "iptables   -X   XIN"。删除默认表filter中的XIN这条链。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
  1. 如果要删除表nat中的XIN这条链:"iptables  -t  nat  -X  XIN"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
  2. 如果要删除表mangle中的XIN这条链:"iptables  -t  mangle  -X  XIN"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。

 

五、iptables之设置访问权限(实验的主机是server虚拟机,IP为172.25.254.183)

 

假设现在我们需要设置:只允许172.25.254.83这台主机可以通过ssh远程连接172.25.254.183主机。这里有两种选择,一种是:拒绝+允许。此时需要做两件事:1.filter表中INPUT链的规则是ACCEPT;2.往filter表中INPUT链中添加规则允许172.25.254.83可以访问,作为第一条;3.往filter表中INPUT链中添加规则拒绝所有主机可以访问,作为第二条。(必须加这一条,否则,所有的主机均可以访问)。另外一种是直接拒绝。

 

第一种:拒绝+允许

 

ACCEPT状态

 

错误示范:

 

第一步:

  • "iptables   -A   INPUT   -j    REJECT"。设置默认表filter的INPUT链中添加规则,拒绝所有的人访问。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
  • 也可以加入"-t"参数,即"iptables  -t  filter  -A  INPUT  -j  REJECT"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。

 

第二步:

  • "iptables   -t   filter   -A   INPUT   -p   tcp   --dport    22   -s   172.25.254.83   -j    ACCEPT"。往filter表中添加规则,不允许172.25.254.83通过ssh远程连接。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
  • 也可以不加"-t"参数,即"iptables  -A  INPUT  -p  tcp  --dport  22   -s   172.25.254.83   -j   ACCEPT"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。

 

第三步:

测试:

  1. 首先在172.25.254.83这台主机的浏览器进行测试(下面表示测试失败)
  2. 在172.25.254.133这台主机的浏览器进行测试

错误的原因:

这里需要说明一点,从上到下依次读取规则,如果上面的满足了,就不读取下面的规则,就如同上面的测试中,第一条显示拒绝所有的人访问,第二条又添加了允许172.25.254.83这台主机可以访问;实际上生效的是第一条规则,第二条的规则不会被读取;所以172.25.254.83通过ssh远程连接时,显示连接失败。

 

在错误示范的基础上进行修改,以便进行正确示范:

 

第一步:

  • "iptables   -I   INPUT   1    -p   tcp    --dport   22    -s    172.25.254.83    -j    ACCEPT"。往默认表filter的INPUT链的第一行添加规则,允许172.25.254.83可以访问。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
  1. 其中1表示第一行,也可以还为别的任意的数字,比如2,表示插入第二行。
  • 也可以不写1,默认加到第一行。即"iptables   -I   INPUT   -p   tcp   --dport   22   -s   172.25.254.83   -j   ACCEPT"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
  • 也可以加入"-t"参数。即"iptables  -t   filter   -I   INPUT   1    -p   tcp    --dport   22    -s    172.25.254.83    -j    ACCEPT"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
  • 也可以,"iptables  -t   filter   -I   INPUT   -p   tcp    --dport   22    -s    172.25.254.83    -j    ACCEPT"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。

 

第二步:

测试:

  1. 首先在172.25.254.83这台主机的浏览器进行测试(成功说明不了问题,还需要在其他主机进行测试)
  2. 在172.25.254.133这台主机的浏览器进行测试

 

直接进行正确的示范:

 

第一步:

  • "iptables   -t   filter   -A   INPUT   -p   tcp   --dport    22   -s   172.25.254.83   -j    ACCEPT"。往filter表中添加规则,不允许172.25.254.83通过ssh远程连接。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
  • 也可以不加"-t"参数,即"iptables  -A  INPUT  -p  tcp  --dport  22   -s   172.25.254.83   -j   ACCEPT"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。

 

第二步:

  • "iptables   -A   INPUT   -j    REJECT"。设置默认表filter的INPUT链中添加规则,拒绝所有的人访问。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
  • 也可以加入"-t"参数,即"iptables  -t  filter  -A  INPUT  -j  REJECT"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。

 

第三步:

测试:

  1. 首先在172.25.254.83这台主机的浏览器进行测试(成功说明不了问题,还需要在其他主机进行测试)
  2. 在172.25.254.133这台主机的浏览器进行测试

 

 

假设现在我们需要设置:只是不允许172.25.254.83这台主机通过ssh远程连接172.25.254.183这台主机。此时需要做两件事:1.filter表中INPUT链的规则是ACCEPT;2.往filter表中INPUT链中添加规则不允许172.25.254.83可以访问。此时有两种状态可以设置:一种是REJECT;另外一种是DROP。

 

filter表中INPUT链的规则默认是ACCEPT,所以不用修改

第四步:(可做可不做)

  1. "iptables  -D   INPUT  2"。删除默认表filter中的INPUT链的第二行。
  2. "iptables  -D   INPUT  1"。删除默认表filter中的INPUT链的第一行。这里不可以写为"iptables  -D   INPUT"。

 

第二种:直接拒绝

 

第一步:

  • "iptables   -A   INPUT   !   -p   tcp   --dport   22   -s   172.25.254.83   -j   REJECT"。除了172.25.254.83,其他的都拒绝通过ssh远程连接。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
  1. 这里需要注意的是"!"必须写在"-s   172.25.254.83"前面
  • 也可以加入"-t"参数,即"iptables  -t   filter   -A   INPUT   !   -p   tcp   --dport   22   -s   172.25.254.83   -j   REJECT"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。

 

第二步:

测试:

  1. 首先在172.25.254.83这台主机的浏览器进行测试(成功说明不了问题,还需要在其他主机进行测试)
  2. 在172.25.254.133这台主机的浏览器进行测试

 

REJECT状态

 

第一步:

  • "iptables  -t   filter   -A   INPUT   -p   tcp   --dport    22   -s   172.25.254.83   -j   REJECT"。往filter表中添加规则,不允许172.25.254.83通过ssh远程连接。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
  • 这里也可以不加 -t参数,默认给表filter添加此规则。即"iptables   -A  INPUT -p  tcp  --dport  22  -s  172.25.254.83  -j   REJECT"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。

解释:

  1. -t:表示指定表
  2. filter:表示三张表中的filter表
  3. -A:表示指定链名
  4. INPUT:表示INPUT这条链
  5. -p:表示正在使用的协议
  6. tcp:表示tcp协议
  7. --dport:表示目的地端口
  8. 22:表示ssh的端口
  9. -s:表示数据来源
  10. 172.25.254.83:表示数据来源是172.25.254.83
  11. -j:表示动作(该动作有三种状态:(1)REJECT——拒绝;(2)ACCEPT——接受;(3)DROP——丢弃。)
  12. REJECT:表示状态是REJECT。
  • **注意**:对于动作DROP和REJECT两者的区别要明确;
    REJECT动作相当于是客户端对服务器发送访问请求,服务端产生回应,并拒绝当前的客户端进行访问;
    而,DROP动作是客户端对服务器发送请求,但是服务器是不会给予回应的,相当于丢弃;

 

第二步:

测试:

  1. 首先在172.25.254.83主机上进行测试(成功说明不了问题,还需要在其他主机进行测试)
  2. 在172.25.254.133这台主机上进行测试

 

第三步:(可做可不做)

  • "iptables  -D   INPUT  1"。删除默认表filter中的INPUT链的第一行。

 

DROP状态

 

第一步:

  • "iptables  -t   filter   -A   INPUT   -p   tcp   --dport    22   -s   172.25.254.83   -j   DROP"。往filter表中添加规则,不允许172.25.254.83通过ssh远程连接。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
  • 这里也可以不加 -t参数,默认给表filter添加此规则。即"iptables   -A  INPUT -p  tcp  --dport  22  -s  172.25.254.83  -j   DROP"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。

 

第二步:

测试:

  1. 首先在172.25.254.83主机上进行测试(成功说明不了问题,还需要在其他主机进行测试)
  2. 在172.25.254.133这台主机上进行测试

 

第三步:(可做可不做)

  • "iptables  -D   INPUT  1"。删除默认表filter中的INPUT链的第一行。

 

六、iptables设置地跳转端口(实验的主机是server虚拟机,IP为172.25.254.183)

 

要实现跳转端口,虚拟机必须在路由之后做源地址转换!!!!!!!!!!

 

第一步:

"iptables   -t   nat   -A   PREROUTING   -i   eth0   -j   DNAT   --to-dest   172.25.254.133"。做目的地地址转换,转换目标为172.25.254.133。

 

第二步:

测试:在真机上(IP为172.25.254.83)上进行测试。

通过"w  -i"看到的是172.25.254.183(要实现端口跳转的IP)连接的172.25.254.133,而不是真机172.25.254.83连接的(但其实是172.25.254.83连接的172.25.254.183,而172.25.254.183设置了端口跳转,跳转到172.25.254.133)。

 

七、iptables设置地址伪装(实验的主机是server虚拟机,IP为172.25.254.183)

 

要实现地址伪装,有两个网卡的虚拟机必须在路由之后做源地址转换!!!!!!!!!!

 

第一步:在这台虚拟机(server)添加第二块网卡eth1;

 

第二步:在含有两块网卡的主机(server虚拟机)上做如下设置;

  1. "cd   /etc/sysconfig/network-scripts"
  2. "cp   ifcfg-eth0   ifcfg-eth1"
  3. "vim  ifcfg-eth1"。编辑如下的内容
  4. "systemctl   restart   network"
  5. "ifconfig"

 

第三步:在含有两块网卡的主机(server虚拟机)上在路由之后做源地址转换;

  • "iptables   -t   nat   -A   POSTROUTING   -o   eth0   -j   SNAT   --to-source   172.25.254.183"。设置源地址转换,转换到172.25.254.183

 

第四步:在含有一块网卡(desktop虚拟机)的主机上做如下设置;

  1. "cd   /etc/sysconfig/network-scripts"
  2. "vim  ifcfg-eth0"。编辑如下的内容
  3. "systemctl   restart   network"
  4. "ifconfig"
  5. "route  -n"。查看网关

 

第五步:在单网卡虚拟机(desktop虚拟机)上测试

1.1.1.133和172.25.254.83因为不在一个网段里,网络是不能连通,这里为什么可以利用ssh服务可以连接呢?实际上是172.25.254.183登陆172.25.254.83,而不是1.1.1.133登陆172.25.254.83;这里也就完成了地址伪装。
当然,我们可以利用"w -i"查询看到的是真正登陆的ip(172.25.254.183)。

1.1.1.183是可以和172.25.254.183通信的。(这是因为1.1.1.183和172.25.254.183这两个IP是同一台主机的两个网卡的IP)。1.1.1.133是可以和1.1.1.183通信的。(这是因为1.1.1.183和1.1.1.133处于同一个网络段)

那么要使得1.1.1.133和172.25.254.183通信,就需要1.1.1.183作为中间人,也就是我们所说的网关。

网关设定好之后,1.1.1.133是可以和172.25.254.183通信的。但是不可以和172.25.254.83通信。(这是因为1.1.1.183不可以和172.25.254.83通信)。那么要使1.1.1.133可以和172.25.254.83通信,就需要在172.25.254.183的主机上做操作:在路由之后进行源地址转换。

 

小技巧:如果第五步ping不通172.25.254.83,那么需要做如下的操作

  1. "iptables  -nL"。查看默认表filter表中的forward链中是否有拒绝的选项,如果有,那么需要清空这个规则
  2. "iptables  -F"。清空默认表filter表中的规则。
  3. "iptables  -nL"。查看默认表filter中的规则是否已经清除。
  • 此时就可以顺利ping通172.25.254.83了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值