【运维知识进阶篇】iptables防火墙详解(iptables执行过程+表与链概述+iptables命令参数+配置filter表规则+NAT表实现共享上网、端口转发、IP映射)(一)

本文涉及的产品
云防火墙,500元 1000GB
公网NAT网关,每月750个小时 15CU
简介: 【运维知识进阶篇】iptables防火墙详解(iptables执行过程+表与链概述+iptables命令参数+配置filter表规则+NAT表实现共享上网、端口转发、IP映射)

这篇文章给大家介绍下iptables防火墙,防火墙大致分三种,分别是硬件、软件和云防火墙。硬件的话部署在企业网络的入口,有三层路由的H3C、华为、Cisco(思科),还有深信服等等;软件的话一般是开源软件,写在网站内部,最常见的有iptables(写入Linux内核)和firewalld(CentOS7有的),云防火墙就是阿里云业务的防火墙安全组等等。

名词解释

在介绍防火墙之前,我们先了解几个名词

容器:可以存放东西

表(table):存放链的容器

链(chain):存放规则的容器

规则(policy):准许或拒绝规则

这几个像俄罗斯套娃那样环环相套!

iptables执行过程

NetFilter框架

最底层是网络接口层,网络接口层上面是网络层,网络层部署了NetFilter(网络过滤框架)

网络层上面部署了TCP、UDP传输层,这一层部署了Filter表、NAT表、Mangle表,表种存放要检查的条件和操作,这些都是内核层,再往上就是用户层,也就是应用层,可以设置iptables命令。

Linux服务器双网卡路由器

从物理层和数据链路层进入先通过PREROUTING链,进入路由判决,如果可以进入会通过INPUT链进入TCP、UDP,再进入应用层,由应用层再返回到TCP、UDP,通过OUTPUT链进入路由判决,再通过POSTROUTING链传输到物理层和数据链路层出来。

如果在路由判决那里不能进入的话,则会通过FORWARD链传输到出口的路由判决,在通过POSTROUTING链进入物理层和数据链路层传输出来。

表与链

iptables是4表5链,4表是filter表、nat表、raw表、mangle表,5链是input、pouput、forward、prerouting、postrouting

filter表有input链、output链、forward链

nat表有prerouting链、output链、postrouting链

mangle表有prerouting链、forward链、input链、output链、postrouting链

1、filter表

负责流量进出,屏蔽或准许端口IP

filter表

主要和主机自身相关,真正负责主机防火墙功能的(过滤流入与流出主机数据包)filter标识iptables默认使用的表,这个表定义了三个链。企业工作场景:主机防火墙

INPUT 负责过滤所有目标地址是本机地址的数据包,通俗说就是过滤进入主机的数据包
FORWARD 负责转发流经主机的数据包,起转发的作用,和NAT关系很大,有专门的LVS NAT模式,net.ipv4.ip_forward=0
OUTPUT 处理所有源地址是本机地址的数据包,通俗说就是从主机发送出去的数据包

2、NAT表

双网卡的,负责接受到后转发,类似于路由器,可以实现NAT功能:共享上网(内网服务器上外网)、端口映射和ip映射

NAT

负责网络地址转换,即来源与目的IP地址和端口的转换。

应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务

工作场景:

1、用于企业路由(zebra)或网关(iptables),共享上网(postrouting)

2、做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(prerouting)

3、web,单个端口的映射,直接映射80端口(prerouting),这个表定义了3个链,nat功能相当于网络的acl控制,和网络交换机acl类似。

OUTPUT 和主机放出去的数据包有关,改变主机发出数据包的目的地址
PREROUTING

在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等

就是收信时,根据规则重写收件人的地址

例如:把公网IP映射到局域网的服务器上,如果是web服务,可以把80转换为局域网的服务器9000端口上10.0.0.61:80(目标端口)----nat----10.0.0.7:22

POSTROUTING

在数据包离开防火墙时进行路由判断之后执行的规则,作用是改变数据包的源地址,源端口等

写好发件人的地址,要让家人的回信时能够有地址可以回

例如:默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址

生产应用:局域网共享上网

3、Mangle表

存放头部信息

环境准备及命令

准备Ansible(10.0.0.61,172.16.1.61)和Web01(10.0.0.7、172.16.1.7)两台主机

安装iptables

[root@Ansible ~]# yum install -y iptables-services

查看iptables服务的配置文件

1. [root@Ansible ~]# rpm -ql iptables-services
2. /etc/sysconfig/ip6tables
3. /etc/sysconfig/iptables        #防火墙的配置文件
4. /usr/lib/systemd/system/ip6tables.service
5. /usr/lib/systemd/system/iptables.service        #防火墙服务配置文件(命令)
6. /usr/libexec/initscripts/legacy-actions/ip6tables
7. /usr/libexec/initscripts/legacy-actions/ip6tables/panic
8. /usr/libexec/initscripts/legacy-actions/ip6tables/save
9. /usr/libexec/initscripts/legacy-actions/iptables
10. /usr/libexec/initscripts/legacy-actions/iptables/panic
11. /usr/libexec/initscripts/legacy-actions/iptables/save
12. /usr/libexec/iptables
13. /usr/libexec/iptables/ip6tables.init
14. /usr/libexec/iptables/iptables.init

将防火墙相关的模块、加载到内核中

1. [root@Ansible ~]# modprobe ip_tables
2. [root@Ansible ~]# modprobe iptable_filter
3. [root@Ansible ~]# modprobe iptable_nat
4. [root@Ansible ~]# modprobe ip_conntrack
5. [root@Ansible ~]# modprobe ip_conntrack_ftp
6. [root@Ansible ~]# modprobe ip_nat_ftp
7. [root@Ansible ~]# modprobe ipt_state

永久加入,写进开机自启动

1. cat >>/etc/rc.local<<EOF
2. modprobe ip_tables
3. modprobe iptable_filter
4. modprobe iptable_nat
5. modprobe ip_conntrack
6. modprobe ip_conntrack_ftp
7. modprobe ip_nat_ftp
8. modprobe ipt_state  
9. EOF

列出三表相关的内核模块,lsmod是列出系统当前载入的所有内核模块

1. [root@Ansible ~]# lsmod |egrep 'filter|nat|ipt'
2. nf_nat_ftp             12809  0
3. nf_conntrack_ftp       18478  1 nf_nat_ftp
4. iptable_nat            12875  0
5. nf_nat_ipv4            14115  1 iptable_nat
6. nf_nat                 26583  2 nf_nat_ftp,nf_nat_ipv4
7. nf_conntrack          139264  6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
8. iptable_filter         12810  0
9. ip_tables              27126  2 iptable_filter,iptable_nat
10. libcrc32c              12644  3 xfs,nf_nat,nf_conntrack

关闭firewalld,启用iptables,并设置开机自启动

1. [root@Ansible ~]# systemctl stop firewalld
2. [root@Ansible ~]# systemctl disable firewalld
3. [root@Ansible ~]# systemctl start iptables.service
4. [root@Ansible ~]# systemctl enable iptables.service
5. Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.

列出iptables所有规则

1. [root@Ansible ~]# iptables -nL
2. Chain INPUT (policy ACCEPT)        #链默认规则
3. target     prot opt source               destination
4. ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED 
5. ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0          #规则 
6. ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0
7. ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
8. REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
9. 
10. Chain FORWARD (policy ACCEPT)        #链默认规则
11. target     prot opt source               destination
12. REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited
13. 
14. Chain OUTPUT (policy ACCEPT)        #链默认规则
15. target     prot opt source               destination

iptables命令参数

参数 含义
-L 显示表中的所有规则
-n 不要把端口或ip反向解析为名字
-t 指定表,不指定默认是filter表
-A append追加,加入准许类规则
-D delete删除,-D INPUT 1
-I insert拒绝类规则放在所有规则的最上面
-p 协议protocal tcp/udp/icmp/all
--dport 目标端口dest destination指定端口加上协议 -p tcp
--sport 源端口,source源
-d --destination 目标IP
-m 指定模块 multiport
-i input输入的时候,从哪个网卡进来
-o output输出的时候,从哪个网卡出去
-j

满足条件后的工作:DROP/ACCEPT/REJECT

DROP REJECT拒绝

DROP把数据丢掉,不会返回信息给用户

REJECT拒绝,返回拒绝信息

-F flush 清楚所有规则,不会处理默认的规则
-X 删除用户自定义的链
-Z 链的计数器清零(数据包计数器和数据包字节计数器)

配置filter表规则

正式配置之前,先备份,清空规则

1. [root@Ansible ~]# iptables -F
2. [root@Ansible ~]# iptables -X
3. [root@Ansible ~]# iptables -Z
4. 
5. [root@Ansible ~]# iptables -nL
6. Chain INPUT (policy ACCEPT)
7. target     prot opt source               destination
8. 
9. Chain FORWARD (policy ACCEPT)
10. target     prot opt source               destination
11. 
12. Chain OUTPUT (policy ACCEPT)
13. target     prot opt source               destination

1、禁止访问22端口

1. [root@Ansible ~]# iptables -t filter -I INPUT -p tcp   --dport 22  -j DROP
2. [root@Ansible ~]# 
3. Connection closed by foreign host.
4. 
5. Disconnected from remote host(Linux86-10.0.0.61-Ansible) at 22:43:23.
6. 
7. Type `help' to learn how to use Xshell prompt.
8. [c:\~]$ 
9.

删除规则

1. Connecting to 10.0.0.61:22...
2. Connection established.
3. To escape to local shell, press Ctrl+Alt+].
4. 
5. Last login: Sat May  6 22:44:26 2023
6. [root@Ansible ~]#


目录
打赏
0
0
0
0
39
分享
相关文章
VM虚拟机全版本网盘+免费本地网络穿透端口映射实时同步动态家庭IP教程
本文介绍了如何通过网络穿透技术让公网直接访问家庭电脑,充分发挥本地硬件性能。相比第三方服务受限于转发带宽,此方法利用自家宽带实现更高效率。文章详细讲解了端口映射教程,包括不同网络环境(仅光猫、光猫+路由器)下的设置步骤,并提供实时同步动态IP的两种方案:自建服务器或使用三方API接口。最后附上VM虚拟机全版本下载链接,便于用户在穿透后将服务运行于虚拟环境中,提升安全性与适用性。
解决ssh: connect to host IP port 22: Connection timed out报错(scp传文件指定端口)
解决 `ssh: connect to host IP port 22: Connection timed out` 报错涉及检查 SSH 服务状态、防火墙配置、网络连通性和主机名解析等多个方面。通过逐步排查上述问题,并在 `scp` 命令中正确指定端口,可以有效解决连接超时的问题,确保文件传输的顺利进行。希望本文提供的解决方案能帮助您快速定位并解决该错误。
914 3
解决ssh: connect to host IP port 22: Connection timed out报错(scp传文件指定端口)
通过这些步骤和方法,您可以有效解决“ssh: connect to host IP port 22: Connection timed out”问题,并顺利使用 `scp`命令传输文件。
2994 7
HTTPS为什么可以穿越NAT端口映射设备
HTTPS能穿越NAT端口映射设备的原因在于,NAT设备仅在IP和端口层面进行地址转换,不对应用层协议(如TLS)的内容进行解析或干预。因此,HTTPS的加密通信可在客户端与服务器间直接建立,NAT设备充当透明中介,确保数据包正确路由,而不涉及加密或认证过程。这样即使没有在NAT设备上配置证书,HTTPS连接也能顺利建立并保持安全。
122 6
ip和ip网段攻击拦截系统-绿叶结界防火墙系统shell脚本
这是一个名为“小绿叶技术博客扫段攻击拦截系统”的Bash脚本,用于监控和拦截TCP攻击。通过抓取网络数据包监控可疑IP,并利用iptables和firewalld防火墙规则对这些IP进行拦截。同时,该系统能够查询数据库中的白名单,确保合法IP不受影响。此外,它还具备日志记录功能,以便于后续分析和审计。
131 6
Python 网络编程:端口检测与IP解析
本文介绍了使用Python进行网络编程的两个重要技能:检查端口状态和根据IP地址解析主机名。通过`socket`库实现端口扫描和主机名解析的功能,并提供了详细的示例代码。文章最后还展示了如何整合这两部分代码,实现一个简单的命令行端口扫描器,适用于网络故障排查和安全审计。
115 0
Linux安全运维--一篇文章全部搞懂iptables
Linux安全运维--一篇文章全部搞懂iptables
111 1
【Azure 应用服务】App Service/Azure Function的出站连接过多而引起了SNAT端口耗尽,导致一些新的请求出现超时错误(Timeout)
【Azure 应用服务】App Service/Azure Function的出站连接过多而引起了SNAT端口耗尽,导致一些新的请求出现超时错误(Timeout)
在Linux中,如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0。
在Linux中,如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.16.1,其中本地网卡eth0。