iptables是组成Linux平台下的包过滤防火墙,与大多数的Linux软件一样,这个包过滤防火墙是免费的,它可以代替昂贵的商业防火墙解决方案,完成封包过滤、封包重定向和网络地址转换(NAT)等功能。在日常Linux运维工作中,经常会设置iptables防火墙规则,用来加固服务安全
位于Linux内核中的包过滤功能体系
称为Linux防火墙的“内核态”
是干活的,负责是放过还是不放过
iptables:
位于/sbin/ipatbles,用来管理防火墙规则的工具
称为Linux防火墙的“用户态”
包过滤的工作层次:
主要是网络层,针对IP数据包
体现在对包内的IP地址,端口等信息的处理上
防火墙直接控制着端口–服务,IP,协议
对应着一些协议:TCP和UDP
规则链:
链就是规则的集合,不同的场景会读到不同的链
规则的作用:对数据包进行过滤或处理
链的作用:容纳各种防火墙规则
链的分类依据:处理数据包的不同时机
### 2.1 默认包括5种规则链
INPUT:处理入站数据包,进防火墙的时候会读INPUT链
OUTPUT:处理出战数据包,出防火墙的时候会读OUTPUT链
FORWARD:处理转发数据包,中间的过程是FORWARD链去处理,尽量做在INPUT链上
POSTROUTING链:在进行路由选择后处理数据包;从内向外会查路由表;将源地址转换为外网地址出去
PREROUTING链:在进行路由选择前处理数据包;PREROUTING先把目标IP转换为私有IP在查询路由表进行数据转发
规则表:
表当中包含着不同种的链
表的作用:容纳各种规则链
表的划分依据:防火墙规则的作用相似
raw表:确定是否对该数据包进行状态跟踪
mangle表:为数据包设置标记;mangle打标签,raw表去识别标签,追踪状态
nat表:修改数据包中的源,目标IP地址或端口nat表和fileter是用的最多的表
filter表:确定是否放行该数据包(过滤);防火墙的默认表filter,核心的表
raw–>mangel–>nat–>filter
规则链之间的顺序
入站:PREROUTING–>INPUT
出站:OUTPUT–>POSTROUTING
转发:PREROUTING–>FORWARD–>POSTROUTING
按顺序依次检查,匹配即停止(LOG策略例外)
若找不到相匹配的规则,则按该链的默认策略处理
●匹配流程示意图:
关闭firewalld防火墙:
[root@shanan ~]# systemctl stop firewalld.service
[root@shanan ~]# systemctl disable firewalld.service
安装iptables防火墙:
[root@shanan ~]# yum install iptables iptables-services.x86_64 -y
已加载插件:fastestmirror, langpacks
Loading mirror speeds from cached hostfile
软件包 iptables-1.4.21-28.el7.x86_64 已安装并且是最新版本
正在解决依赖关系
--> 正在检查事务
---> 软件包 iptables-services.x86_64.0.1.4.21-28.el7 将被 安装
--> 解决依赖关系完成
设置iptables开机启动:
[root@shanan ~]#systemctl start iptables.service
[root@shanan ~]#systemctl enable iptables.service
语法结构:iptables [-t表名] 选项 [链名] [条件] [-j 控制类型]
-I是在条目首部插入;-A是尾部插入
[root@promote ~]# iptables -t filter -I INPUT -p icmp -j REJECT
对ICMP协议拒绝
注意事项:
不指定表明时,默认指filter表
不指定链名时,默认指表内的所有链
除非设置链的默认策略,否则必须指定匹配条件
选项,链名,控制类型使用大写字母,其余均为小写
数据包的常见控制类型:
ACCEPT:允许通过
DORP:直接丢弃,不给任何回应
REJECP:拒绝通过,必要时会给提示
LOG:记录日志信息,然后传给下一条规则继续匹配
iptables的管理选项:
添加新的规则:
-A:在链的末尾追加一条规则
-I:在链的开头(或指定序号)插入一条规则
举例:
[root@shanan ~]# iptables -I INPUT -p udp -j ACCEPT ##允许UDP协议通过
[root@shanan ~] iptables -t filter -A INPUT -p tcp -j ACCEPT ##允许TCP协议通过
[root@shanan ~]iptables -I INPUT 2 -p icmp -j ACCEPT ##在第二条当中允许TCP协议通过
-L:列出所有的规则条目
-n:以数字形式显示地址,端口等信息
-v:以更详细的方式显示规则信息
–line-numbers:查看规则时,显示规则序号
[root@shanan ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT udp -- anywhere anywhere
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@shanan ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- anywhere anywhere
## 3.4 删除,清空规则:
-D:删除链内指定序号(或内容)的一条规则
-F:清空所有的规则
举例:
我们想清空第一条INPUT命令
[root@shanan ~]# iptables -D INPUT 1
再次查看发现内容被删除
[root@shanan ~]# iptables -L INPUT --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
不加-t直接 -F清空的是默认filter表的内容
[root@shanan ~]# iptables -F
清空指定列表要加 -t 表名称
[root@shanan ~]iptables -t nat -F ##清空nat表
设置默认策略:
-P:为指定的链设置默认规则清空所有默认策略
要么是ACCEPT要么是DROP表的所有链
[root@shanan ~]#iptables -filter -P FORWARD DROP
[root@shanan ~]# iptables -P OUTPUT ACCEPT
通用匹配:
可直接使用,不依赖于其他条件或扩展
包括网络协议,IP地址,网络接口等条件
隐含匹配:
要求以特定的协议匹配作为前提
包括端口,TCP标记,ICMP类型等条件
显示匹配:
要求以“-m 扩展模块”的形式明确指出类型
包括多端口,MAC地址,IP范围,数据包状态等条件
常见的通用匹配条件:
协议匹配:-p 协议名
地址匹配:-s 源地址,-d目的地址
接口匹配:-i入站网卡,-o出站网卡
[root@promote ~]# iptables -I INPUT -p icmp -j DROP
INPUT链路中icmp协议直接被拒绝
[root@shanan ~]# iptables -A FORWARD ! -p icmp -j ACCEPT
除了icmp协议以外其他的所有协议都放通
举例:
[root@shanan ~]#iptables -A INPUT -i ens33 -s 192.168.0.0/16 -j DROP ##16.0网段私网地址全部被拒绝
[root@shanan ~]# iptables -A INPUT -i ens33 -s 10.0.0.0/8 -j DROP ##10.0公网地址全部被拒绝
[root@shanan ~]#iptables -A INPUT -i ens33 172.16.0.0/12 -j DROP ##172网段全部被丢弃
端口是跟着数据流向决定的
–sport源端口,–dport目的端口
ICMP类型匹配:–icmp-type ICMP类型
[root@shanan ~]# iptables -A FORWARD -s 192.168.4.0/24 -p udp --dport 53 -j ACCEPT
##在转发链中源地址为4.0端口,协议为UDP协议,53端口允许通过;也就是DNS的服务功能允许通过;DNS端口号为53
[root@shanan ~]# iptables -A INPUT -p tcp --dport 20:21 -j ##ACCEPTftp服务允许通过
多端口匹配:
-m multiport --sports 源端口列表
-m multiport --dports 目的端口列表
IP范围匹配:-m iprange --src-range IP范围
MAC地址匹配:-m mac --mac-source MAC地址
状态匹配: -m state --state 连接状态
SNAT策略的典型应用环境:
SNAT策略主机共享单个公网IP地址接入Internet
SNAT策略的原理
源地址转换,Source Network Address Translation
修改数据包源地址
前提条件:
局域网各主机正确设置IP地址/子网掩码
局域网各主机正确设置默认网关地址
Linux网关支持IP路由转发
准备三台虚拟机;三台虚拟机都是绑定VMnet1仅主机模式
192.168.100.10作为内部主机
中间虚拟机配置双网卡作为防火墙
12.0.0.10作为外部主机
防火墙主机配置:
1.先将作为防火墙的那台虚拟机配置内网的网关
2.另一个网卡配置作为外部主机的网关
3.修改完后,要重启网卡,再用命令查看网卡信息
ens33 作为内部网关 192.168.100.1
ens36作为外部网关 12.0.0.1
如图所示:
4.配置数据转发功能;
修改配置文件 vi /etc/sysctl.conf
添加一行 : net.ipv4.ip_forward=1
[root@shanan network-scripts]# sysctl -p //使路由立即生效
net.ipv4.ip_forward = 1
5.清空防火墙规则,因为马上要自己配置
[root@shanan network-scripts]# iptables -F
[root@shanan network-scripts]# iptables -t nat -F
内网主机 test1配置:
1.配置内部虚拟机的IP地址为内部地址,配置完后要重启网卡
外网主机test2配置:
1.安装httpd服务,并启用服务,这边服务之前已经安装好了,只需启用就可以了
2.关闭防火墙功能,和临时防护功能
3.绑定仅主机模式网卡
4.防火墙主机配置防火墙规则:配置指定NAT表,在首部插入postrouting链,指向源地址192.168.100.10,指定外网出口ens36,将地址解析为12.0.0.1
[root@shanan network-scripts]# iptables -t nat -I POSTROUTING -s 192.168.100.10 -o ens36 -j SNAT --to-source 12.0.0.1
cd /var/log/httpd 查看httpd的登录日志信息
[root@test2 httpd]# cat access_log
12.0.0.1 - - [02/Aug/2020:19:34:27 +0800] "GET /noindex/css/fonts/Bold/OpenSans-Bold.ttf HTTP/1.1" 404 238 "http://12.0.0.10/noindex/css/open-sans.css" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
此时发现来源的地址是 12.0.0.1
成功进行了NAT转换
DNAT策略概述:
DNAT策略的典型应用环境:
在Internat中发布位于企业局域网内的服务器
DNAT策略的原理:
目标地址转换修改数据包的目标地址
1.在内部虚拟机中启动阿帕奇服务;在防火墙主机配置将目标地址12.0.0.1地址做转换,指定TCP协议,指向80端口
iptables -t nat -I PREROUTING -d 12.0.0.1 -p tcp --dport 80 -i ens36 -j DNAT --to-destination 192.168.10.10
[root@test1 network-scripts]# cd /var/log/httpd
[root@test1 httpd]# ls
access_log error_log
[root@test1 httpd]# cat access_log
12.0.0.10 - - [02/Aug/2020:20:23:17 +0800] "GET /favicon.ico HTTP/1.1" 404 209 "-" "Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Firefox/60.0"
将iptables规则保存到文件中进行备份:
iptables-save > /路径/名称
重新加载备份文件中的iptables规则:
iptables-restore < 备份文件的完整路径
[root@shanan yum.repos.d]# iptables-save > /opt/123.txt
[root@shanan yum.repos.d]# cat /opt/123.txt
# Generated by iptables-save v1.4.21 on Sun Aug 2 20:29:11 2020
*mangle
:PREROUTING ACCEPT [2953:448756]
:INPUT ACCEPT [630:158906]
:FORWARD ACCEPT [194:104952]
:OUTPUT ACCEPT [898:100077]
:POSTROUTING ACCEPT [1267:231527]
-A POSTROUTING -o virbr0 -p udp -m udp --dport 68 -j CHECKSUM --checksum-fill
COMMIT
# Completed on Sun Aug 2 20:29:11 2020
# Generated by iptables-save v1.4.21 on Sun Aug 2 20:29:11 2020
*nat
:PREROUTING ACCEPT [1434:102228]
:INPUT ACCEPT [148:14202]
:OUTPUT ACCEPT [9:608]
:POSTROUTING ACCEPT [16:1052]
-A PREROUTING -d 12.0.0.1/32 -i ens36 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.10.10
-A POSTROUTING -s 192.168.100.10/32 -o ens36 -j SNAT --to-source 12.0.0.1
COMMIT
# Completed on Sun Aug 2 20:29:11 2020
# Generated by iptables-save v1.4.21 on Sun Aug 2 20:29:11 2020
*filter
:INPUT ACCEPT [493:134851]
:FORWARD ACCEPT [194:104952]
:OUTPUT ACCEPT [760:80358]
COMMIT
# Completed on Sun Aug 2 20:29:11 2020