linux 防火墙iptables

iptables 是 Linux 中比较底层的网络服务,它控制了 Linux 系统中的网络操作,CentOS 中的 firewalld 和 Ubuntu 中的 ufw 都是在 iptables 之上构建的,只为了简化 iptables 的操作。同时,iptables 不仅仅是防火墙这么简单,它基本上能实现你在 linux 上对于网络的所有需求,最常用的就是数据转发、网络地址转换等,例如 LVS 可以利用 Iptables 实现SNAT模式。

1、iptables介绍

1.1)iptables的发展:

iptables的前身叫ipfirewall (内核1.x时代),这是一个作者从freeBSD上移植过来的,能够工作在内核当中的,对数据包进行检测的一款简易访问控制工具。但是ipfirewall工作功能极其有限(它需要将所有的规则都放进内核当中,这样规则才能够运行起来,而放进内核,这个做法一般是极其困难的)。当内核发展到2.x系列的时候,软件更名为ipchains,它可以定义多条规则,将他们串起来,共同发挥作用;现在又叫做iptables,可以将规则组成一个列表,实现绝对详细的访问控制功能。

netfilter是什么?

从ipchains开始,允许在用户空间中定义各种规则,ipchains、iptables是用来定义这些规则的工具,本身并不算是防火墙。它们定义的规则,可以让在内核空间当中的netfilter来读取,并且实现让防火墙工作。而放入内核的地方必须要是特定的位置,必须是tcp/ip的协议栈经过的地方。而这个tcp/ip协议栈必须经过的地方,可以实现读取规则的地方就叫做 netfilter(网络过滤器),它是Linux内核中实现包过滤的内部结构,真正的防火墙。

1.2)iptables工作机制:

这是NetFilter规定的五个规则链,任何一个数据包,只要经过本机,必将经过这五个链中的其中一个链。

  1. PREROUTING:路由前
  2. INPUT:数据包流入口
  3. FORWARD:转发管卡
  4. OUTPUT:数据包出口
  5. POSTROUTING:路由后

  1. 一个数据包进入网卡时,它首先进入PREROUTING链,内核根据数据包目的IP判断是否需要转发出去。
  2. 如果数据包就是进入本机的,它就会沿着图向下移动,到达INPUT链。数据包到了INPUT链后,任何进程都会收到它。
  3. 本机上运行的程序可以发送数据包,这些数据包会经 过OUTPUT链,然后到达POSTROUTING链输出。
  4. 如果数据包是要转发出去的,且内核允许转发,数据包就会如图所示向右移动,经过 FORWARD链,然后到达POSTROUTING链输出。

1.3)规则、表、链:

1)规则(rules):

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

2)链(chains):

每一条链中可以有一条或数条规则。当一个数据包到达一个链时,iptables就会从链中第一条规则开始检查,看该数据包是否满足规则所定义的条件。如果满足,系统就会根据该条规则所定义的方法处理该数据包;否则iptables将继续检查下一条规则,如果该数据包不符合链中任一条规则,iptables就会根据该链预先定义的默认策略来处理数据包。

说明:除了INPUT、OUTPUT、FORWARD、PREROUTING 以及 POSTROUTING这几个预先设置的chain之外,还可以自定义chain

3)表(tables):

表(tables)提供特定的功能,iptables内置了4个表,即raw表、filter表、nat表和mangle表,分别用于实现包过滤,网络地址转换和包重构的功能。

  • RAW表:是自1.2.9以后版本的iptables新增的表,主要用于决定数据包是否被状态跟踪机制处理。在匹配数据包时,raw表的规则要优先于其他表。包含两条规则链——OUTPUT、PREROUTING
  • mangle表:主要用于修改数据包的TOS(Type Of Service,服务类型)、TTL(Time To Live,生存周期)等,应用并不广泛。在内核版本2.4.18 后的linux版本中该表包含的链为INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)POSTROUTING链(修改即将出去的数据包),PREROUTING链(修改即将到来的数据包)
  • nat表:主要用于网络地址转换NAT,该表可以实现一对一,一对多,多对多等NAT 工作,iptables就是使用该表实现共享上网的,NAT表包含了PREROUTING链(修改即将到来的数据包),POSTROUTING链(修改即将出去的数据包),OUTPUT链(修改路由之前本地生成的数据包)
  • filter表:主要用于过滤数据包,该表根据系统管理员预定义的一组规则过滤符合条件的数据包。对于防火墙而言,主要利用在filter表中指定的规则来实现对数据包的过滤。Filter表是默认的表,如果没有指定哪个表,iptables 就默认使用filter表来执行所有命令,filter表包含了INPUT链(处理进入的数据包),RORWARD链(处理转发的数据包),OUTPUT链(处理本地生成的数据包)在filter表中只能允许对数据包进行接受,丢弃的操作,而无法对数据包进行更改

规则表之间的优先顺序:Raw>>>>mangle>>>>nat>>>>filter

2、iptables命令

iptables命令的一般格式:iptables [commands] [options]

2.1)commands:

1)规则相关:

  • -P --policy <链名> 定义默认策略
  • --list -L [chain [rulenum]]: 查看chain的规则信息
  • --append -A chain:在指定chain的规则列表最后增加1条规则
  • --insert -I chain [rulenum]:在指定chain的规则列表中,指定位置插入1条规则,默认rulenum位置是1
  • --delete -D chain:在指定chain的规则列表中,删除指定位置或匹配的规则
  • --flush -F [chain]:Delete all rules in chain or all chains

2)chain相关:

  • --new -N chain :Create a new user-defined chain
  • --delete-chain -X [chain] :Delete a user-defined chain
  • -N --new <链名> 创建自定义链
  • -X --delete-chain <链名> 删除自定义链

2.2)options:

  • –-line-number:显示规则的序列号,这个参数在删除或修改规则时会用到
  • -v:verbose mode 详细模式
  • -n:输出数字形式的地址和端口
  • --table -t table:要操作的表,默认是filter表
  • --jump -j target:指定规则的动作(见2.4)
  • --protocol -p proto:指定protocol by number or name, eg. `tcp'
  • --source -s address[/mask][...]:原ip地址设置
  • --destination -d address[/mask][...]:目的ip地址

2.3)其他:

规则中有很多动作,例如:

1)ACCEPT、DROP、LOG:

  • ACCEPT:允许数据包通过
  • DROP:丢弃数据包不予处理,进行完此处理动作后,将不再比对其它规则,直接中断过滤程序
  • LOG:在/var/log/messages文件中记录日志信息,然后将数据包传递给下一条规则
iptables -A INPUT -p tcp -j LOG --log-prefix "input packet"

2)REJECT:

拦阻该数据包,并返回数据包通知对方,可以返回的数据包有几个选择:ICMP port-unreachable、ICMP echo-reply 或是tcp-reset(这个数据包包会要求对方关闭联机),进行完此处理动作后,将不再比对其它规则,直接中断过滤程序。范例如下:

iptables -A  INPUT -p TCP --dport 22 -j REJECT --reject-with ICMP echo-reply

3)SNAT:

在路由之后,做源地址转换,局域网中的主机访问外网通常使用该技术。

例如:A--->B--->C (比如我们想要访问百度,淘宝等网站)

 1.企业内部的主机A想访问互联网上的主机C,首先将请求数据包(源:ipA,目标:ipC)发送到防火墙所在主机B;

说明:B机:作为NAT转换机,两个网卡都有。IP:172.17.123.224 192.168.199.138,
需要在A机器上添加路由记录,route add default gw 192.168.199.138(B机器的外网ip)

2.B收到后将数据包源地址改为本机公网网卡的ip(源:ipA,目标:ipB),然后经互联网发送给C; 

说明:
需要在B机器上开启转发功能:echo 1 > /proc/sys/net/ipv4/ip_forward
在B机器防火墙的postrouting chain上设置转换源地址策略,  
iptables -t nat -A POSTROUTING -p tcp-o eth0 -j SNAT --to-source 192.168.10.15-192.168.10.160:2100-3200

3.C收到后将回应包(源:ipC,目标:ipB)转发给C的路由器,经互联网将回应包转发给B;
4.B收到回应包后修改其目的地址,即回应包改为(源:ipC,目标:ipA)然后将数据包转发给A。 

4)DNAT:
在路由之前,做目的地地址转换。当内部需要提供对外服务时(如对外发布web网站),外部地址发起主动连接,由路由器或者防火墙上的网关接收这个连接,然后将连接转换到内部。
此过程是由带有公网IP的网关替代内部服务来接收外部的连接,然后在内部做地址转换,此转换称为DNAT,主要用于内部服务对外发布。
例如:C--->B--->A (比如对外发布web网站)
1.互联网主机C想访问企业内部的web服务器A,但A的地址是私有地址,无法直接访问。此时,C可以访问防火墙的公网地址,
2.C的请求数据包(源:ipC,目标:ipB)到达防火墙B后,在B的prerouting上将请求数据包的目标地址进行修改,并将数据包(源:ipC,目标:ipA)发送给A。 

说明:在在NAT转换机上:iptables -t nat -I PREROUTING 1 -d 172.17.123.224 -j DNAT --to-destination 192.168.199.142 转换目标地址

3.A收到后进行回复发送响应包(源:ipA,目的ipC)到防火墙,防火墙收到后对数据包源地址进行修改,并将响应包(源:ipB,目标:ipC)给C。

5)REDIRECT:
在路由之后,将封包重新导向到另一个端口(PNAT),进行完此处理动作后,将会继续比对其它规则。这个功能可以用来实作透明代理 或用来保护 web 服务器。DNAT和REDIRECT的区别在于,DNAT可以将其数据包发送到除本机以外的其他主机和端口,而REDIRECT则可以将收到的数据包转发到本机的其他端口,所以我理解就是DNAT的策略一般都制定在专门的NAT服务器上,而REDIRECT的策略一般制定在目标主机上当然也可以用来代替DNAT 

iptables -t nat -A PREROUTING -d 192.168.199.143 -p tcp --dport 80 -j REDIRECT --to-ports 8080

6)MASQUERADE:

改写封包来源 IP 为防火墙的 IP,可以指定 port 对应的范围,进行完此处理动作后,直接跳往下一个规则链(mangle:postrouting)。这个功能与 SNAT 略有不同,当进行 IP 伪装时,不需指定要伪装成哪个 IP,IP 会从网卡直接读取,当使用拨接连线时,IP 通常是由 ISP 公司的 DHCP 服务器指派的,这个时候 MASQUERADE 特别有用。范例如下:

iptables -t nat -A POSTROUTING -p TCP -j MASQUERADE --to-ports 21000-31000

7)RETURN :

结束在目前规则链中的过滤程序,返回主规则链继续过滤,如果把自订规则炼看成是一个子程序,那么这个动作,就相当于提早结束子程序并返回到主程序中。

8)MARK:

将封包标上某个代号,以便提供作为后续过滤的条件判断依据,进行完此处理动作后,将会继续比对其它规则。范例如下:

9)MIRROR:

镜像数据包,也就是将来源 IP 与目的地 IP 对调后,将数据包返回,进行完此处理动作后,将会中断过滤程序。

2.3)示例:

1)查看规则信息:

#查看所有链的规则信息
$iptables -L -nv --line-numbers
Chain INPUT (policy ACCEPT 19799 packets, 713K bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1       11  3497 ACCEPT     udp  --  eth1   *       0.0.0.0/0            0.0.0.0/0            udp spt:30010
2     658K   65M ACCEPT     tcp  --  eth1   *       0.0.0.0/0            0.0.0.0/0            tcp spt:389
3        0     0 ACCEPT     all  --  *      *       172.27.3.212         0.0.0.0/0           
4        0     0 ACCEPT     all  --  *      *       10.53.195.24         0.0.0.0/0           Chain ETH1_TCP (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  *      *       21.0.0.0/8           0.0.0.0/0           
2    2966K  163M ACCEPT     all  --  *      *       9.0.0.0/8            0.0.0.0/0           
3     333K   16M ACCEPT     all  --  *      *       10.0.0.0/8           0.0.0.0/0           
4     481K   25M ACCEPT     all  --  *      *       11.0.0.0/8           0.0.0.0/0           
5     9497 1099K ACCEPT     all  --  *      *       30.0.0.0/8           0.0.0.0/0         #查看某一个链的规则信息
$iptables -L ETH1_TCP -nv --line-numbers
Chain ETH1_TCP (1 references)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 ACCEPT     all  --  *      *       21.0.0.0/8           0.0.0.0/0           
2    2966K  163M ACCEPT     all  --  *      *       9.0.0.0/8            0.0.0.0/0           
3     333K   16M ACCEPT     all  --  *      *       10.0.0.0/8           0.0.0.0/0           
4     481K   25M ACCEPT     all  --  *      *       11.0.0.0/8           0.0.0.0/0           
5     9497 1099K ACCEPT     all  --  *      *       30.0.0.0/8           0.0.0.0/0  

2)添加规则:

#在INPUT chain上默认的filter表中第一位插入规则,指定原ip地址
iptables -I INPUT 1 -s 21.0.0.0/8 -j ACCEPT
iptables -A INPUT -s 20.0.0.0/8 -j DROP

3)删除规则:

 #在INPUT chain上默认的filter表中删除第4条规则iptables -D INPUT 4

4)其他:

#永久生效
service iptables save
service iptables restart

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/144193.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Mysql8安装+重装的数据备份方法【提供Mysql8.0.27版本的压缩包】

文章目录 Mysql8压缩安装包下载安装流程压缩包解压配置环境变量 初始化数据库连接数据库修改密码Mysql重装/重装系统 的数据库备份方法数据备份数据还原 Mysql8压缩安装包下载 压缩包下载路径 安装流程 压缩包解压 首先将压缩包解压&#xff0c;下图是解压之后的文件目录&a…

Swift SwiftUI 修改 List 背景颜色

Preview: Code: .listRowBackground(Color(.yellow)).scrollContentBackground(.hidden) .background(.linearGradient(colors: [.white, .accentColor], startPoint: .top, endPoint: .bottom))喜欢或对你有帮助&#xff0c;点个赞吧&#xff0c;自己先点个嘿嘿。 有错误或者…

eNSP网络学习-v05

IP容量 ip地址一共是32位&#xff0c;/24就表示他的网络号是24位。 也就是说共有 2^&#xff08;32-24&#xff09;-2 个主机&#xff08;因为主机为全0和1的保留不用&#xff0c;所以需要减2&#xff09;&#xff0c;共254个ip。 /24&#xff1a;2的8次方-2 &#xff1a;254 …

Oracle 11g_FusionOS_安装文档

同事让安装数据库&#xff0c;查询服务器信息发现操作系统是超聚变根据华为openEuler操作系统更改的自研操作系统&#xff0c;安装过程中踩坑不少&#xff0c;最后在超聚变厂商的技术支持下安装成功&#xff0c;步骤可参数该文。 一、 安装环境准备 1.1 软件下载 下载地址:…

使用cpolar端口映射的方法轻松实现在Linux环境下SVN服务器的搭建与公网访问

文章目录 前言1. Ubuntu安装SVN服务2. 修改配置文件2.1 修改svnserve.conf文件2.2 修改passwd文件2.3 修改authz文件 3. 启动svn服务4. 内网穿透4.1 安装cpolar内网穿透4.2 创建隧道映射本地端口 5. 测试公网访问6. 配置固定公网TCP端口地址6.1 保留一个固定的公网TCP端口地址6…

从零开始之了解电机及其控制(11)实现空间矢量调制

广泛地说&#xff0c;空间矢量调制只是将电压矢量以及磁场矢量在空间中调制到任意角度&#xff0c;通常同时最大限度地利用整个电压范围。 其他空间矢量调制模式确实存在&#xff0c;并且根据您最关心的内容&#xff0c;它们可能值得研究。 如何实际执行这种所谓的交替反向序列…

【小余送书第一期】《数据要素安全流通》参与活动,即有机会中奖哦!!

目录 1、背景介绍 2、本书编撰背景 3、本书亮点 4、本书主要内容 5、活动须知 1、背景介绍 随着大数据、云计算、人工智能等新兴技术的迅猛发展&#xff0c;数据已经成为我国经济社会发展的五大生产要素之一&#xff0c;《网络安全法》《个人信息保护法》《数据安全法》的…

如何将图片转为ico格式

这里主要是记录一个网站&#xff0c;如果你有更好的办法欢迎留言~ ico简介 ICO&#xff08;Icon&#xff09;是一种用于表示图标的文件格式&#xff0c;常用于Windows操作系统中。ICO格式的图片通常用于表示应用程序、文件夹、网站等的图标。 ICO文件可以包含多个图标&#x…

LINUX|ubuntu常用指令

文章目录 查看IP显示当前路径下所有文件安装编译工具GCC、调试工具GDB、连接工具SSHmkdir 创建目录export命令显示当前系统定义的所有环境变量echo $PATH命令输出当前的PATH环境变量的值当前命令行添加环境变量&#xff0c;关闭失效&#xff0c;防止多版本库冲突时使用sudo su打…

Python函数:chr()和ord()

两个函数是基于Unicode编码表进行进行字符与字码之间的转换。 chr()函数是通过字码转换成字符: 如图,坐标(1,4e10)丑 使用chr需要线将坐标相加得到&#xff1a;4e11 chr默认传入10进制的字码. 如图是各进制的字码。 也可以传入其他进制&#xff0c;不过需要在前面传入的参数最前…

Xcode 15 运行<iOS 14, 启动崩溃问题

如题. Xcode 15 启动 < iOS 14(没具体验证过, 我的问题设备是iOS 13.7)真机设备 出现启动崩溃 解决方案: Build Settings -> Other Linker Flags -> Add -> -ld64

Docker容器部署初学01

Docker容器就是个虚拟机&#xff0c;轻便微小&#xff0c;方便&#xff0c;代替了VM虚拟机的位置 当然&#xff0c;我会尽力以简单的方式为您解释如何从GitHub下载一个项目并使用Docker进行部署&#xff01;&#x1f60a; 步骤1: 下载项目 1. 打开您的浏览器并前往GitHub网站…

Stable Diffusion WebUI插件posex安装以及无法使用完美解决办法汇总

posex是一个很好用的3Dopenpose编辑器。 我们只需要去官网找到源码就可以查看其用法。 对于安装大家应该都知道怎么去安装。 1. 如何安装 (1)一体包安装方式 类似于秋叶一体包直接在webui界面搜索posex就可以直接install。 最新版本好像已经取消了。 (2)手动安装方式…

LeetCode 322.零钱兑换 完全背包 + 动态规划

322. 零钱兑换 - 力扣&#xff08;LeetCode&#xff09; 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff…

扫地机器人经营商城小程序的作用是什么

扫地机器人对人们生活大有帮助&#xff0c;近些年也有不少企业开创品牌&#xff0c;在电商平台每年销量也非常高&#xff0c;同行竞争激烈及私域化程度加深情况下&#xff0c;虽然第三方平台或线下方式也有生意&#xff0c;但互联网电商发展也为商家们带来了诸多痛点。 那么通…

Java列表查询Long(id)到前端转换出错

Java列表查询Long到前端转换出错 问题描述排查思路思路一&#xff1a;SQL问题思路二&#xff1a;Long类型转换出错 解决方法 问题描述 做了一个列表查询功能&#xff0c;本来不应该有啥大问题的&#xff0c;但是往往事与愿违。 诶&#xff0c;你越觉得不可能出问题&#xff0c…

蓝桥杯每日一题2023.9.28

AcWing 4409. 砍竹子 - AcWing 题目描述 题目分析 注&#xff1a;sqrtl的范围为long double&#xff0c;比sqrt更加精确 使用优先队列维护一段区间&#xff0c;如果连续一段相同就合并为一个区间&#xff0c;从大到小去枚举&#xff0c;每次先取出最大的一段&#xff0c;双…

idea开发Springboot出租车管理系统VS开发mysql数据库web结构java编程计算机网页源码maven项目

一、源码特点 springboot 出租车管理系统是一套完善的完整信息系统&#xff0c;结合springboot框架和bootstrap完成本系统&#xff0c;对理解JSP java编程开发语言有帮助系统采用springboot框架&#xff08;MVC模式开发&#xff09;&#xff0c; 系统具有完整的源代码和数据…

8月最新修正版风车IM即时聊天通讯源码+搭建教程

8月最新修正版风车IM即时聊天通讯源码搭建教程。风车 IM没啥好说的很多人在找,IM的天花板了,知道的在找的都知道它的价值,开版好像就要29999,后端加密已解,可自己再加密,可反编译出后端项目源码,已增加启动后端需要google auth双重验证,pc端 web端 wap端 android端 ios端 都有 …

还在用 !=null 判空?让我们用Java8的全新API去优化代码吧

当我们编写Java代码时&#xff0c;经常需要处理空值&#xff08;null&#xff09;&#xff0c;因为空值可能导致NullPointerException异常&#xff0c;这是一个常见的运行时异常。在Java 8中&#xff0c;引入了Optional类来更优雅地处理可能为空的值&#xff0c;从而减少NullPo…