一、iptables介绍
Netfilter/Iptables(以下简称Iptables)是unix/linux自带的一款优秀且开放源代码的完全自由的基于包过滤的防火墙工具,它的功能十分强大,使用非常灵活,可以对流入和流出服务器的数据包进行很精细的控制。iptables主要工作在OSI七层的二、三、四层,如果重新编译内核,iptables也可以支持7层控制。
iptables防火请的概念理解
流程:iptables—表---链—规则
iptables:相当于一个容器,里面装着防火墙的表
tables(表):一个小容器,装着防火墙的链
chain(链):一个更小容器,装着防火墙的规则
policy(规则):允许或者拒绝,防火墙一条一条安全策略
简单的说就是:
Netfilter(防火墙) | (表) tables | (链)chain | (规则)policy |
---|---|---|---|
一栋楼 | 楼里面的房子 | 房子里面的柜子 | 柜子里面整齐的衣服 |
防火墙匹配规则流程:
1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。
2. 如果匹配上规则,即明确表示是阻止还是通过,数据包就不再向下匹配新的规则。
3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是过。
4. 防火墙的默认规则是所有规则执行完才执行的。
二、iptables的四表五连
四表
1、filter表(默认防火墙功能 准许拒绝)
2、nat表,功能:内网服务器上外网、共享上网、端口映射
3、mangle表:ALL(跟路由无关,在任何点都行,ye最高)。实现包重构(修改)。(不常用)
4、raw表:数据跟踪处理。(不常用)
五链:
1、INPUT
2、OUTPUT
3、FORWARD
4、POSTROUTING
5、PREROUTING
表对应的链
filter表:
chain(链) | 功能强调:主要和自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包)filter表示iptables默认使用的表,这个表定义了三个链(chains) |
---|---|
INPUT | 过滤进入主机的数据包 |
FORWARD | 负责流经主机的数据包。起转发作用,和nat的关系很大 |
OUTPUT | 处理从主机发出去的数据包 |
nat表
chain(链) | 负责网络地址的转换,即来源于目的IP地址和port的转换应用:和主机本身无关一般用于局域网共享上网或者特殊端口转换服务相关 工作场景:1、用于企业路由(zebra)或者网关(iptables),共享上网(POSTROUTIG) ;2、做内部外部ip地址一对一映射(dmz),硬件防火墙映射到ip内部服务器,ftp服务(OREROUTIG);3、WEB,单个端口映射,直接映射80端口(PREROUTIG),这个表定义了三个链,nat功能相当于网络的acl控制 |
---|---|
OUTPUT | 改变主机发出数据包的目的地址 |
PREROUTING | 在数据包到达防火墙时,进行路由判断之前执行规则,作用是改变数据包的目的地址、目的端口 |
POSTOUTING | 数据包离开防火墙之后进行路由判断之后执行的规则,作用是改变数据包的原地址和源端口 |
三、iptables命令及参数
iptables:防火墙规则制定命令
参数:
-F:(--flush),清除所有的规则,不会处理默认的规则
-X:删除用户自定义的链
-Z:链的计数器消息
-L:显示表中所有的规则
-n:不要把端口或ip反向解析为名字
-t:指定表
-A:将规则添加懂指定链上
-I:表示将规则插入到指定链上
-R:表示将规则信息进行修改
-D:delete删除
-l:insert拒绝的规则放在最上面
-p:(protocal)协议————tcp、udp、icmp、all
-j:指定对相应匹配规则执行什么操作(ACCEPT DROP* REJECT)
--dport:目标端口
--sport:源端口
-s:指定匹配的源地址网段信息,或者匹配的主机信息
-d:指定匹配的目标地址网段信息,或者匹配的主机信息
-i:指定匹配的进入流量接口信息 只能配置在INPUT链上
-o:指定匹配的发出流量接口信息 只能配置在OUTPUT链上
nc命令:相当于telnet
参数
-g<网关> 设置路由器跃程通信网关,最多可设置8个。
-G<指向器数目> 设置来源路由指向器,其数值为4的倍数。
-h 在线帮助。
-i<延迟秒数> 设置时间间隔,以便传送信息及扫描通信端口。
-l 使用监听模式,管控传入的资料。
-n 直接使用IP地址,而不通过域名服务器。
-o<输出文件> 指定文件名称,把往来传输的数据以16进制字码倾倒成该文件保存。
-p<通信端口> 设置本地主机使用的通信端口。
-r 乱数指定本地与远端主机的通信端口。
-s<来源位址> 设置本地主机送出数据包的IP地址。
-u 使用UDP传输协议。
-v 显示指令执行过程。
-w<超时秒数> 设置等待连线的时间。
-z 使用0输入/输出模式,只在扫描通信端口时使用。
四、简单的实践
清除配置规则
iptables -F <- 清空iptables所有规则信息(清除filter)
iptables -X <- 清空iptables自定义链配置(清除filter)
iptables -Z <- 清空iptables计数器信息(清除filter)
1、阻止用户访问服务器的22端口
### -A 表示添加规则到相应链上,默认表示添加规则到结尾
iptables -t filter -A INPUT -p tcp --dport 22 -j DROP ##此规则一添加,则无法连接远程连接,如需连接则要到本机更改规则
#删除规则
#iptables -t filter -D INPUT -p tcp --dport 22 -j DROP --- -D 表示删除规则从相应链上。
### -I 表示插入规则到相应链上,默认表示插入规则到首部
iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
iptables -t filter -I INPUT 3 -p tcp --dport 22 -j DROP --- 指定规则插入位置
iptables -t filter -R INPUT 6 -p tcp --dport 8080 -j DROP --- -R 指定将配置好的规则信息进行替换
2、除了某个地址可以访问22端口之外,其余地址都不能访问
列如:
允许ip:10.0.0.9访问
iptables -t filter -A INPUT -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
阻止10网段访问
iptables -t filter -A INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
##通过利用 !进行规则取反,进行策略控制(只允许10.0.0.9访问)
iptables -t filter -A INPUT ! -s 10.0.0.9 -p tcp --dport 22 -j ACCEPT
3、指定阻止访问多个端口服务
--- 匹配连续的端口号访问,连续的端口可以连续
iptables -A INPUT -s 10.0.0.9 -p tcp --dport 22:80 -j DROP
--- 匹配不连续的端口号访问
iptables -A INPUT -s 10.0.0.9 -m multiport -p tcp --dport 22,24,25 -j DROP
-m --- 指定应用扩展模块参数
multiport --- 可以匹配多个不连续端口信息
4、通过防火墙实现禁ping功能
实现ping功能测试链路是否正常,基于icmp协议实现的
icmp协议有多种类型:
icmp-type 8:请求类型 (禁ping的主要类型)
icmp-type 0:回复类型
icmp-type 0:any(所有)
情况一:实现禁止主机访问防火墙服务器(禁止其他机子ping)
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
iptables -A OUTPUT -p icmp --icmp-type 0 -j DROP
情况二:实现禁止防火墙访问主机服务器(禁ping)
iptables -A OUTPUT -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -p icmp --icmp-type 0 -j DROP
默认情况:所有icmp类型都禁止
iptables -A INPUT -p icmp -m icmp --icmp-type any -j DROP
iptables -A OUTPUT -p icmp -m icmp --icmp-type any -j DROP
5、实现防火墙状态机制控制
NEW: 发送数据包里面控制字段为syn=1,发送第一次握手的数据包
ESTABLISHED: 请求数据包发出之后,响应回来的数据包称为回复的包
RELATED: 基于一个连接,然后建立新的连接
INVALID: 无效的的数据包,数据包结构不符合正常要求的
iptables -A INPUT -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
6、配置共享上网功能
原理:(来自老男孩教育)
模拟环境:
1、找一台机子(我这里是虚拟机any),停掉其网卡一,开启内网网卡二,使其不能上网
停网卡示例:
2、然后在管理机(可以上网的机子)配置iptables规则使用nat表转发网段的子网掩码要与配置的网卡一致
#在管理机(能上网的机器上面)配置
iptables -t nat -A POSTROUING -s 172.16.1.0/16 -j SNAT --to-source 10.0.0.61
#如果管理机的ip是动态的,就使用:
iptables -t nat -A POSTROUING-s 172.16.1.0/24 -j MASQUERADE
#MASQUERADE:掩饰的意思
#注意:必须要把nat的转发功能打开:net.ipv4.ip_forward=1
echo 1 >/proc/sys/net/ipv4/ip_forward ##打开
echo 0 >/proc/sys/net/ipv4/ip_forward ##关闭
把net.ipv4.ip_forward=1添加到/etc/sysctl.conf中:echo ‘net.ipv4.ip_forward=1’ >>/etc/sysctl.conf实现自启动
3、在any主机上ping www.baidu.com
这里是可以上网的!!!
4、端口转发/映射
公网ip访问内网的时候可以使用管理机进行端口的转发(映射),实现客户端能连上内网的主机
原理图(来自老男孩教育)
**在配置好共享上网的前提之下**
用户从公网访内网的主机,途经管理机转发(端口映射)
在管理上配置iptables规则:
iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-distination 172.16.7:22
配置之后就可以在外网的主机上访问管理机的9000端口,管理机转发到web的22端口上
5、ip映射
公网ip访问内网的时候可以使用管理机进行ip的转发(映射),实现客户端能连上内网的主机
特别说明
可以在管理机上添加虚拟ip来实现实验:(因为ip映射需要大量的ip地址来转发,所以此实验是为了测试,实际生产当中,一般不用)
命令: ip address add ip地址 可以简写为:ip a a ip地址
原理图:(来自老男孩教育)
然后配置iptables规则:
无需指定端口:(参数在上面有讲)
iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-distination 172.16.7:22
说明:本章部分内容来自老男孩教育