18、IPTABLES

发布时间 2023-11-03 00:15:46作者: gcc_com

IPTABLES

网络设备:交换机、路由器(网络层或者链路层)

安全设备:不直接参与数据的传输、连通性,主要用于保护网络层或者链路层数据传输的安全性

1、防火墙介绍

防火墙作为内部网与外部网之间的一种访问控制设备(防火墙用于隔绝内外网的一种访问控制设备),常常安装在内部网络和外部网络的边际上。防火墙具有很好的网络安全保护作用。入侵者必须首先穿越防火墙的安全防线,才能接触目标计算机。你可以将防火墙配置成许多不同保护级别。高级别的保护(必须是存在与高级别的防火墙当中)可能会禁止一些服务,如视频流等,但至少这是你自己的保护选择。

防火墙分类

①硬件防火墙
将Linux系统、安全策略、规则全部都加入特定的硬性设备
好处:响应快、耗资源少(减少服务器资源消耗)、功能强大
坏处:价格巨高(一般用于国防),不常见
②软件防火墙
最早期:具有ACL的路由器
所有防火墙的基础功能:包过滤ACL(防火墙)

防火墙的主要作用

①Internet防火墙可以防止Internet上的危险传播到网络内部;web防火墙(WAF)
②能强化安全策略(规则);
③能有效记录Internet上的活动;

日志与防火墙的区别

日志:系统内部的事件监控

防火墙:内外网间(门口)的监控

2、数据传输

数据封装与解封装

数据封装(从上往下)/数据解封装(从上往下):
【应用层】上层数据
【传输层】TCP头部		上层数据
【网络层】IP头部  		TCP头部  		上层数据
【数据链路层】MAC头部  		IP头部  		TCP头部  		上层数据
【物理层】二进制流

封装数据:
真实应用数据从上层进入到传输层,加上源端口和目标端口成为数据段(TCP|UDP首部),接着进入网络层,加上源IP和目标IP成为数据包,再进入链路层,加上源MAC地址和目标MAC地址成为数据帧,形成一个完整的数据包。
解封装数据:
数据经过网络传输到达目标主机后,按照封装的反顺序逐层解包,最终得到真正的应用内容。

数据传输

数据传输:
主机间或者主机内部的服务进程可以通过多种方式进行数据传输,比如共享内存、套接字、消息队列等。而我们常说的OS模型方式,就是一种网络方式的数据传输,而且是基于套接字(ip+port)的。当封装好的数据达到物理层后,会基于数据包的网络层信息来判断,是直接流入本机,还是转发给网络中的其他主机。
套接字:IP地址:端口(一个端口对应一个服务)

进程间数据通信

主机内的进程间数据通信:
封装好的数据,无需经过物理网卡和路由,通过本机的回环网卡(LoopBack)即可实现从A套接字流出,从B套接字流入,由内核空间进入用户空间,进而被进程所在的应用程序接收并处理,完成整套数据的传输效果。前提是Linux主机需要开启ip_forward功能,否则导致数据包转发失败,直接丢弃。

主机间的进程数据通信:
封装好的数据,在物理层进行路由决策,如果数据包的目标地址是其他主机,数据包从A网卡流出,然后数据包在互联网上进行路由转发,最终到达目标主机,从B网卡流入,进入到指定的套接字,被进程所在的应用程序接收并处理,完成整套数据的传输效果。

网卡:实现上网的物理设备

3、iptables前提-->路由小实验

前提:三个主机(主机服务器),两个网段,只要中间的设备的网卡信息相同,是可以实现通信的。(通过网卡地址)

路由小实验

路由小实验:(隔离多个网段而实现内外网通信)
server1:1.1.1.1(内网)
server2:2.2.2.2/3.3.3.3(网关)
server3:4.4.4.4(外网)

server1当中的两张网卡可以通过server1的回环接口来进行联系(在服务器主机server1当中网卡之间是可以进行通信的)
路由器(网络设备)当中的下一跳/(出)接口在主机服务器当中叫网卡/网关。
需求:实现server1与server3通信(三个主机,四个网段实现通信)

步骤:
①改网卡(1.1.1.1与2.2.2.2所在网卡同一张,实现2.2.2.2为1.1.1.1的网关;3.3.3.3与4.4.4.4所在网卡同一张3.3.3.3为4.4.4.4的网关---->优化:保证实验的流畅性将四个主机都设置成同一网卡)
虚拟机-->硬件-->网络适配器-->自定义模式选择VMnet8(三台主机同网卡)(server2需要而外添加一张网卡)-->确定
②给每个主机配上对应的IP地址/编辑网卡(测试网关间是否能通信)
server1:(网关为2.2.2.2)
[root@localhost network-scripts]# vim ifcfg-ens33 
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a | grep inet | grep -v inet6
    inet 127.0.0.1/8 scope host lo
    inet 1.1.1.1/24 brd 1.1.1.255 scope global noprefixroute ens33
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
server2:(将2.2.2.2和3.3.3.3网卡的网关配置为对方的网关)
[root@localhost network-scripts]# cp ifcfg-ens33 ifcfg-ens37		//双网卡,前提是硬件设备要添加
//ens37的网卡名称和设备名称都需要修改,不修改的话,系统无法识别该网卡信息。
[root@localhost network-scripts]# vim ifcfg-ens33
[root@localhost network-scripts]# vim ifcfg-ens37
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a | grep inet | grep -v inet6
    inet 127.0.0.1/8 scope host lo
    inet 2.2.2.2/24 brd 2.2.2.255 scope global noprefixroute ens33
    inet 3.3.3.3/24 brd 3.3.3.255 scope global noprefixroute ens37
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
server3:(网关为3.3.3.3)
[root@localhost network-scripts]# vim ifcfg-ens33 
[root@localhost network-scripts]# systemctl restart network
[root@localhost network-scripts]# ip a | grep inet | grep -v inet6
    inet 127.0.0.1/8 scope host lo
    inet 4.4.4.4/24 brd 4.4.4.255 scope global noprefixroute ens33
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
③测试连通性(最终结果:1.1.1.1与4.4.4.4之间全互通)
查看当前主机当中的路由表:
server1:
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         2.2.2.2         0.0.0.0         UG    100    0        0 ens33	//要发给任意的网段,其网关都为2.2.2.2(这一条就涵盖了下面的所有信息)(若缺少了这条消息说明该设备未配置网关)
1.1.1.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
2.2.2.2         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
Destination:目标网段
Gateway:自己网关
Genmask:子网掩码
Iface:设备名
server2:
[root@localhost network-scripts]# route -n(2.2.2.2和3.3.3.3网卡互为对方的网关)
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         3.3.3.3         0.0.0.0         UG    100    0        0 ens33
0.0.0.0         2.2.2.2         0.0.0.0         UG    101    0        0 ens37
2.2.2.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
2.2.2.2         0.0.0.0         255.255.255.255 UH    101    0        0 ens37
3.3.3.0         0.0.0.0         255.255.255.0   U     101    0        0 ens37
3.3.3.3         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
//【略看】若在当时没有在配置IP时添加上网关信息的话,则之后可使用如下方法配上网关/网关:[root@Lin network-scripts]# route add -net 1.1.1.0/24 dev ens33
server3:
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         3.3.3.3         0.0.0.0         UG    100    0        0 ens33
3.3.3.3         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
4.4.4.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0

测试一、完成1.1.1.1与2.2.2.2之间的通信
//完成以上存在,此时server1还无法ping通server2的任意网卡(假如说是路由设备的话,则以上配置就已经可以实现通信,但该设备为主机服务器)
##主机服务器当中想要ping某个地址,则必须在该主机服务器的路由表当中先有该地址网段(路由表想要通某个地址,必须要有该地址网段)
添加2.2.2.2到1.1.1.1的网段/网关信息:【在server2上配置】
[root@Lin network-scripts]# route add -net 1.1.1.0/24 dev ens33
结果:则成功实现1.1.1.1与2.2.2.2通信
测试二、实现3.3.3.3与4.4.4.4之间的通信
添加3.3.3.3到4.4.4.4的网段/网关信息:【在server2上配置】
[root@localhost network-scripts]# route add -net 4.4.4.0/24 dev ens37
结果:实现3.3.3.3与4.4.4.4之间的通信
命令:
route add/del -net 网段/掩码 dev 设备名称		//添加/删除网段
route add/del default gw IP地址 dev 设备名称		//添加/删除网关(前提要有该网段)
#以上两个测试在2.2.2.2和3.3.3.3配置静态IP信息上都不写网卡信息的情况下照样可行

测试三、实现1.1.1.1与3.3.3.3之间的通信
1.将2.2.2.2和3.3.3.3网卡互为对方的网关(上边的配置静态IP地址的操作已经做了)
2.给server2配上1.1.1.0的网关、server2配上4.4.4.0的网关(这边测试一二也完成了)
结果:实现1.1.1.1与3.3.3.3的通信、4.4.4.4与2.2.2.2的通信、但1.1.1.1与4.4.4.4还未能通信

测试四、实现1.1.1.1与4.4.4.4之间的通信
1.修改配置文件:开启路由转发功能
[root@localhost network-scripts]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@localhost network-scripts]# cat /proc/sys/net/ipv4/ip_forward
1		//1代表开启;0代表未开启
2.在server2上增加去往1.1.1.1和4.4.4.4的网段信息
结果:实现1.1.1.1与4.4.4.4之间的通信,且1.1.1.1没有4.4.4.4的任何信息(内网与外网的隔绝--实现内网的安全性)。

实现以上所有的路由小实验结束后个主机服务器的路由信息如下:
server1:
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         2.2.2.2         0.0.0.0         UG    100    0        0 ens33
1.1.1.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
2.2.2.2         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
server2:
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         3.3.3.3         0.0.0.0         UG    100    0        0 ens33
0.0.0.0         2.2.2.2         0.0.0.0         UG    101    0        0 ens37
1.1.1.0         0.0.0.0         255.255.255.0   U     0      0        0 ens33
2.2.2.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
2.2.2.2         0.0.0.0         255.255.255.255 UH    101    0        0 ens37
3.3.3.0         0.0.0.0         255.255.255.0   U     101    0        0 ens37
3.3.3.3         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
4.4.4.0         0.0.0.0         255.255.255.0   U     0      0        0 ens37
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0
server3:
[root@localhost network-scripts]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         3.3.3.3         0.0.0.0         UG    100    0        0 ens33
3.3.3.3         0.0.0.0         255.255.255.255 UH    100    0        0 ens33
4.4.4.0         0.0.0.0         255.255.255.0   U     100    0        0 ens33
192.168.122.0   0.0.0.0         255.255.255.0   U     0      0        0 virbr0



以上路由小实验注意点:
以上所写入的路由信息都是属于临时的,当重启网络服务时,该网络的路由就会恢复会最初的状态。(只要重启了网络,就需要重新配置路由信息)

4、iptables介绍

iptables全称叫:netfilter(核心)/iptables(工具)

iptables(难)& Firewalls(易)

在之前的linux系统中,默认的防火墙都是iptables,而随着Redhat|Centos7系统的发布,linux系统的防火墙默默的将iptables转换成了Firewalls,由Firewalls编辑各种各样的数据包管理规则,然后借助于netfilter模块来实现强大的防火墙功能,不过Firewalls的底层操作仍然是iptables,只不过它将繁杂的iptables的手工操作给封装起来,以简单易用的方式提供给大家。

Firewalld动态防火墙管理器服务(Dynamic Firewall Manager of Linux systems)是目前Centos7系统默认的防火墙管理工具,拥有命令行终端和图形化界面的配置工具,firewalld跟iptables主要有以下区别:

1、firewalls的默认规则是拒绝,需要时设置开启,iptables正好相反。

2、firewalls可以动态修改单条规则(iptables也行-立即生效),而且直接生效

3、firewalls简单易用,即使不理解各种数据包规则,也可以实现大部分功能。

4、想要真正学会防火墙规则,强烈推荐学习iptables。

5、iptables原理

iptables不是一个单一的软件工具,而是一套C/S样式的软件组,它是由工作在用户空间的iptables和工作在内核空间的Netfilter模块组成,一般统称为Iptables。

用户基于用户空间的iptables软件,来设定各种包过滤规则,借助于后端内核空间的Netfilter模块实现非常强大的防火墙功能,Netfilter实现的功能主要体现在数据包过滤、数据包重定向、网络地址转换等方面。

默认情况下,iptables主要工作在OSI模型中的的2~4层,我们还可以通过重编内核,让iptables支持7层的数据包管理。

规则优先级:netfilter为了更高质量的进行表之间的规则运行,已经定制好了这些表的优先级,从高到底效果如下:security > raw > mangle > nat > filter

1.五条链

Netfilter 平台中制定了数据包的五个挂载点(Hook Point,我们可以理解为回调函数点,数据包到达这些位置的时候会主动调用我们的函数,使我们有机会能在数据包路由的时候改变它们的方向、内容),这5个挂载点分别是PRE_ROUTINGINPUTOUTPUTFORWARDPOST_ROUTING

Linux内核中的专用数据包处理模块netfilter的工作的地方,而且netfilter对这几个地方分别定义了几个名称术语。在处理各种数据包时,根据防火墙规则的不同介入时机,iptables供涉及5种默认规则链,从应用时间点的角度理解这些链:

1、INPUT链(进站):当接收到防火墙本机地址的数据包(入站)时,应用此链中的规则。
2、OUTPUT链(上车):当防火墙本机向外发送数据包(出站)时,应用此链中的规则。
3、FORWARD链(转车):当接收到需要通过防火墙发送给其他地址的数据包(转发)时,应用此链中的规则。
4、PREROUTING链(下车):在对数据包作路由选择之前,应用此链中的规则,如DNAT。
5、POSTROUTING链(出站):在对数据包作路由选择之后,应用此链中的规则,如SNAT。

2.五个表

在netfilter的内存区域中,这五个表是security表、filter表、NAT表、mangle表和raw表,他们分别作用的对象是不一样的:

1、security表: 主要针对的是数据链路层的管理规则组合,只不过它是基于target(目标)来做操作的。
2、filter表:是netfilter中最重要的表,也是默认的表,主要负责数据包的过滤功能。(重要)
3、nat表:主要实现网络地址转换的表。可以自由转换数据报文中IP和PORT。
4、mangle表:主要实现数据包的拆分-修改-封装动作。
5、raw表:通过关闭nat表的追踪功能,从而实现加速防火墙过滤的表。

3.表中链(重要)

	security表 :input 、output、forward
	filter过滤表 :input 、output、forward
	nat 转换表 :postrouting、prerouting、input 、output
	mangle封装表 :input、output、forward、prerouting、postrouting
	raw自定义表 :prerouting、output

4.链属表

	prerouting :nat、mangle、raw
	postrouting :nat、mangle
	input :filter、mangle、security
	output :filter、nat、mangle、raw、security
	forward :filter、mangle、security

5.四表规则

filter表

主要用于对数据包进行过滤,根据具体的规则决定是否放行该数据包(如DROP、ACCEPT、REJECT、LOG)。filter 表对应的内核模块为iptable_filter,包含三个规则链:

INPUT链:INPUT针对那些目的地是本地的包

FORWARD链:FORWARD过滤所有不是本地产生的并且目的地不是本地(即本机只是负责转发)的

OUTPUT链:OUTPUT是用来过滤所有本地生成的包

nat表

主要用于修改数据包的IP地址、端口号等信息(网络地址转换,如SNAT、DNAT、MASQUERADE、REDIRECT)。属于一个流的包(因为包的大小限制导致数据可能会被分成多个数据包)只会经过这个表一次。如果第一个包被允许做NAT或Masqueraded,那么余下的包都会自动地被做相同的操作,也就是说,余下的包不会再通过这个表。表对应的内核模块为 iptable_nat,包含三个链:

PREROUTING链:作用是在包刚刚到达防火墙时改变它的目的地址

OUTPUT链:改变本地产生的包的目的地址

POSTROUTING链:在包就要离开防火墙之前改变其源地址

mangle表

主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)指以及为数据包设置Mark标记,以实现Qos(Quality Of Service,服务质量)调整以及策略路由等应用,由于需要相应的路由设备支持,因此应用并不广泛。包含五个规则链——PREROUTING,POSTROUTING,INPUT,OUTPUT,FORWARD。

raw表

是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING。

6、补充

iptables中数据包和4种被跟踪连接的4种不同状态:
1、NEW:该包想要开始一个连接(重新连接或将连接重定向)
2、RELATED:该包是属于某个已经建立的连接所建立的新连接。例如:FTP的数据传输连接就是控制连接所 RELATED出来的连接。--icmp-type 0( ping 应答) 就是--icmp-type 8(ping 请求)所RELATED出来的。
3、ESTABLISHED :只要发送并接到应答,一个数据连接从NEW变为ESTABLISHED,而且该状态会继续匹配这个连接的后续数据包。
4、INVALID:数据包不能被识别属于哪个连接或没有任何状态比如内存溢出,收到不知属于哪个连接的ICMP错误信息,一般应该DROP这个状态的任何数据。

6、iptables实验

前提:保证1.1.1.1与2.2.2.2之间能通信即可。

法一:如果使用上边的路由小实验的话则需要将server2上的互为网关给注释掉,还要联网下载iptables的相关工具-->比较麻烦。

法二:其次就是使用两台主机服务器先下载iptables的相关工具,再重新配置上两台设备之间的静态IP和路由信息(以下操作使用此方法)

①下载iptables的相关服务:【两台主机服务器都可下载,重要任意指定一台为服务端一台为客户端即可】
[root@localhost ~]# rm -f /var/run/yum.pid
[root@localhost ~]# yum -y install iptables
[root@localhost ~]# yum -y install iptables-services.x86_64
其余命令:
下载:
1.永久关闭firewalld
	systemctl stop firewalld
	systemctl disable firewalld
2.查看iptables软件包
	 yum list | grep iptables
3.安装iptables与iptables-services
	yum –y install iptables
	yum –y install iptables-services
服务相关命令:
[root@localhost ~]# systemctl start/stop iptables	// 开启/关闭iptables
[root@localhost ~]# systemctl status iptables	// 查看iptables状态
[root@localhost ~]# systemctl enable/disable iptables	// 开机自启/永久关闭iptables
[root@localhost ~]# iptables –help	// 查看帮助文档


②为了保证实验与法一的高度相似性,这里就不直接将2.2.2.2的网关信息配置成1.1.1.1的了,而是将2的网段注释掉,再配上2网段通往1网段的路由信息。
[root@localhost network-scripts]# route add -net 1.1.1.0/24 dev ens33  //添加该条路由消息1网段与2网段成功通信
//这里说下这一步都配置了说明:1.server1配置了1.1.1.1的静态IP和2.2.2.2的网关信息并重启了网络。2.server2配置了2.2.2.2的静态IP并重启了网络和添加了一条通往1.1.1.0网段的路由信息。从而实现1网段与2网段之间的通信。


常用指令
iptables 
	-t 指定查看表(不指定默认查看filter)
		-L:查看表中规则
		-vnL:查看详细规则
		-F:清空(不指定默认清空filter)
		-A:追加一条策略(默认放在最后开始执行)
		-l:插入一条策略(默认放在最前开始执行)
			-j:动作
				DROP:丢弃
			-p:指定协议	
iptables -L //查看现有规则
iptables -t nat -L //查看nat表的规则
iptables -F //清空表中规则
target 目标
ACCEPT 接受
REJECT 拒绝
DROP 丢弃


③测试规则有效性
//2.2.2.2的主机服务器为server端;1.1.1.1的主机服务器为client端
测试1、让客户端不能ping通服务端【使用iptables的规则来实现--源地址封杀、目的地址封杀】
法一:进站封杀/原地址封杀(无论客户端发送来的数据包要去哪,全都拒绝)
[root@localhost network-scripts]# iptables -F		//策略一般是从上到下开始匹配,所以需要先清空原有的策略以保证实验的准确性
[root@localhost network-scripts]# iptables -L		//查看表,此时规则表当中没有任何数据
[root@localhost network-scripts]# iptables -t filter -A INPUT -s 1.1.1.1 -j DROP //写入规则
[root@localhost network-scripts]# iptables -nvL		//规则已成功写入
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       all  --  *      *       1.1.1.1              0.0.0.0/0         
//此时客户端再次ping2.2.2.2服务器则无法成功
 pkts bytes target     prot opt in     out     source               destination         
    5   420 DROP       all  --  *      *       1.1.1.1              0.0.0.0/0      //5个包被成功丢弃/拦截  
//现在再次清空刚刚写入的规则,客户端又一次ping通主机服务器,说明上面写入的策略生效。
法二:目的地址封杀
[root@localhost network-scripts]# iptables -F	//清空原有的规则
[root@localhost network-scripts]# iptables -t filter -A INPUT -d 2.2.2.2 -j DROP	//写入目的地封杀规则
[root@localhost network-scripts]# iptables -nvL		//查看规则发现客户端已经无法与主机服务器端ping通
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    2   168 DROP       all  --  *      *       0.0.0.0/0            2.2.2.2       


测试二、只允许服务端服务客户端,客户端不能访问服务端
法一:主机服务器拦截客户端的请求包,但服务端访问客户端的请求包为被拦截
[root@localhost network-scripts]# iptables -F
[root@localhost network-scripts]# iptables -t filter -A INPUT -s 1.1.1.1 -p icmp --icmp-type 8 -j DROP
[root@localhost network-scripts]# iptables -nvL
Chain INPUT (policy ACCEPT 2 packets, 168 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    6   504 DROP       icmp --  *      *       1.1.1.1              0.0.0.0/0            icmptype 8
//此时服务端成功与客户端通信,但客户端访问服务端被拒绝了。
法二:主机服务器对回应包进行拦截
[root@localhost network-scripts]# iptables -F
[root@localhost network-scripts]# iptables -t filter -A OUTPUT -d 1.1.1.1 -p icmp --icmp-type 0 -j DROP
[root@localhost network-scripts]# iptables -nvL
Chain OUTPUT (policy ACCEPT 2 packets, 168 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    3   252 DROP       icmp --  *      *       0.0.0.0/0            1.1.1.1              icmptype 0
//此时服务端成功与客户端通信,但客户端访问服务端被拒绝了。
补充:
--icmp-type 8:请求包
--icmp-type 0:回应包
【作业1】(注意网关是否需要写入、路由策略是否需要添加)
法三:首先拒绝所有策略!!!然后开启对应icmp的ping包(全部加入黑名单,开放对应白名单。iptables的策略默认是全接受/开启的)
[root@localhost network-scripts]# iptables -F
[root@localhost network-scripts]# iptables -P INPUT DROP	 //修改filter表INPUT链的默认策略为拒绝
[root@localhost network-scripts]# iptables -t filter -A INPUT -s 1.1.1.1 -p icmp --icmp-type 0 -j ACCEPT
[root@localhost network-scripts]# iptables -t filter -A OUTPUT -d 1.1.1.1 -p icmp --icmp-type 8 -j ACCEPT
//此时服务端(2.2.2.2)成功与客户端(1.1.1.1)通信,但客户端(1.1.1.1)访问服务端(2.2.2.2)被拒绝了(开放对应白名单)。





//配置了iptables的主机服务器端无法远程其他设备
测试三、禁止客户端通过远程连接端口22来远程连接上主机服务器端。(使用iptables阻止一些端口服务)
法一:在主机服务器上将该客户端拉入远程连接的黑名单即可。
法二:使用iptables服务禁止客户端远程连接上服务器端
[root@localhost ~]# systemctl restart iptables.service 		//重启下server2的iptables的服务
此时的server1可以成功远程连接上server2(ssh 2.2.2.2),而server2无法远程连接其他设备(上面提到了)。
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t filter -A INPUT -s 1.1.1.1 -p tcp --dport 22 -j DROP //服务器端上写入规则
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 1 packets, 350 bytes)
 pkts bytes target     prot opt in     out     source               destination         
   14  4820 DROP       tcp  --  *      *       1.1.1.1              0.0.0.0/0            tcp dpt:22
现在server1无法远程连接上2.2.2.2这个主机服务器。
补充:
--dport:目标端口
测试四、只写一条规则就将22、80端口同时拒绝连接。(分开写其实也是可行的,不过那样的工作量太大了)
1.将22号端口到80号端口之间的服务全部拒绝(这样肯定不行,假如说在22到80之间有我们需要的端口服务,那不就使用不了了)(范围过于庞大)
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t filter -A INPUT -s 1.1.1.1 -p tcp --dport 22:80 -j DROP 
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       tcp  --  *      *       1.1.1.1              0.0.0.0/0            multiport dports 22:80
2.精准定位到指定端口上
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t filter -A INPUT -s 1.1.1.1 -p tcp -m multiport --dport 22,80 -j DROP
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       tcp  --  *      *       1.1.1.1              0.0.0.0/0            multiport dports 22,80
补充:
-m:引入模块
multiport:组合端口
测试五、禁用多个地址访问指定的端口(组合参数的运用)
[root@localhost ~]# iptables -F
[root@localhost ~]# iptables -t filter -A INPUT -m iprange --src-range "2.2.2.2-2.2.2.200" -p tcp -m multiport --dport 22,80,135 -j DROP 
[root@localhost ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination         
    0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0            source IP range 2.2.2.2-2.2.2.200 multiport dports 22,80,135
--src-range:源范围的意思

7、防火墙的备份与还原

默认的iptables防火墙规则会立刻生效,但如果不保存,当计算机重启后所有的规则都会丢失,所以对防火墙规则进行及时保存的操作是非常必要的。
iptables软件包提供了两个非常有用的工具,我们可以使用这两个工具处理大量的防火墙规则。这两个工具分别是iptables-save和 iptables-restore,使用该工具可以实现防火墙规则的保存与还原。这两个工具的最大优势是处理庞大的规则集时速度非常快。

CentOS 7 系统中防火墙规则默认保存在/etc/sysconfig/iptables文件中,使用iptables-save将规则保存至该文件中可以实现保存防火墙规则的作用,计算机重启后会自动加载该文件中的规则。如果使用iptables-save将规则保存至其他位置,可以实现备份防火墙规则的作用。当防火墙规则需要做还原操作时,可以使用iptables-restore将备份文件直接导入当前防火墙规则。

1、iptables-save命令
iptables-save 命令用来批量导出 Linux 防火墙规则,语法介绍如下:
保存在默认文件夹中(保存防火墙规则): [root@liangxu ~]# iptables-save > /etc/sysconfig/iptables
保存在其他位置(备份防火墙规则): [root@liangxu ~]# iptables-save > 文件名称
直接执行 iptables-save 命令:显示出当前启用的所有规则,按照 raw、mangle、nat、filter 表的顺序依次列出,如下所示:
[root@liangxu ~]# iptables-save # Generated by iptables-save v1.4.7 on Thu Aug 27 07:06:36 2020 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [602:39026] ....... COMMIT # Completed on Thu Aug 27 07:06:36 2020
其中:
“#”号开头的表示注释;
“*filter”表示所在的表;
“:链名默认策略”表示相应的链及默认策略,具体的规则部分省略了命令名“iptables”;
在末尾处“COMMIT”表示提交前面的规则设置。
备份到其他文件中。例如文件:text,如下所示:
[root@liangxu ~]# iptables-save > test [root@liangxu ~]# ls test [root@bogon ~]# cat test # Generated by iptables-save v1.4.7 on Thu Aug 27 07:09:47 2020 *filter ......
列出nat表的规则内容,命令如下:
[root@liangxu ~]# iptables-save -t nat		//“-t表名”:表示列出某一个表。

2、iptables-restore命令
iptables-restore 命令可以批量导入Linux防火墙规则,同时也需要结合重定向输入来指定备份文件的位置。命令如下:
[root@liangxu ~]# iptables-restore < 文件名称
注意,导入的文件必须是使用 iptables-save工具导出来的才可以。
先使用 iptables-restore 命令还原 text 文件,然后使用 iptables -t nat -nvL 命令查看清空的规则是否已经还原,如下所示:
[root@liangxu ~]# iptables-restore < test [root@liangxu ~]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination

8、内、外网之间的需求访问

①SNAT
明确内客户端地址是多少(1.1.1.1),外网web服务器地址是多少(2.2.2.2)。(防火墙左端口为1.1.1.254,右端口为2.2.2.254)  
比如内网地址为1.1.1.1,外网服务器地址为2.2.2.2
第一步:清空路由表(删除我们不需要的地址,添加需要的地址)
第二步:把去2.2.2.0/24的网关设为1.1.1.254。(那么只要是内网1.1.1.0网段的流量均通过nat转换成2.2.2.254)
添加路由:route add -net 目标网段 gw 内网网关 dev 网卡名称
wget命令使用:wget ip地址
POSTROUTING:出站检查/安检
!:取反
--to-source:源地址的转化
源地址转换:私有地址 --> 公有地址
防火墙命令:iptables -t nat -A POSTROUTING -s 内网网段 -j SNAT --to 公网接口ip
过程:
server1:(内网1.1.1.1)
        ping测试
[ rootdlocalhost network-scripts]# ping 4.4.4.4
PING 4.4.4.4 (4.4.4.4)56(84) bytes of data.
64 bytes from 4.4.4.4: icmp_seq=1 ttl=63 time=0.376 ms
64 bytes from 4.4.4.4: icmp_seq=2 ttl=63 time=0.467 ms
^c
- - - 4.4.4.4 ping statistics ---
2 packets transmitted,2 received,0% packet loss,time 1002ms
        访问web服务器
[ root@localhost network-scripts ]# wget 4.4.4.4
--2022-10-30 18:42:36-- http: // 4.4.4.4/
connecting to 4.4.4.4 :80. . . connected .
HTTP request sent,awaiting response. . . 403 Forbidden
2022-10-30 18:42:37 ERROR 403: Forbidden .
  
server2:(防火墙2.2.2.2/3.3.3.3)
        下载iptables
[ root@localhost network-scripts]# yum -y install iptables-services.x86 64
          实现通信          
[ root@localhost network-scripts]# vim ifcfg-ens33
[ root@localhost network-scripts]# vim ifcfg-ens37
[ root@localhost network-scripts]# systemctl restart network
[ root@localhost network-scripts]# echo 1 > /proc/sys/net/ipv4/ip_forward
[ root@localhost network-scripts]# route add -net 1.1.1.0/24 dev ens33
[ root@localhost network-scripts]# route add -net 4.4.4.0/24 dev ens37
[root@localhost network-scripts]# systemctl stop firewalld.service
        实现通信
[ root@localhost network-scripts]# iptables -t nat -A POSTROUTING -s 1.1.1.1 ! 1.1.1.0/24 -j SNAT --to- source 3.3.3.3

server3:(web服务器--外网4.4.4.4)
        下载http服务
[root@localhost ~]#rm -rf /var / run/ yum. pid
[root@localhost ~]#yum -y install httpd.x86_64
        ping测试
[ root@localhost network-scripts]# ping 1.1.1.1
PING 1.1.1.1 ( 1.1.1.1)56(84) bytes of data.
64 bytes from 1.1.1.1: icmp_seq=3 ttl=63 time=0.926 ms
64 bytes from 1.1.1.1: icmp_seq=4 ttl=63 time=0.378 ms
64 bytes from 1.1.1.1: icmp_seq=5 ttl=63 time=0.292 ms
^c
        在http服务器上写入东西
补充:/var/www/html 	//http服务器的登录页面,可以不写东西进去
[ root@localhost network-scripts]# cd /var/log/httpd
[ root@localhost httpd]#ll
total 0
[ root@localhost httpd]#ls
[ root@localhost httpd]# echo 123 > 1.txt
        启动http服务并查看http服务的状态
[ root@localhost httpd]# systemctl restart httpd. service
[ root@localhost httpd]# systemctl status httpd.service
        结果:在未写入规则时,外网上看到了内网服务器的IP为1.1.1.1(这个不行);在写入规则之后则内网访问外网时,会通过NAT转换成公网IP为3.3.3.3进行对外网web服务器的访问(实现了内网访问外网时,自身的IP不会暴露)
[ root@localhost httpd]# tail -f /var/log/httpd/access_log //记录里面是对外网地址去访问服务器的则符合预期结果
1.1.1.1 - -[30/0ct/2022:18:42:37 +0800] "GET / HTTP/1.1403 4897“-" "Wget/1.14 ( linux-gnu ) "
3.3.3.3 -- [30/oct/2022:18:45:28 +0800] "GET / HTTP/1.1" 403 4897"-""wget/1.14 ( linux-gnu) "
---------------------------------------------------------------------------------------------
---------------------------------------------------------------------------------------------
②DNAT
目标地址转换: 公有地址 -- > 私有地址
iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 内网地址
过程:
server1:(web服务器--内网1.1.1.1)
        下载iptables
[ root@localhost network-scripts]# rm -rf /var/run/yum.pid
[root@localhost network-scripts]# yum -y install httpd.x86_64
        在http服务器上写入东西
[root@localhost network-scripts]# cd /var/log/httpd/
[ root@localhost httpd]# ls
[ root@localhost httpd]# echo 123 > 1.txt
[ root@localhost httpd]#ll
total 4
- rw-r--r--. 1 root root 4 oct 30 19:05 1.txt
        启动http服务并查看http服务的状态
[ root@localhost httpd]# systemctl restart httpd.service
[root@localhost httpd]# systemctl status httpd.service
        结果:内网上http服务的日志中检测到来自外网的http访问    
[ root@localhost httpd]# tail -f /var/log/httpd /access_log
4.4.4.4 - - [30/oct/2022:19:08:25+0800]"GET / HTTP/1.1403 4897“-" "Wget/1.14 ( linux-gnu ) "
4.4.4.4 -- [30/0ct/2022:19:10:59 +0800]“GET / HTTP/1.1" 403 4897 "." "wget/1.14 ( linux-gnu ) "

server2:(防火墙2.2.2.2/3.3.3.3)
        清空规则并写入规则		/DNDT:凡是访问3.3.3.3/网关的全部转化成1.1.1.1
[ root@localhost network-scripts]# iptables -F
[ root@localhost network-scripts]# iptables -t nat -A PREROUTING -p tcp --dport 8-jDNAT --to-destination 1.1.1.1

server3:(外网4.4.4.4)
        访问web服务器
[ root@localhost httpd]# wget 1.1.1.1
--2022-10-30 19: 10:59-- http:/l1.1.1.1/
connecting to 1.1.1.1:80. . . connected .
HTTP request sent, awaiting response. . . 403 Forbidden
2022-10-30 19: 10:59 ERROR 403: Forbidden.