一、实验环境(rhel7.0版本)
主机环境:rhel7.0
各主机信息
主机名 | IP |
---|---|
server | 172.25.254.183 |
desktop | 172.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、安装配置
- "systemctl search iptables"。搜索与iptables服务相关的软件
- "systemctl install iptables-services"。安装iptables服务
- "systemctl start iptables"。打开iptables服务
- "systemctl enable iptables"。设置iptables服务开机自启动
在使用iptables功能时,需要关闭firewalld;
- "systemctl stop firewalld"。关闭firewalld服务
- "systemctl disable firewalld"。设置firewalld服务开机不自启动
- "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 | 删除自定义链 |
- "iptables -L"。查看默认表filter的规则,此时做了相应的解析,显示的是anywhere而不是IP地址
- "iptables -nL"。查看默认表filter的规则,且不做解析,显示的是IP地址
- 注意:这两条命令显示出来的规则,是之前讲解firewalld时用到的Direct Rules,所设定的规则
- "iptables -t nat -L"。查看nat表的规则,做解析
- "iptables -t nat -nL"。查看mangle表的规则,不做解析
- 注意:因为之前讲解firewalld时,在Direct Rules没有往nat表中添加规则,所以此时看不出命令"iptables -t nat -L"和命令"iptables -t nat -nL"的区别。
- "iptables -t mangle -L"。查看mangle表的规则,做解析
- "iptables -t mangle -nL"。查看mangle表的规则,不做解析
- 注意:因为之前讲解firewalld时,在Direct Rules没有往mangle表中添加规则,所以此时看不出命令"iptables -t mangle -L"和命令"iptables -t mangle -nL"的区别。
- "iptables -F"。清空默认表filter中的规则。但是此清空操作是临时的,只要重启iptables服务,该filter表中的规则又会出现
- 如果要清空nat表中的规则:"iptables -t nat -F"。但是此清空操作是临时的,只要重启iptables服务,该nat表中的规则又会出现
- 如果要清空mangle表中的规则:"iptables -t mangle -F"。但是此清空操作是临时的,只要重启iptables服务,该managle表中的规则又会出现
- "service iptables save"。保存默认表filter的策略到/etc/sysconfig/iptables文件中
- 注意:没有保存表nat和表mangle的策略的命令。
- "iptables -P INPUT DROP"。修改默认表fliter的INPUT链的规则为DROP。这个修改是临时修改,只重启iptables服务,又会恢复之前的样子。
如果要修改nat表的INPUT链的规则为DROP:"iptables -t nat -P INPUT DROP"。(这个是有错误的。这个表不可以这样做)
- 如果要修改mangle表的INPUT链的规则为DROP:"iptables -t mangle -P INPUT DROP"。这个修改是临时修改,只重启iptables服务,又会恢复之前的样子。
- "iptables -N xin"。往默认表filter中添加链xin。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
- 如果要往nat表中添加链xin:"iptables -t nat -N xin"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
- 如果要往mangle表中添加链xin:"iptables -t mangle -N xin"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
- "iptables -E xin XIN"。将默认表filter中的链xin的名字修改为XIN。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
- 如果要将nat表中的链xin的名字修改为XIN:"iptables -t nat -E xin XIN"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
- 如果要将mangle表中的链xin的名字修改为XIN:"iptables -t mangle -E xin XIN"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
- "iptables -X XIN"。删除默认表filter中的XIN这条链。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
- 如果要删除表nat中的XIN这条链:"iptables -t nat -X XIN"。这个修改是临时修改,只重启iptables服务,又会恢复最开始的样子。
- 如果要删除表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服务,又会恢复最开始的样子。
第三步:
测试:
- 首先在172.25.254.83这台主机的浏览器进行测试(下面表示测试失败)
- 在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表示第一行,也可以还为别的任意的数字,比如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服务,又会恢复最开始的样子。
第二步:
测试:
- 首先在172.25.254.83这台主机的浏览器进行测试(成功说明不了问题,还需要在其他主机进行测试)
- 在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服务,又会恢复最开始的样子。
第三步:
测试:
- 首先在172.25.254.83这台主机的浏览器进行测试(成功说明不了问题,还需要在其他主机进行测试)
- 在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,所以不用修改
第四步:(可做可不做)
- "iptables -D INPUT 2"。删除默认表filter中的INPUT链的第二行。
- "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服务,又会恢复最开始的样子。
- 这里需要注意的是"!"必须写在"-s 172.25.254.83"前面
- 也可以加入"-t"参数,即"iptables -t filter -A INPUT ! -p tcp --dport 22 -s 172.25.254.83 -j REJECT"。这个操作是临时修改,只重启iptables服务,又会恢复最开始的样子。
第二步:
测试:
- 首先在172.25.254.83这台主机的浏览器进行测试(成功说明不了问题,还需要在其他主机进行测试)
- 在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服务,又会恢复最开始的样子。
解释:
- -t:表示指定表
- filter:表示三张表中的filter表
- -A:表示指定链名
- INPUT:表示INPUT这条链
- -p:表示正在使用的协议
- tcp:表示tcp协议
- --dport:表示目的地端口
- 22:表示ssh的端口
- -s:表示数据来源
- 172.25.254.83:表示数据来源是172.25.254.83
- -j:表示动作(该动作有三种状态:(1)REJECT——拒绝;(2)ACCEPT——接受;(3)DROP——丢弃。)
- REJECT:表示状态是REJECT。
**注意**:对于动作DROP和REJECT两者的区别要明确;
REJECT动作相当于是客户端对服务器发送访问请求,服务端产生回应,并拒绝当前的客户端进行访问;而,DROP动作是客户端对服务器发送请求,但是服务器是不会给予回应的,相当于丢弃;
第二步:
测试:
- 首先在172.25.254.83主机上进行测试(成功说明不了问题,还需要在其他主机进行测试)
- 在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服务,又会恢复最开始的样子。
第二步:
测试:
- 首先在172.25.254.83主机上进行测试(成功说明不了问题,还需要在其他主机进行测试)
- 在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虚拟机)上做如下设置;
- "cd /etc/sysconfig/network-scripts"
- "cp ifcfg-eth0 ifcfg-eth1"
- "vim ifcfg-eth1"。编辑如下的内容
- "systemctl restart network"
- "ifconfig"
第三步:在含有两块网卡的主机(server虚拟机)上在路由之后做源地址转换;
- "iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 172.25.254.183"。设置源地址转换,转换到172.25.254.183
第四步:在含有一块网卡(desktop虚拟机)的主机上做如下设置;
- "cd /etc/sysconfig/network-scripts"
- "vim ifcfg-eth0"。编辑如下的内容
- "systemctl restart network"
- "ifconfig"
- "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,那么需要做如下的操作
- "iptables -nL"。查看默认表filter表中的forward链中是否有拒绝的选项,如果有,那么需要清空这个规则
- "iptables -F"。清空默认表filter表中的规则。
- "iptables -nL"。查看默认表filter中的规则是否已经清除。
- 此时就可以顺利ping通172.25.254.83了