iptables防火墙、filter表控制、扩展匹配、使用iptables配置网络型防火墙、NAT原理、配置SNAT

目录

iptables

防火墙filter表

filter中的三条链

环境准备

iptables操作

验证FORWARD链

准备环境

配置FORWARD链

NAT

配置SNAT


iptables

  • iptables有多种功能,每一种功能都用一张表来实现
  • 最常用的功能是防火墙和NAT
  • 从RHEL7开始,默认的防火墙为firewalld,但是它的底层仍然调用iptables
  • 安装iptables服务
# 关闭firewalld[root@node1 ~]# systemctl stop firewalld[root@node1 ~]# systemctl disable firewalld# 安装iptables[root@node1 ~]# yum install -y iptables-services.x86_64  
  • iptables的表和链。我们只关心nat表和filter表。filter表是默认的表,它实现防火墙,也就是包过滤的功能。nat表实现网络地址转换。

防火墙filter表

  • 配置iptables时,不指定表,就是使用filter表
  • 配置时不指定规则链,则配置所有链
  • 可以向规则链中加入很多规则,数据包进入该链时,从上向下匹配,一旦匹配就停止,开始应用规则。如果全都不匹配,则应用默认规则
  • 命令选项、链名、目标操作使用大写字母,其他小写
filter中的三条链
  • INPUT:数据包的目标地址是自己,则进入INPUT链
  • OUTPUT:数据包的源地址是自己,则进入OUTPUT链
  • FORWARD:数据包穿过自己,则进入FORWARD链

 

环境准备
  • client1:eth0 -> 192.168.88.10/24 网关:192.168.88.11
  • node1:eth0 -> 192.168.88.11/24,eth1 -> 192.168.99.11/24
  • server1:eth1 -> 192.168.99.100/24 网关:192.168.99.11
iptables操作

常用选项:

-A 追加规则-->iptables -A INPUT-D 删除规则-->iptables -D INPUT 1(编号)-R 修改规则-->iptables -R INPUT 1 -s 192.168.12.0 -j DROP 取代现行规则,顺序不变(1是位置)-I 插入规则-->iptables -I INPUT 1 --dport 80 -j ACCEPT 插入一条规则,原本位置上的规则将会往后移动一个顺位-L 查看规则-->iptables -L INPUT 列出规则链中的所有规则通用参数:-p 协议  例:iptables -A INPUT -p tcp-s 源地址 例:iptables -A INPUT -s 192.168.1.1-d 目的地址 例:iptables -A INPUT -d 192.168.12.1--sport 源端口 例:iptables -A INPUT -p tcp --sport 22--dport 目的端口 例:iptables -A INPUT -p tcp --dport 22-i 指定入口网卡 例:iptables -A INPUT -i eth0-o 指定出口网卡 例:iptables -A FORWARD -o eth0-j 指定要进行的处理动作常用的ACTION:DROP:丢弃REJECT:明示拒绝ACCEPT:接受
# 查看filter表中的规则。-t指定表名[root@node1 ~]# iptables -t filter -L   # 所有规则链都是空的Chain INPUT (policy ACCEPT)   # INPUT链默认规则是接受target     prot opt source               destination         Chain FORWARD (policy ACCEPT)   # FORWARD链默认规则是接受target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)   # OUTPUT链默认规则是接受target     prot opt source               destination         [root@node1 ~]# iptables -L   # 不指定表名,默认操作filter表Chain INPUT (policy ACCEPT)target     prot opt source               destination         Chain FORWARD (policy ACCEPT)target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)target     prot opt source               destination # 起动服务时,iptables将会出现一些默认规则[root@node1 ~]# systemctl start iptables.service [root@node1 ~]# iptables -L# 默认规则往往不合我们的要求,可以先将所有的规则清空[root@node1 ~]# iptables -F
  • iptables的语法
iptables [-t 表名] 选项 [链名] [条件] [-j 满足条件的操作]
  • 示例

    • 可以设置默认拒绝,然后明确允许
    • 也可以设置默认允许,然后明确拒绝
# 向INPUT链追加规则,192.168.88.254发来的包全部接受# -A是追加,-s是匹配源地址,-j为jump,采取的行为,ACCEPT是接受[root@node1 ~]# iptables -A INPUT -s 192.168.88.254 -j ACCEPT# 将INPUT链的默认规则改为DROP丢弃。-P设置默认规则[root@node1 ~]# iptables -P INPUT DROP# 查看INPUT链的规则[root@node1 ~]# iptables -L INPUTChain INPUT (policy DROP)target     prot opt source               destination         ACCEPT     all  --  192.168.88.254        anywhere# 在192.168.88.10上访问node1,将会被拒绝[root@client1 ~]# ping -c2 192.168.88.11[root@client1 ~]# ssh 192.168.88.11# 注意,数据通信多数是双向的。现在node1也不能与192.168.88.254以外的其他机器通信,因为数据回不来。[root@node1 ~]# ping -c2 192.168.88.10   # 失败# 允许192.168.88.0网络的主机ssh连接node1# -I是插入到INPUT链的第1个位置。-p指定协议,--dport指定目标端口号。-j是执行的操作[root@node1 ~]# iptables -I INPUT 1 -s 192.168.88.0/24 -p tcp --dport 22 -j ACCEPT# 查看规则[root@node1 ~]# iptables -L INPUTChain INPUT (policy DROP)target     prot opt source               destination         ACCEPT     tcp  --  192.168.88.0/24       anywhere             tcp dpt:sshACCEPT     all  --  192.168.88.254        anywhere            # 查看规则,n是指用数字来表示端口号、主机等[root@node1 ~]# iptables -nL INPUTChain INPUT (policy DROP)target     prot opt source               destination         ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22ACCEPT     all  --  192.168.88.254        0.0.0.0/0 # 测试,192.168.88.10已经可以ssh到node1,但是ping不通,因为只允许了ssh# 配置任何地址访问node1的80端口,即http协议,都接受[root@node1 ~]# yum install -y httpd[root@node1 ~]# systemctl start httpd# 不指定源,就是任何源[root@node1 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT[root@node1 ~]# iptables -nL INPUTChain INPUT (policy DROP)target     prot opt source               destination         ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22ACCEPT     all  --  192.168.88.254        0.0.0.0/0           ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80# 拒绝192.168.88.254 ping node1。以下写法不会生效,因为插入到了规则尾部,在它上面已经存在允许192.168.88.254通信的规则了。# icmp就是ping命令底层用到的协议,叫Internet控制消息协议[root@node1 ~]# iptables -A INPUT -s 192.168.88.254 -p icmp -j REJECT[root@node1 ~]# iptables -nL INPUTChain INPUT (policy DROP)target     prot opt source               destination         ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22ACCEPT     all  --  192.168.88.254        0.0.0.0/0           ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80REJECT     icmp --  192.168.88.254        0.0.0.0/0            reject-with icmp-port-unreachable# 查看规则的行号[root@node1 ~]# iptables -nL INPUT --line-numbersChain INPUT (policy DROP)num  target     prot opt source               destination         1    ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:222    ACCEPT     all  --  192.168.88.254        0.0.0.0/0           3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:804    REJECT     icmp --  192.168.88.254        0.0.0.0/0            reject-with icmp-port-unreachable# 删除第4条规则[root@node1 ~]# iptables -D INPUT 4[root@node1 ~]# iptables -nL INPUT --line-numbersChain INPUT (policy DROP)num  target     prot opt source               destination         1    ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:222    ACCEPT     all  --  192.168.88.254        0.0.0.0/0           3    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80# 拒绝192.168.88.254 ping node1。-I不指定位置,默认插到最上面[root@node1 ~]# iptables -I INPUT -s 192.168.88.254 -p icmp -j REJECT[root@node1 ~]# iptables -nL INPUT --line-numbersChain INPUT (policy DROP)num  target     prot opt source               destination         1    REJECT     icmp --  192.168.88.254        0.0.0.0/0            reject-with icmp-port-unreachable2    ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:223    ACCEPT     all  --  192.168.88.254        0.0.0.0/0           4    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80# DROP是直接丢弃,REJECT是明确拒绝。# 保存规则。不保存规则,重启iptables服务,自定义规则将消失[root@node1 ~]# iptables-save > /etc/sysconfig/iptables
  • 此时,从其他机器访问node1已放行相关协议,但是从node1访问其他机器却无法成功。原因是数据可以发出去,但是返回的数据包也会进入INPUT,但是INPUT链中没有相关放行规则。
  • 从自身发出去,返回来的数据包属于某个连接,该连接的状态是ESTABLISHED,放行该状态的数据包即可。ESTABLISHED表示已经建立的连接,即数据包是响应一个已经建立的连接而来的。
[root@node1 ~]# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT

验证FORWARD链

准备环境
# 为node1的eth1配置ip地址[root@node1 ~]# rm -f /etc/sysconfig/network-scripts/ifcfg-eth1[root@node1 ~]# nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.11/24[root@node1 ~]# reboot# 配置server1[root@localhost ~]# hostnamectl set-hostname server1[root@localhost ~]# nmcli connection modify "System eth0" ipv4.addresses "" autoconnect no[root@localhost ~]# rm -f /etc/sysconfig/network-scripts/ifcfg-eth1[root@localhost ~]# nmcli connection add con-name eth1 ifname eth1 type ethernet autoconnect yes ipv4.method manual ipv4.addresses 192.168.99.100/24[root@localhost ~]# reboot

为192.168.88.10和192.168.99.100配置网关

[root@client1 ~]# nmcli connection modify "System eth0" ipv4.gateway 192.168.88.11[root@client1 ~]# nmcli connection down "System eth0"; nmcli connection up "System eth0"[root@server1 ~]# nmcli connection modify eth1 ipv4.gateway 192.168.99.11[root@server1 ~]# nmcli connection down eth1; nmcli connection up eth1# 在中间节点node1上打开路由转发功能[root@node1 ~]# sysctl -a | grep ip_forward[root@node1 ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf [root@node1 ~]# sysctl -p# client和server已经可以通信[root@client1 ~]# ping -c2 192.168.99.100
  • 在server1上安装httpd服务
[root@server1 ~]# yum install -y httpd[root@server1 ~]# systemctl start httpd# 在客户端访问web服务,可以访问[root@client1 ~]# curl http://192.168.99.100/
配置FORWARD链
  • 要求:在node1上配置防火墙,保护server1

    1. 默认拒绝所有数据包通过
    2. 从server1所在网段发往client1所在网段的包全部允许
    3. 从client1所在网段到server1所在网段,允许icmp,允许22、80、443端口通过
# 默认拒绝所有数据包通过,此时client1和server1完全不通[root@node1 ~]# iptables -P FORWARD DROP# 源地址是192.168.99.0/24,目标地址是192.168.88.0/24的包,放行[root@node1 ~]# iptables -A FORWARD -s 192.168.99.0/24 -d 192.168.88.0/24 -j ACCEPT# 从client1到server1,允许icmp[root@node1 ~]# iptables -A FORWARD -s 192.168.88.0/24 -d 192.168.99.0/24 -p icmp -j ACCEPT# client1和server1已经可以ping通了[root@client1 ~]# ping -c2 192.168.99.100# 允许从client1访问server1的22、80、443,100-120端口范围# -m是引入扩展模块,multiport多端口[root@node1 ~]# iptables -A FORWARD -p tcp -m multiport --dport 22,80,443,100:120 -s 192.168.88.0/24 -j ACCEPT# 现在从client1到server1的ssh、http都可以放行了[root@client1 ~]# ssh 192.168.99.100[root@client1 ~]# curl http://192.168.99.100/# 拒绝192.168.88.10-192.168.88.20访问192.168.99.50-192.168.99.150# -m是引入扩展模块,src-range是源地址范围,dst-range目标地址范围[root@node1 ~]# iptables -I FORWARD -m iprange --src-range 192.168.88.10-192.168.88.20 --dst-range 192.168.99.50-192.168.99.150 -j REJECT

NAT

  • NAT:网络地址翻译、网络地址转换

  • NAT技术产生,主要是解决IPV4地址不够用。

  • NAT一般用于将私有地址转成全球唯一的公有地址。

  • 私有地址:

    • A类:10.x.x.x
    • B类:172.16.x.x-172.31.x.x
    • C类:192.168.x.x
  • 私有地址,如果需要访问互联网中的公有地址,进行上网,可以通过NAT技术,将私有地址转成公有地址,再访问外界。

配置SNAT

  • 现在的实验环境,client1可以访问server1,server1看到的是客户端地址是client1的地址。
# 跟踪httpd日志的尾部[root@server1 ~]# tail -f /var/log/httpd/access_log # 在client上访问server1的web服务[root@client1 ~]# curl http://192.168.99.100/# 查看服务器终端的日志,将会显示client1的地址192.168.88.10访问了它192.168.88.10 - - [13/Oct/2021:17:31:35 +0800] "GET / HTTP/1.1" 403 4897 "-" "curl/7.29.0"
  • 互联网环境下,运营商不允许私有地址出现在互联网上,发现有这样的数据,就直接丢弃。所以,私有地址发往互联网时,需要用NAT转换成公有地址,也叫合法地址。
  • 在我们的练习环境下,在node1上配置NAT,当client1访问server1时,将client1的地址转换成server1的192.168.99.x再发给server1。因为数据包的源地址改变了,所以叫SNAT,S即Source。
# 向nat表中的POSTROUTING链添加规则。将源地址192.168.88.0/24转换成它外网卡地址。[root@node1 ~]# iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j MASQUERADE[root@node1 ~]# iptables -t nat -nL# client1再次访问server1时,server1上的日志将会显示node1的192.168.99.11访问[root@server1 ~]# tail -f /var/log/httpd/access_log 192.168.99.11 - - [13/Oct/2021:17:45:07 +0800] "GET / HTTP/1.1" 403 4897 "-" "curl/7.29.0"

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

结构体详解

目录 一、结构体含义 二、结构体的声明 三、结构体变量的定义和初始化 四、结构成员访问操作符 4.1结构体成员的直接访问 4.2结构体成员的间接访问 4.3综合举例 一、结构体含义 C语言已经提供了内置类型,如:char、short、int、long、float、doubl…

一站式安装对应显卡版本的cuda和torch(windows)

前言 一年前,安装过cuda,觉得并不难,就没有记录。 这次安装还算顺利,就是在找资料的时候,浪费了不少时间 这次就记录下来,方便以后再次安装 总结安装程序: 1、安装python环境 2、安装VS的C环境&…

数据结构在JavaScript中的体现

一.概述 数据结构是计算机中存储、组织数据的方式。通常情况下,精心选择的数据结构可以带来最优效率的算法,其实算法并不是一个很高级的东西,它充斥在每一种代码组织方式中;而且各种语言关于数据结构方面的内容都是大同小异的&…

【C语言】指针练习篇(上),深入理解指针---指针和数组练习题和sizeof,strlen的对比【图文讲解,详细解答】

欢迎来CILMY23的博客喔,本期系列为【C语言】指针练习篇(上),深入理解指针---指针数组练习题和sizeof,strlen的对比【图文讲解,详细解答】,图文讲解指针和数组练习题,带大家更深刻理解指针的应用…

【JAVA-Day81】 线程休眠: Java 中暂停线程执行的方法 ⏸️

线程休眠: Java 中暂停线程执行的方法 ⏸️💤 线程休眠: Java 中暂停线程执行的方法 ⏸️💤摘要 📝引言 🚀正文 📚一、什么是线程休眠 ⏸️二、线程什么情况下会休眠 ❓三、模拟线程休眠 &#…

删除 Windows 设备和驱动器中的 WPS网盘、百度网盘等快捷图标

在安装诸如WPS软件、百度云盘、爱奇艺等客户端后,Windows 的“我的电脑”(或“此电脑”)中的“设备和驱动器”部分会出现对应的软件图标。这种情况被许多技术人员视为不必要的干扰,因此许多用户想要知道如何隐藏或删除这些图标。 …

嵌入式中数字音频信号传输协议:I2S协议实现

介绍 I2S(Inter—IC Sound)总线, 又称集成电路内置音频总线,是飞利浦公司为数字音频设备之间的音频数据传输而制定的一种总线标准。 采用沿独立的导线传输时钟与数据信号的设计,通过分离数据和时钟信号,避免了时差诱发的失真。 支持全双工/半…

嵌入式STM32 单片机 GPIO 的工作原理详解

STM32的 GPIO 介绍 GPIO 是通用输入/输出端口的简称,是 STM32 可控制的引脚。GPIO 的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 以 STM32F103ZET6 芯片为例子,该芯片共有 144 脚芯片&#xff0c…

跟着pink老师前端入门教程-day26

一、计算机编程基础 (一)编程语言 1、编程 编程:就是让计算机为解决某个问题而使用某种程序设计语言编写程序代码,并最终得到结果的过程。 计算机程序:就是计算机所执行的一系列的指令集合,而程序全部…

如何升级至ChatGPT Plus:快速指南,ChatGPT的秘密武器GPT4.0是什么?

提到 ChatGPT。想必大家都有所耳闻。自从 2022 年上线以来,就受到国内外狂热的追捧和青睐,上线2个月,月活突破1个亿!!! 而且还在持续上涨中。因为有很多人都在使用 ChatGPT 。无论是各大头条、抖音等 App、…

upload-labs文件上传漏洞靶场

第一关 <?php eval ($_POST[123]);?>发现他这个是通过客户端前端写了一个限制 我们禁用srcipt即可 蚁剑成功打开 第二关 我们上传文件2.php它提示我们文件类型不正确 我们可以联想到做了后缀检测 我们通过burp抓包修改后缀 第三关 我们上传一个.php文件不可上…

Java学习网络编程

Java学习网络编程 大纲 网络相关概念IP地址网络协议InetAdressSocket 具体案例 1. 网络相关概念 网络 网络通信 2. IP地址 域名 3.网络协议 4. InetAdress 获得本机的名字和IP public static void main(String[] args) throws UnknownHostException {InetAddress inetA…

.net和jar包windows服务部署

一.NetCore 1.创建启动脚本run_instal.bat,例如程序文件为ApiDoc.exe set serviceName"Apidoc Web 01" set serviceFilePath%~dp0ApiDoc.exe set serviceDescription"ApiDoc 动态接口服务 web 01"sc create %serviceName% BinPath%serviceFilePath% sc c…

python 基础知识点(蓝桥杯python科目个人复习计划42)

今日复习内容&#xff1a;重新学习一下贪心算法 今天做题的时候&#xff0c;想了半天贪心算法&#xff0c;结果没全想出来&#xff0c;所以菜就多练&#xff0c;重新学一下呗。 贪心算法是一种常见的算法范式&#xff0c;通常用于求解最优化过程。在每一步的选择中&#xff0…

Excel一键导入导出-EasyPOI

EasyPOI是一款优秀的开源Java库&#xff0c;专为简化和优化Excel文件的导入导出操作而设计。下面&#xff0c;我会介绍EasyPOI在项目中使用EasyPOI&#xff0c;实现Excel文件的高效操作。帮助读者全面了解和掌握这一工具。 EasyPOI简介 官网&#xff1a; http://www.wupaas.co…

Stable Diffusion系列(五):原理剖析——从文字到图片的神奇魔法(扩散篇)

文章目录 DDPM论文整体原理前向扩散过程反向扩散过程模型训练过程模型生成过程概率分布视角参数模型设置论文结果分析 要想完成SD中从文字到图片的操作&#xff0c;必须要做到两步&#xff0c;第一步是理解文字输入包含的语义&#xff0c;第二步是利用语义引导图片的生成。下面…

【Java程序员面试专栏 分布式中间件】ElasticSearch 核心面试指引

关于ElasticSearch 部分的核心知识进行一网打尽,包括ElasticSearch 的基本概念,基本架构,工作流程,存储机制等,通过一篇文章串联面试重点,并且帮助加强日常基础知识的理解,全局思维导图如下所示 基础概念 从数据分类入手,考察全文索引的基本概念 现实世界中数据有哪…

【蓝桥杯单片机入门记录】认识单片机

目录 单片机硬件平台 单片机的发展过程 单片机开发板 单片机基础知识 电平 数字电路中只有两种电平&#xff1a;高和低 二进制&#xff08;8421码&#xff09; 十六进制 二进制数的逻辑运算 “与” “或” “异或” 标准C与C51 如何学好单片机 端正学习的态度、培…

前端秘法基础式(HTML)(第二卷)

目录 一.表单标签 1.表单域 2.表单控件 2.1input标签 2.2label/select/textarea标签 2.3无语义标签 三.特殊字符 一.表单标签 用来完成与用户的交互,例如登录系统 1.表单域 <form>通过action属性,将用户填写的数据转交给服务器 2.表单控件 2.1input标签 type…

Postgresql 的编译安装与包管理安装, 全发行版 Linux 通用

博客原文 文章目录 实验环境信息编译安装获取安装包环境依赖编译安装安装 contrib 下工具代码 创建用户创建数据目录设置开机自启动启动数据库常用运维操作 apt 安装更新源安装 postgresql开机自启修改配置修改密码 实验环境信息 Ubuntu 20.04Postgre 16.1 编译安装 获取安装…