一、iptables概述
1. iptables的概述
iptables 实际上就是一种包过滤型防火墙。 就是通过书写一些接受哪些包,拒绝哪些包的规则,实现数据包的过滤。这些规则存储在专用的信息包过滤表中,而这些表集成在Linux 内核中。在信息包过滤表中,规则被分组放在我们所谓的链(chain)中。
2. iptables的组成
iptables由两部分组成:
(1) framework: netfilter hooks function钩子函数,实现网络过滤器的基本框架。
(2) rule utils: iptables 规则管理工具
3. iptables的三链五表
总体说来,iptables就是由“三表五链”组成。
三表:
filter | 过滤,防火墙,过滤数据包 |
---|---|
Nat | 用于网络地址转换(IP、端口) |
Mangle | 拆解报文,作出修改,封装报文 |
五链:
PREROUTING | 数据包进入路由之前 |
---|---|
INPUT | 目的地址为本机 |
FORWARD | 实现转发 |
OUTPUT | 原地址为本机,向外发送 |
POSTROUTING 发送到网卡之前 |
iptables中表与链的对应关系,其实就是一个表中包含哪几个链:
二、iptables命令常用方法
iptables [-p table] 链管理 chain
-t table : filter,nat,mangle,raw (默认为 filter)
链管理:
-F | 清空规则链 |
---|---|
-N | 创建新的自定义规则链 |
-X | drop 删除用户自定义的规则链 |
-P | Policy 为指定链设置默认策略;iptables -t filter -P FORWARD DROP |
-E | 重命令自定义链 |
规则管理:
-A | 蒋新规则添加到指定的链上 |
---|---|
-I | 将新规则插入到指定的位置 |
-D | 删除链上的指定规则 |
-R | 替代指定链上的规则 |
查看:
-L列表,列出指定链上的指定的规则
基本匹配:
-s | 原地址IP |
---|---|
-d | 目的IP |
-p | 协议{tcp |
-i | 数据报文的流入接口 |
-o | 数据报文的流出接口 |
扩展匹配:-m match_name
–dport PORT: 目标端口,可以是单个端口
–sport PORT: 源端口
-p udp|tcp|icmp
–icmp-type
0 : echo-reply
8 : echo-request
目标:
-j TARGET:jump至指定的TARGET
- ACCEPT 接受
- DROP 丢弃
- REJECT 拒绝访问
- RETURN 返回调用链
三、iptables的相关设置(三张表和五条链)
实验环境:
1. desktop虚拟机两块网卡:eth0 (172.25.254.112)和eht1(1.1.1.112)
2. server虚拟机一块网卡:eth0( 1.1.1.212 )
3.在serevr上面:ping 1.1.1.112可以
4.搭建两个虚拟机的yum源,并使两个yum可用
具体实验操作如下:
关闭firewalld火墙,并开启iptables火墙,如下所示:
systemctl stop firewalld 关闭firewalld防火墙
systemctl mask firewalld 锁住firewalld防火墙
systemctl start iptables 开启iptables防火墙
查看三个表及每个表中的链,如下所示:
iptables -t filter -nL查看filter表格里面的链,并且不做解析
-t后面跟表格的名称,不过不跟-t,默认为filter表格
iptables -t nat -nL查看nat表里面的链
iptables -t mangle -nL查看mangle表里面的链
iptables -L查看所有链(默认查看filter表里面的链)
iptables -nL查看所有链,作解析(默认查看filter表里面的链)
清除所有策略并查看,如下所示:
iptables -F清除所有策略
iptables -nL查看
保存策略,并进入火墙的配置文件中查看是否保存策略,如下所示:
service iptables save保存
vim /etc/sysconfig/iptables查看
iptables -t filter -A INPUT -i lo -j ACCEPT将lo回环接口加入INPUT链
iptables -nL查看
iptables -t filter -A INPUT -s 172.25.254.12 -j ACCEPT接受
iptables -nL
iptables -t filter -A INPUT -s 172.25.254.12 -j REJECT拒绝
iptables -nL
测试:在真机中连接ssh root@172.25.254.112,发现可以连接,如下所示:
iptables -D INPUT 3 ###删除第三条策略
iptables -nL ###查看
iptables -R INPUT 2 -S 172.25.254.12 -j REJECT修改策略
iptables -nL查看
测试:在真机里面连接ssh root@172.25.254.112,只有第二条匹配,但是拒绝的连不上,如下所示:
iptables -I INPUT 2 -s 172.25.254.12 -p tcp --dport 22 -j ACCEPT ###插入策略
iptables -nL
测试:在真机里面ssh可以(因为单独ssh服务被允许),但是访问apache不行(其它的都是拒绝的),如下所示:
iptables -P INPUT DROP ###修改默认策略
iptables -nL ###查看
测试:在真机里面连接ssh root@172.25.254.112,此时是连接不上
因为desktop将真机ssh连接发送的数据包都丢弃了,并且也不给真机说不能连接,因此真机会一直请求ssh连接,如下所示:
iptables -P INPUT ACCEPT
iptables -nL
测试:在真机里面连接ssh root@172.25.254.112,此时可以了,因为将drop改为accept了
iptables -nL ###查看filter表里面的链
iptables -N ###westos添加westos链
iptables -nL ###添加完之后再次查看
iptables -E westos feng ###修改链的名字,由westos改为feng
iptables -nL ###查看修改结果
iptables -X feng ####删除链
iptables -nL ###查看
四、iptables的地址伪装和端口转发
实验目的:
端口转发: 让真机172.25.254.12 ssh root@172.25.254.111desktop直接连上1.1.1.212server
地址伪装: 让1.1.1.211的server虚拟机ping172.25.254.111就可以,因为172.25.254.111与1.1.1.111在一个主机上
实验环境设置:
在前面实验环境的基础上,在虚拟机desktop上设置网关(1.1.1.112),如下所示:
端口转发:
iptables -t nat -nL ####查看一下nat表
添加地址转发功能:
iptables -t nat -A PREROUTING -i(input) eth0 -p(协议类型) tcp --dport 22 -j DNAT --to-dest 1.1.1.211:22(转发到这个地址)
iptables -t nat -nL ####再次查看,此时eth0是在路由之前
测试:发现能连接到,ifconfig发现是server的ip,此时实现了地址转发的功能,如下所示:
地址伪装:
iptables -t nat -nL ###查看
开启地址伪装功能:
iptables -t nat -A POSTROUTING -o(output) eth0 -j SNAT --to-source 172.25.254.112(在172.25.254.112上面进行伪装)
iptables -t nat -nL ####再次查看, 此时eth0是在路由之后的
测试:在server虚拟机上去ping虚拟机desktop和真机都能ping通,如下所示: