? iptables其实并不是真正的防火墙,我们可以理解成一个客户端代理,用户通过 IPTables这个代理,将用户的安全设定执行到对应的"安全框架"中,这个"安全框架"才 是真正的防火墙,这个框架的名称叫做 netfilter
.
? netfilter 位于内核空间,IPTables其实是一个命令行工具,位于用户空间,我 们用这个工具操作真正的框架。netfilter/iptables 组成Linux平台下的包过滤防火墙,与 大多数的Linux软件一样,这个包过滤防火墙是免费的,完成封包过滤,封包重定向和 网络地址转换(NAT)等功能。
? iptbales是一个基于命令行的防火墙工具,它使用规则链来允许/阻止网络流量。 当一条网络连接试图在你的系统中建立时,IPTables会查找对应的匹配规则。如果找 不到,IPTbales将对其采取默许操作。 iptables 是 Linux 防火墙系统的重要组成部分,iptables 的主要功能是实现对网络数据包进出设备及转发的控制。当数据包需要进入设备、从设备中流出或者由该设备转发、路由时,都可以使用 iptables 进行控制。
? iptables 是集成在 Linux 内核中的包过滤防火墙系统。使用 iptables 可以添加、删除具体的过滤规则,iptables 默认维护着 4 个表和 5 个链,所有的防火墙策略规则都被分别写入这些表与链中
? 规则(rules)其实就是网络管理员预定义的条件,规则一般定义为"如果数据包头符合这样的条件,就按照规定处理这个数据包"。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址,目的地址,传输协议(如TCP,UDP,ICMP等)和服务类型(如HTTP,FTP,SMTP等)。当数据包和规则匹配时,iptables就根据规则所定义的方法来处理这些数据包,如放行(accept),拒绝(reject)和丢弃(drop)等。配置防火墙的主要工作就是添加,修改和删除这些规则。
? iptables只是Linux防火墙的管理工具而已,位于/sbin/iptables。真正实现防火墙功能的是netfilter,它是Linux内核中实现包过滤的内部结构
[root@localhost ~]# which iptables
/usr/sbin/iptables
? iptables中的规则表用于容纳多个规则链。规则表默认是允许通过状态,因此规则表中的规则链需要设置禁止的规则用来限制规则表,从而达到数据包过滤的效果。 反之,如果规则表禁止状态,则规则链需要设置被允许的规则。iptables根据防火墙规则的作用对表进行划分
规则表的执行顺序是raw>mangle>nat>filter
iptables中定义了很多规则链,且每种规则链的作用各不同
规则链也存在执行顺序的概念:
若未指定匹配规则表,则默认使用filter表
若未指定规则链,则指表内所有的规则链
规则链内的规则一旦匹配就停止,若未匹配成功则按照练的默认策略执行
# 当一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包源IP,目的IP判断是否需要转发
# 如果数据包就是进入本机的,他就会进入INPUT链。数据包到达了INPUT链后,任何进程都会收到它。本机上运行的程序可以发送数据包,这些数据包会经过OUTPUT链,然后到达POSTROUTING链输出
# 如果数据包是要转发出去的,且内核允许转发,数据包就会经过FORWARD链,然后到达POSTROUTING链输出
了解内核转发
# 开启内核转发
[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@localhost ~]# cat /proc/sys/net/ipv4/ip_forward
1
# 保持开机自启
[root@localhost ~]# vim /etc/sysctl.conf
[root@localhost ~]# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1 #0为关闭,1为开启
[root@localhost ~]#
iptables 命令的基本语法格式如下:
iptables [-t table] COMMAND [chain] CRETIRIA -j ACTION
各参数的含义为:
iptables 命令常用的选项及各自的功能:
选 项 功 能
-A 添加防火墙规则
-D 删除防火墙规则
-I 插入防火墙规则
-F 清空防火墙规则
-L 列出添加防火墙规则
-R 替换防火墙规则
-Z 清空防火墙数据表统计信息
-P 设置链默认规则
-m 设置扩展模块
iptables 命令常用匹配参数及各自的功能:
参 数 功 能
[!]-p 匹配协议,! 表示取反
[!]-s 匹配源地址
[!]-d 匹配目标地址
[!]-i 匹配入站网卡接口
[!]-o 匹配出站网卡接口
[!]--sport 匹配源端口
[!]--dport 匹配目标端口
[!]--src-range 匹配源地址范围
[!]--dst-range 匹配目标地址范围
[!]--limit 匹配数据表速率
[!]--mac-source 匹配源MAC地址
[!]--sports 匹配源端口
[!]--dports 匹配目标端口
[!]--stste 匹配状态(INVALID、ESTABLISHED、NEW、RELATED)
[!]--string 匹配应用层字串
iptables 命令触发动作及各自的功能:
触发动作 功 能
ACCEPT 允许数据包通过
DROP 丢弃数据包
REJECT 拒绝数据包通过
LOG 将数据包信息记录 syslog 曰志
DNAT 目标地址转换
SNAT 源地址转换
MASQUERADE 地址欺骗
REDIRECT 重定向
? 内核会按照顺序依次检查 iptables 防火墙规则,如果发现有匹配的规则目录,则立刻执行相关动作,停止继续向下查找规则目录;如果所有的防火墙规则都未能匹配成功,则按照默认策略处理
iptables -nvL
各参数的含义为:
-t nat
参数[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT) #INPUT链默认是允许规则
target prot opt source destination
ACCEPT all -- anywhere anywhere state
RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT) #FORWARD链默认是允许规则
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT) #OUTPUT链默认是允许规则
target prot opt source destination
--chain:链
--policy:策略
--target:控制类型
--prot:协议
--opt:操作
--source:源IP地址
--destination:目的IP地址
# 设置Input链的默认策略设置为拒绝(DROP)
[root@localhost ~]# iptables -P INPUT DROP #配置INPUT链默认拒绝数据包
[root@localhost ~]# iptables -I INPUT -p icmp -j ACCEPT #在INPUT链开头加入允许所有ICMP报文通过
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j ACCEPT #在INPUT链开头加入允许所有TCP端口22的报文通过
[root@localhost ~]# iptables -A INPUT -j ACCEPT #在INPUT链结尾加入所有报文
通过(-t filter可以省略不写,默认是filter表)
[root@localhost ~]# iptables -L #查看防火墙规则
Chain INPUT (policy DROP) #INPUT链默认是允许规则
target prot opt source destination
ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED
ACCEPT icmp -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:ssh
ACCEPT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain FORWARD (policy ACCEPT) #FORWARD链默认是允许规则
target prot opt source destination
REJECT all -- anywhere anywhere reject-with icmp-host-prohibited
Chain OUTPUT (policy ACCEPT) #OUTPUT链默认是允许规则
target prot opt source destination
# 允许所有人可以通过tcp的22号端口远程连接,修改为仅允许192.168.65.0/24网段的用户远程连接
[root@localhost ~]# iptables -R INPUT 2-s 192.168.65.0/24 -j ACCEPT
[root@localhost ~]# iptables -L #查看防火墙规则
ACCEPT icmp -- anywhere anywhere
ACCEPT tcp -- 192.168.65.0/24 anywhere tcp dpt:ssh
# 删除规则有两种方法,但都必须使用 -D 参数
[root@localhost ~]# iptables -D INPUT -p icmp -j ACCEPT
#有时需要删除的规则较长,删除时需要写一大串的代码,这样比较容易写错,这时可以先使用 -line-number 找出该条规则的行号,再通过行号删除规则
[root@localhost ~]# iptables -L -n --line-number
[root@localhost ~]# iptables -D INPUT 1
? 默认的 iptables 防火墙规则会立刻生效,但如果不保存,当计算机重启后所有的规则都会丢失,所以对防火墙规则进行及时保存的操作是非常必要的。
? iptables 软件包提供了两个非常有用的工具,我们可以使用这两个工具处理大量的防火墙规则。这两个工具分别是 iptables-save 和 iptables-restore,使用该工具可以实现防火墙规则的保存与还原。这两个工具的最大优势是处理庞大的规则集时速度非常快。
? CentOS 7 系统中防火墙规则默认保存在 /etc/sysconfig/iptables 文件中,使用 iptables-save 将规则保存至该文件中可以实现保存防火墙规则的作用,计算机重启后会自动加载该文件中的规则。如果使用 iptables-save 将规则保存至其他位置,可以实现备份防火墙规则的作用。当防火墙规则需要做还原操作时,可以使用 iptables-restore 将备份文件直接导入当前防火墙规则
iptables-save 命令用来批量导出 Linux 防火墙规则,语法介绍如下:
保存在默认文件夹中(保存防火墙规则):
[root@liangxu ~]# iptables-save > /etc/sysconfig/iptables
保存在其他位置(备份防火墙规则):
[root@liangxu ~]# iptables-save > 文件名称
直接执行 iptables-save 命令:显示出当前启用的所有规则
[root@localhost ~]# iptables-save
……
“#”号开头的表示注释;
“*filter”表示所在的表;
“:链名默认策略”表示相应的链及默认策略,具体的规则部分省略了命令名“iptables”;
在末尾处“COMMIT”表示提交前面的规则设置。
备份到其他文件中。例如文件:text,如下所示
[root@localhost ~]# iptables-save > text
列出nat表的规则内容,命令如下:
[root@localhost ~]# iptables-save -t nat
? iptables-restore 命令可以批量导入Linux防火墙规则,同时也需要结合重定向输入来指定备份文件的位置。命令如下:
[root@localhost ~]# iptables-restore < 文件名称
? 注意,导入的文件必须是使用 iptables-save工具导出来的才可以。
? 先使用 iptables-restore 命令还原 text 文件,然后使用 iptables -t nat -nvL 命令查看清空的规则是否已经还原,如下所示:
[root@localhost ~]# iptables-restore < test
[root@localhost ~]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
#配置只有指定IP地址段的用户可以连接本地的SSH服务。其他用户拒绝访问,可以有效防止黑客对SSH服务暴力破解
[root@localhost ~]# iptables -I INPUT -s 192.168.0.0/24 -p tcp --dport 22 -j ACCEPT
#在INPUT链的头部加入只允许源IP时192.168.0.0/24的网段协议是TCP目的端口是22的数
据通过
[root@localhost ~]# iptables -I INPUT -p tcp --dport 22 -j DROP
#在INPUT链的末尾加入不允许所有IP地址网络协议是TCP目的端口是22的数据通过
[root@localhost ~]# iptables -I INPUT -p tcp --dport 3306 -j DROP
#在INPUT链的末尾加入不允许所有IP地址网络协议是TCP目的端口是3306的数据通过
[root@localhost ~]# iptables -I INPUT -p udp --dport 3306 -j DROP
#在INPUT链的末尾加入不允许所有IP地址网络协议是UDP目的端口是3306的数据通过
[root@localhost ~]# iptables -I INPUT -p icmp -j REJECT
#禁止ICMP类型数据包发送进入该主机
[root@localhost ~]# iptables -I OUTPUT -p icmp -j REJECT
#禁止ICMP类型数据包从该主机发出
C:\Users\admin>ping 192.168.80.134
正在 Ping 192.168.80.134 具有 32 字节的数据:
请求超时。
请求超时。
请求超时。
请求超时。
192.168.80.134 的 Ping 统计信息:
数据包: 已发送 = 4,已接收 = 0,丢失 = 4 (100% 丢失)
[root@localhost ~]#iptables -I FORWARD -d www.baidu.com -j DROP
#禁止从主机转发访问www.baidu.com的数据报文
[root@localhost ~]# iptables -I INPUT -s 192.168.65.7 -j DROP #-I 指插入表第一列
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all -- 192.168.65.7 anywhere
………………
[root@localhost ~]# iptables -D INPUT -s 192.168.65.7 -j DROP
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
…………
`1.封IP段: 从123.0.0.1到123.255.255.254的命令
[root@localhost ~]# iptables -I INPUT -s 123.0.0.0/8 -j DROP
`2.封IP段:从123.168.0.0到123.168.255.254的命令
[root@localhost ~]# iptables -I INPUT -s 123.168.0.0/16 -j DROP
`3.封IP段:从123.168.65.0到123.168.65.254的命令
[root@localhost ~]# iptables -I INPUT -s 123.128.65.0/24 -j DROP
`1.解IP段: 从123.0.0.1到123.255.255.254的命令
[root@localhost ~]# iptables -D INPUT -s 123.0.0.0/8 -j DROP
`2.解IP段:从123.168.0.0到123.168.255.254的命令
[root@localhost ~]# iptables -D INPUT -s 123.168.0.0/16 -j DROP
`3.解IP段:从123.168.65.0到123.168.65.254的命令
[root@localhost ~]# iptables -D INPUT -s 123.128.65.0/24 -j DROP
? iptables具有NAT功能,可以将内网地址和外网地址进行转换,从而完成内外网 通信。网络地址转换分为源地址转换和目的地址转换两种.
? SNAT是指在数据包从网卡发出去的时候,把数据包中的源地址替换成可访问公 网的IP地址,当数据报文发送至对端主机后,对端主机认为源IP是公网的IP地址,从 而进行正常的响应.
实现一个IP地址做SNAT转换,一般可以让内网100到200台主机实现上网。
局域网各主机己正确设置IP地址、子网掩码、默认网关地址
Linux网关开启IP路由转发
[root@localhost ~]#echo 1 > /proc/sys/net/ipv4/ip_forward
SNAT转换:固定的公网IP地址
#配置SNAT策略,实现SNAT功能,将所有192.168.80.0/24这个网段的源IP改为
192.168.0.111
[root@localhost ~]#iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to-source 192.168.0.111
-- -s:可以指定单个IP地址
-- -o:指定出站网卡
-- --to-source:外网IP或地址池
[root@localhost ~]#iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o ens33 -j SNAT --to-source 192.168.0.111-192.168.0.122
利用实验来验证SNAT源地址转换的作用
①实验准备:
②实验步骤:
Ⅰ配置局域网机器的iptables功能
[root@localhost ~]# iptables -F -t nat #清空指定表的规则
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.80.0/24 -o
ens160 -j SNAT --to-source 192.168.0.111 #配置NAT表的POSTROUTING链规则
[root@localhost ~]# iptables -L -t nat #查看指定表的规则
Ⅱ.配置网关服务器
[root@client2 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward #开启路由转发功能
Ⅲ.配置Web服务器
#下载安装httpd服务器
[root@Server ~]# yum -y install httpd
[root@server ~]# firewall-cmd --permanent --add-service=http #防火墙放行http流量
success
[root@server ~]# firewall-cmd --reload
success
[root@server ~]#
Ⅳ.对外网主机80端口抓包,此时内网主机访问外网web时,成功隐藏了内网主机的ip, 而用网关外网ip来做访问报文的源地址和响应报文的目标地址
#外网主机下载Tcpdump工具进行网络流量抓包
[root@localhost ~]# yum -y install tcpdump.x86_64
[root@localhost ~]# yum -y install libpcap
#内网机器访问外网服务器
[root@localhost ~]# curl 192.168.0.112
#对外网服务器的ens160接口进行指定协议和端口的抓包
[root@server ~]# tcpdump -i ens160 -nn tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol
decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144
bytes
07:34:16.215925 IP 192.168.0.108.1684 > 192.168.0.112.80: Flags [S], seq
1361455181, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK],
length 0
07:34:16.216134 IP 192.168.0.112.80 > 192.168.0.108.1684: Flags [R.],
seq 0, ack 1361455182, win 0, length 0
07:34:16.716185 IP 192.168.0.108.1684 > 192.168.0.112.80: Flags [S], seq
1361455181, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK],
length 0
07:34:16.716374 IP 192.168.0.112.80 > 192.168.0.108.1684: Flags [R.],
seq 0, ack 1, win 0, length 0
07:34:17.218806 IP 192.168.0.108.1684 > 192.168.0.112.80: Flags [S], seq
1361455181, win 64240, options [mss 1460,nop,wscale 8,nop,nop,sackOK],
length 0
........
Ⅴ.对网关内网接口抓包,是直接内网ip发包给外网ip
[root@localhost ~]# tcpdump -i ens160 -nn tcp port 80
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol
decode
listening on ens160, link-type EN10MB (Ethernet), capture size 262144bytes
07:53:20.020348 IP 192.168.80.134.59868 > 192.168.0.112.80: Flags [S],seq 589541098, win 29200, options [mss 1460,sackOK,TS val 2237827899 ecr0,nop,wscale 7], length 0
07:53:21.074566 IP 192.168.80.134.59868 > 192.168.0.112.80: Flags [S],seq 589541098, win 29200, options [mss 1460,sackOK,TS val 2237828954 ecr 0,nop,wscale 7], length 0
07:53:22.035860 IP 192.168.0.112.80 > 192.168.80.134.59868: Flags [R.],seq 1036074530, ack 589541099, win 64240, length 0
③实验心得
? SANT的优点是可以使得多台局域网内的主机都通过一个公网IP进行正常的网页 访问,解决了IP资源匮乏的问题。同时,由于其源IP地址进行了转换,从而加强了网 络的安全性.
? DNAT是指数据包从网卡发送出去的时候修改数据报文中的目的IP为某公司内网 中私有IP使用的技术
利用实验来验证DNAT目的地址转化的作用
实验步骤:
①发布内网的Web服务
[root@localhost ~]# iptables -t nat -A PREROUTING -i ens160 -d 192.168.0.0/24 -p tcp --dport 80 -j DNAT --to-destination 192.168.80.11
[root@localhost ~]# iptables -L -t nat
-- -s:可以指定单个IP地址或IP地址段
-- -i:指定入站网卡
-- --to-destination:内网IP或地址池
-- --dport :指定入站的网络端口
②发布时修改目标端口
#发布局域网内部的OpenSSH服务器, 外网主机需使用250端口进行连接
[root@localhost ~]#iptables-t nat -A PREROUTING -i ens33 -d 192.168.0.112 -p tcp--dport 250-jDNAT --to 192.168.80.11:22
[root@localhost ~]# iptables -L -t nat
第一部分:模拟Linux系统为局域网中某服务器,通过编写脚本localsafe.sh加固
本机安全性
第二部分:模拟Linux系统主机为本地网络中的防火墙,通过对该系统编写脚本networksaft.sh加固本地网络,实现本地FTP服务器,Web服务器。E-mali服务
器的安全性
步骤1:
? 设置Redhat 8作为Web服务器,现在需要配置该Web服务器能被客户端访问,并 配置它能被安全的SSH远程控制,且配置可以SNMP安全纳管。该脚本通过配置 INPUT表默认为拒绝,并配置只允许接收的数据报文从而形成白名单机制的安全原则.
[root@localhost ~]#vim localsafe.sh
#!/bin/bash
iptables -F #清除所有规则
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
#允许调用localhost的应用访问
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#允许接收任意IP地址发送ICMP的echo类型报文
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#允许接收任意IP地址访问TCP的80和443端口(允许访问Web服务器)
iptables -A INPUT -p udp -s 192.168.0.7 --dport 22 -j ACCEPT
iptables -A INPUT -p udp -s 192.168.0.7 --dport 161 -j ACCEPT
#只允许IP地址为192.168.0.7的主机连接TCP的22端口(TCP)和UDP的161端口(SNMP)
iptables -A INPUT -j DROP
#INPUT链默认为数据包丢弃
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
#允许建立ESTBELISHED状态的数据包发出
iptables -A OUTPUT -j DROP
iptables -A FORWARD -j DROP
#OUTPUT链默认设置为拒绝,即禁止主机主动发出外部连接,这个可以有效防止反弹shell攻击
#FORWARD链默认为数据包丢第
iptables -L -n --line-numbers
步骤2:
? 为localsafe.sh脚本赋予执行权限,然后执行脚本
[root@localhost ~]# vim localsafe.sh
[root@localhost ~]# ./localsafe.sh
步骤3:
? Linux服务器模拟配置网络防火墙,该组网中所有的服务器用到的IP均为公网IP, 且有三个服务器:Web服务器(220.128.15.10),FTP服务器(220.128.15.11),Email服务器(220.128.15.12).内网IP地址网段为192.168.1.0/24.配置Linux防火墙允 许内网访问三个服务器,不允许其他公网IP访问。禁止Internet用户ping防火墙的eth0 接口
为了满足上述要求,编写脚本networksafe.sh
root@client2 ~]# vim networksafe.sh
[root@client2 ~]# cat networksafe.sh
#!/bin/bash
iptables -F #清空规则链
iptables -P INPUT DROP #配置INPUT链默认拒绝数据包
iptables -P FORWARD DROP #配置FORWARD链默认拒绝数据包
iptables -P OUTPUT DROP #配置OUTPUT链默认拒绝数据包
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.10 --dport 80 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.10 --dport 443 -j ACCEPT
#配置允许源IP192.168.1.0/24网段的Web服务器的数据包通过防火墙
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.11 --dport 21 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.11 --dport 20 -j ACCEPT
#配置允许源IP192.168.1.0/24网段的FTP服务器的数据包通过防火墙
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.12 --dport 25 -j ACCEPT
iptables -A FORWARD -p tcp -s 192.168.1.0/24 -d 220.128.15.12 --dport 110 -j ACCEPT
iptables -A FORWARD -p udp -s 192.168.1.0/24 -d 220.128.15.12 --dport 161 -j ACCEPT
#配置允许源IP192.168.1.0/24网段的E-mail服务器的数据包通过防火墙
iptables -A INPUT -i eth0 -p icmp -j DROP
#配置拒绝接口eth0的icmp流量
echo 1 > /proc/sys/net/ipv4/ip_forward
#开启路由转发
[root@client2 ~]# chmod +x networksafe.sh
[root@client2 ~]# ./networksafe.sh
//执行结果省略