1.iptables概述

Linux 的包过滤功能,即 Linux 防火墙,它由 netfilter 和 iptables 两个组件组成。netfilter 位于内核空间,由一些信息包过滤表组成,这些表包含内核用来控制信息包过滤处理的规则集。iptables 是一个命令行工具,位于用户空间,它使得插入、修改和删除信息包过滤表中的规则变得容易。

我们知道 iptables 是按照规则来办事的,规则其实就是网络管理员预定义的条件,规则一般的定义为”如果数据包头符合这样的条件,就这样处理这个数据包”。规则存储在内核空间的信息包过滤表中,这些规则分别指定了源地址、目的地址、传输协议(如:TCP、UDP、ICMP)和服务类型(如:HTTP、FTP和 SMTP)等。当数据包与规则匹配时,iptables 就根据规则所定义的方法来处理这些数据包,如放行(ACCEPT)、拒绝(REJECT)和丢弃(DROP)等。配置防火墙的主要工作就是添加、修改和删除这些规则。

当客户端访问服务器的服务时,客户端发送报文到服务器的网卡,而 TCP/IP 协议栈是属于内核的一部分,所以客户端的信息会通过内核的 TCP 协议传输到用户空间中的服务中,而此时客户端报文的目标终点(destination)为服务所监听的套接字(IP:PORT),当服务需要响应客户端请求时,服务发出的响应报文的目标终点则为客户端,这个时候服务所监听的IP与端口反而变成了原点(source)。netfilter 才是真正的防火墙,它是内核的一部分,如果我们想要防火墙能够达到”防火”的目的,则需要在内核中设置关卡,所有进出的报文都要通过这些关卡,经过检查后,符合放行条件的才能放行,符合阻拦条件的则需要被阻止,于是就出现了 INPUT 关卡和 OUTPUT 关卡。然而这些关卡在 iptables 中并不被称为”关卡”,而是被称为”链”。

官网

2.iptables结构

iptables 由表(table)、链(chain)和规则(rule)组成,其中表包含链,链包含规则

filter:这里面的链条,规则,可以决定一个数据包是否可以到达目标进程端口
三个链:INPUT、FORWARD、OUTPUT
内核模块:iptables_filter

mangle: 这里面的链条,规则,可以修改数据包的内容,比如ttl
五个链:PREROUTING、POSTROUTING、INPUT、OUTPUT、FORWARD
内核模块:iptable_mangle

nat:这里面的链条,规则,可以修改源和目标的ip地址,网络地址转换,例如端口转发
三个链:PREROUTING、POSTROUTING、OUTPUT
内核模块:iptable_nat

raw:这里面的链条,规则,能基于数据包的状态进行规则设定
两个链:OUTPUT、PREROUTING
内核模块:iptable_raw

INPUT链:当收到访问防火墙本机地址的数据包(入站)时,应用此链中的规则。

OUTPUT链:当防火墙本机向外发送数据包(出站)时,应用此链中的规则。

FORWARD链:当接收到需要通过防火墙中转发送给其他地址的数据包(转发)是,应用测链中的规则。

PREROUTING链:在对数据包做路由选择之前,应用测链中的规则(目标地址转换)。

POSTROUTING链:在对数据包做路由选择之后,应用此链中的规则(源地址转换)。

规则表之间的优先顺序

Raw——mangle——nat——filter

入站数据流向

从外界到达防火墙的数据包,先被PREROUTING规则链处理(是否修改数据包地址等),之后会进行路由选择(判断该数据包应该发往何处),如果数据包 的目标主机是防火墙本机(比如说Internet用户访问防火墙主机中的web服务器的数据包),那么内核将其传给INPUT链进行处理(决定是否允许通 过等),通过以后再交给系统上层的应用程序(比如Apache服务器)进行响应

转发数据流向

来自外界的数据包到达防火墙后,首先被PREROUTING规则链处理,之后会进行路由选择,如果数据包的目标地址是其它外部地址(比如局域网用户通过网 关访问QQ站点的数据包),则内核将其传递给FORWARD链进行处理(是否转发或拦截),然后再交给POSTROUTING规则链(是否修改数据包的地 址等)进行处理

出站数据流向

防火墙本机向外部地址发送的数据包(比如在防火墙主机中测试公网DNS服务器时),首先被OUTPUT规则链处理,之后进行路由选择,然后传递给POSTROUTING规则链(是否修改数据包的地址等)进行处理

3.iptables执行过程

防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的。

如果匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT),数 据包就不再向下匹配新的规则。

如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配默认规则得到明确的阻止还是通过。

防火墙的默认规则是所有规则都匹配完才会匹配的。

4.iptables命令的管理控制选项

-A:在指定链的末尾添加(append)一条新的规则
-D:删除(delete)指定链中的某一条规则,可以按规则序号和内容删除
-I:在指定链中插入(insert)一条新的规则,默认在第一行添加
-R:修改、替换(replace)指定链中的某一条规则,可以按规则序号和内容替换
-L:列出(list)指定链中所有的规则进行查看
-E:重命名用户定义的链,不改变链本身
-F:清空(flush)指定链中的所有规则,默认清空表中所有链的内容
-N:新建(new-chain)一条用户自己定义的规则链
-X:删除指定表中用户自定义的规则链(delete-chain)
-P:设置指定链的默认策略(policy)
-Z:将所有表的所有链的字节和数据包计数器清零
-n:使用数字形式(numeric)显示输出结果
-v:查看规则表详细信息(verbose)的信息
-V:查看版本(version)
-h:获取帮助(help)
-t:指定表,不指定默认的filter表
-j:满足条件后的动作:DROP/ACCEPT/REJECT DROP REJECT拒绝 DROP 把数据丢掉 不会返回信息给用户 REJECT 拒绝 返回拒绝信息

iptables条件匹配

-p,–protocol:匹配指定的协议(可以是tcp、udp、icmp)
-s,–src,–source:匹配数据包中的源IP地址
-d,–dst,–dstination:匹配数据包中的目的IP地址
-i,–in-interface:以数据包进入本地所使用的网络接口进行匹配
-o,–out-interface:以数据包离开本地所使用的网络接口进行匹配
-f,–fragment: 匹配一个被分片的包的第二片或及以后的部分
–sport,–source-port:匹配基于TCP协议数据包的源端口
–dport,–destination-port:匹配基于TCP协议数据包的目的端口
–tcp-flags:匹配指定的TCP标记
–syn:匹配那些SYN标记被设置而ACK和RST标记没有设置的数据包
–tcp-option:匹配TCP协议数据包的头部信息
–icmp-type:根据ICMP类型匹配数据包, 针对-p icmp
–linit:为linit match设置最大平均匹配速率,也就是单位时间内linit match可以匹配几个包,这个匹配操作必须由-m limit明确指定才能使用
–limit-burst:待匹配包初始个数的最大值:若前面指定的极限还没达到这个数值,则概数字加1.默认值为5
–mac-source:基于数据包的MAC源地址进行匹配。这个匹配操作必须由-m mac明确指定才能使用
–mark:以数据包被设置的mark值来匹配。这个匹配操作必须由-m mark明确指定才能使用
–uid-owner:按生成数据包的用户的ID(UID)来匹配外出的包。这个匹配操作必须由-m owner明确指定才能使用
–gid-owner:按生成数据包的用户所在组的ID(GID)来匹配外出的包。这个匹配操作必须由-m owner明确指定才能使用
–pid-owner:按生成数据包的进程的ID(UID)来匹配外出的包。这个匹配操作必须由-m owner明确指定才能使用
–sid-owner:按生成数据包的会话的ID(SID)来匹配外出的包。这个匹配操作必须由-m owner明确指定才能使用
–state:指定要匹配数据包的状态,一共有4种状态可以使用:INVALID、ESTABLISHED、NEW和RELATED。这个匹配操作必须由-m state明确指定才能使用
–tos:根据TOS字段匹配数据包,这个匹配操作必须由-m tos明确指定才能使用
–ttl:根据TTL的值来匹配数据包,这个匹配操作必须由-m ttl明确指定才能使用
–line-numbers:当列表显示规则时,在每个规则的前面加上行号,与该规则在链中的位置相对应

iptables动作/目标

ACCEPT:允许符合条件的数据包通过
DROP:拒绝符合条件的数据包通过
LOG:用来记录与数据包相关的信息
MARK:设置mark值,这个值是一个无符号的整数
MASQUERADE:和SNAT的作用相同,区别在于它不需要指定–to-source
SNAT:源网络地址转换
DNAT:目的网络地址转换
REDIRECT:转发数据包一另一个端口
REJECT:REJECT和DROP都会将数据包丢弃,区别在于REJECT除了丢弃数据包外,还向发送者返回错误信息
RETURN:使数据包返回上一层
TOS:用来设置IP头部中的Type Of Service字段
TTL:用于修改IP头部中Time To Live字段的值
ULOG:ULOG可以在用户空间记录被匹配的包的信息,这些信息和整个包都会通过netlink socket被多播
QUEUE:为用户空间的程序或应用软件管理包队列
MIRROR:颠倒IP头部中的源目地址,然后再转发包

5.环境准备

准备机器

[root@web01 ~]$ hostname -I
10.0.0.45 172.16.1.45

[root@web02 ~]$ hostname -I
10.0.0.145 172.16.1.145

[root@lb01 ~]$ hostname -I
10.0.0.163 10.0.0.3 172.16.1.163

安装

[root@lb01 ~]$ yum install -y iptables-services

目录详情

[root@lb01 ~]$ rpm -ql iptables-services
/etc/sysconfig/iptables                           #防火墙的配置件
/usr/lib/systemd/system/iptables.service     #防火墙服务配置文件(命令)

[root@lb01 ~]$ rpm -ql iptables

/usr/sbin/iptables                  #iptables 命令 添加/删除/查看 规则(4表伍链)
/usr/sbin/iptables-save          #iptables规则 输出(保存)
/usr/sbin/iptables-restore      #恢复

防火墙相关模块 加载到内核中
写入到开机自启动

[root@lb01 ~]$ cat /etc/rc.local

modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe iptable_raw
modprobe iptable_mangle
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

启动

[root@lb01 ~]$ systemctl start iptables.service
[root@lb01 ~]$ systemctl enable iptables.service
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.

检查模块是否开启

[root@lb01 ~]$ lsmod | egrep ‘nat|filter’
nf_nat_ftp 12809 0
nf_conntrack_ftp 18478 1 nf_nat_ftp
iptable_nat 12875 0
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26583 2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack 139264 8 nf_nat_ftp,ip_vs,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter 12810 1
ip_tables 27126 4 iptable_filter,iptable_mangle,iptable_nat,iptable_raw
libcrc32c 12644 4 xfs,ip_vs,nf_nat,nf_conntrack

查看规则,默认查看的是filter表

[root@lb01 ~]$ iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all — 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT icmp — 0.0.0.0/0 0.0.0.0/0
ACCEPT all — 0.0.0.0/0 0.0.0.0/0
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
REJECT all — 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target prot opt source destination
REJECT all — 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain L (0 references)
target prot opt source destination

查看指定表中的规则

[root@lb01 ~]$ iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination

Chain INPUT (policy ACCEPT)
target prot opt source destination

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain POSTROUTING (policy ACCEPT)
target prot opt source destination

6.案例

案例1

禁止访问22端口
(这个时候像Xshell就连接不上)

[root@lb01 ~]$ iptables -t filter -A INPUT -p tcp –dport 22 -j DROP

查看规则并加上序号

iptables -t filter  -nL   –line-number

删除规则
(根据序号删除)

iptables -t filter  -D INPUT  1

案例2

封ip屏蔽某个ip

[root@lb01 ~]$ iptables -I INPUT -s 10.0.0.45 -j DROP

查看

[root@lb01 ~]$ iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
DROP all — 10.0.0.45 0.0.0.0/0

测试

[root@web01 ~]$ ping 10.0.0.163

案例3

禁止网段连入

[root@lb01 ~]$ iptables -I INPUT -s 10.0.0.0/24 -j DROP

案例4

屏蔽ip加端口

[root@lb01 ~]$ iptables -I INPUT -s 10.0.0.45 -p tcp –dport 22 -j DROP

案例5

只允许指定网段连入

方法1(! 取反)

[root@lb01 ~]$ iptables -I INPUT ! -s 10.0.0.0/24 -j DROP

方法1(修改链默认规则 修改为拒绝 添加准许)

[root@lb01 ~]$ iptables -I INPUT -s 10.0.0.0/24 -j ACCEPT

修改默认规则

[root@lb01 ~]$ iptables -P INPUT DROP

测试完成后,修改回去

[root@lb01 ~]$ iptables  -P INPUT ACCEPT

案例6

指定多个端口

添加模块

-m:multiport 指定多端口号

添加端口

[root@lb01 ~]$ iptables -A INPUT -m multiport -p tcp –dport 80,443 -j ACCEPT
[root@lb01 ~]$ iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT tcp — 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443

如果是连续的端口可以不加上-m multiport

[root@lb01 ~]$ iptables -A INPUT -p tcp –dport 1:1024 -j ACCEPT

案例7

匹配ICMP类型

ICMP(Internet Control Message Protocol)Internet控制报文协议ping

通过防火墙规则 控制是否可以ping

[root@lb01 ~]$ iptables -A INPUT -p icmp –icmp-type 8 -j DROP

“Echo-Request”(代码为 8)表示 请求
“Echo-Reply”(代码为 0)表示 回显

通过内核参数控制禁止被ping

[root@lb01 ~]$ vim /etc/sysctl.conf

sysctl用来设置系统的核心参数 -p立即生效

[root@lb01 ~]$ sysctl -p
net.ipv4.icmp_echo_ignore_all = 1

案例8

匹配网络状态(TCP/IP连接状态)

NEW:已经或将启动新的连接
ESTABLISHED:已建立的连接
RELATED:正在启动的新连接
INVALID:非法或无法识别的

[root@lb01 ~]$ iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT

案例9

限制并发及速率

[root@lb01 ~]$ iptables -I INPUT -p icmp -m limit –limit 10/minute –limit-burst 5 -j ACCEPT

–limit 10/minute:每分钟只能有10个数据包 每6秒生成

–limit-burst n:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时,

不指定默认为5

7.防火墙规则的保存与恢复

默认输出到屏幕

[root@lb01 ~]$ iptables-save

追加上文件

[root@lb01 ~]$ iptables-save > /etc/sysconfig/iptables
[root@lb01 ~]$ cat /etc/sysconfig/iptables

删除规则

[root@lb01 ~]$ iptables -F

重启iptables,查看规则是否恢复

[root@lb01 ~]$ systemctl restart iptables

[root@lb01 ~]$ iptables-restore </etc/sysconfig/iptables

[root@lb01 ~]$ iptables -nL

8.nat表规则

共享上网

是一种网络地址转换技术,可以将私有IP地址转换为公网IP地址,让多台设备共享一个公网IP地址上网。

在实现NAT共享上网时,需要一个NAT路由器,将其作为网络的出口设备。NAT路由器会为内部设备分配私有IP地址,并将其转换为公网IP地址,从而实现多台设备共享一个公网IP地址上网。

具体实现过程如下:

NAT路由器将内部设备的IP地址转换为公网IP地址。
内部设备将数据发送到NAT路由器,NAT路由器将其转发到公网上。
公网服务器接收到请求后,将响应数据发送到NAT路由器。
NAT路由器将响应数据转发给内部设备。

通过NAT共享上网,可以有效利用公网IP地址资源,降低网络成本,提高网络安全性。但是,NAT共享上网也存在一些问题,比如可能会影响网络性能,限制了对内部设备的访问等。

环境准备

web01

web01 172.16.1.45 (只保留这个网卡), eth0网卡关闭(ONBOOT=no)

[root@web01 ~]$ vim /etc/sysconfig/network-scripts/ifcfg-eth0

[root@web01 ~]$ systemctl restart network
[root@web01 ~]$ ip a

lb01

来自于172.16.1.0/24网段的ip,通过防火墙的nat表的POSTROUTING链
源ip被修改为 10.0.0.163 通过SNAT方式

[root@lb01 ~]$ iptables -t nat -I POSTROUTING -s 172.16.1.0/24 -j SNAT –to-source 10.0.0.163

web01

[root@web01 ~]$ tail -1 /etc/sysconfig/network-scripts/ifcfg-eth1
GATEWAY=172.16.1.163

lb01添加内核

[root@lb01 ~]$ tail -1 /etc/sysctl.conf
net.ipv4.ip_forward =1

[root@lb01 ~]$ sysctl -p
net.ipv4.ip_forward = 1

查看nat表

[root@lb01 ~]$ iptables -nL -t nat

删除nat表

[root@lb01 ~]$ iptables -t nat -D PREROUTING 1

测试

[root@web01 ~]$ ping 172.16.1.163

[root@web01 ~]$ ping baidu.com

实现端口转发

lb01

[root@lb01 ~]$ iptables -t nat -I PREROUTING -p tcp –dport 9000 -j DNAT –to-destination 172.16.1.45:22

测试

[c:\~]$ ssh 10.0.0.163 9000

实现IP转发

lb01

[root@lb01 ~]$ ip addr add 10.0.0.9/24 dev eth0 label eth0:0

[root@lb01 ~]$ iptables -t nat -I PREROUTING -d 10.0.0.9 -j DNAT –to-destination 172.16.1.45

测试

[c:\~]$ ssh 10.0.0.9

作者 dmxsp

发表回复

您的电子邮箱地址不会被公开。