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
  • fw1: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表

# 起动服务时,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@fw1 ~]# iptables -A INPUT -s 192.168.88.254 -j ACCEPT

# 将INPUT链的默认规则改为DROP丢弃。-P设置默认规则
[root@fw1 ~]# iptables -P INPUT DROP

# 查看INPUT链的规则
[root@fw1 ~]# iptables -L INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  192.168.88.254        anywhere

# 在192.168.88.10上访问fw1,将会被拒绝
[root@client1 ~]# ping -c2 192.168.88.11
[root@client1 ~]# ssh 192.168.88.11

# 注意,数据通信多数是双向的。现在fw1也不能与192.168.88.254以外的其他机器通信,因为数据回不来。
[root@fw1 ~]# ping -c2 192.168.88.10   # 失败

# 允许192.168.88.0网络的主机ssh连接fw1
# -I是插入到INPUT链的第1个位置。-p指定协议,--dport指定目标端口号。-j是执行的操作
[root@fw1 ~]# iptables -I INPUT 1 -s 192.168.88.0/24 -p tcp --dport 22 -j ACCEPT

# 查看规则
[root@fw1 ~]# iptables -L INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.88.0/24       anywhere             tcp dpt:ssh
ACCEPT     all  --  192.168.88.254        anywhere            

# 查看规则,n是指用数字来表示端口号、主机等
[root@fw1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22
ACCEPT     all  --  192.168.88.254        0.0.0.0/0 

# 测试,192.168.88.10已经可以ssh到fw1,但是ping不通,因为只允许了ssh

# 配置任何地址访问fw1的80端口,即http协议,都接受
[root@fw1 ~]# yum install -y httpd
[root@fw1 ~]# systemctl start httpd
# 不指定源,就是任何源
[root@fw1 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@fw1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22
ACCEPT     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 fw1。以下写法不会生效,因为插入到了规则尾部,在它上面已经存在允许192.168.88.254通信的规则了。
# icmp就是ping命令底层用到的协议,叫Internet控制消息协议
[root@fw1 ~]# iptables -A INPUT -s 192.168.88.254 -p icmp -j REJECT
[root@fw1 ~]# iptables -nL INPUT
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22
ACCEPT     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
REJECT     icmp --  192.168.88.254        0.0.0.0/0            reject-with icmp-port-unreachable

# 查看规则的行号
[root@fw1 ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22
2    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
4    REJECT     icmp --  192.168.88.254        0.0.0.0/0            reject-with icmp-port-unreachable

# 删除第4条规则
[root@fw1 ~]# iptables -D INPUT 4
[root@fw1 ~]# iptables -nL INPUT --line-numbers
Chain INPUT (policy DROP)
num  target     prot opt source               destination         
1    ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22
2    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 fw1。-I不指定位置,默认插到最上面
[root@fw1 ~]# iptables -I INPUT -s 192.168.88.254 -p icmp -j REJECT
[root@fw1 ~]# iptables -nL INPUT --line-numbers
Chain 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-unreachable
2    ACCEPT     tcp  --  192.168.88.0/24       0.0.0.0/0            tcp dpt:22
3    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@fw1 ~]# iptables-save > /etc/sysconfig/iptables

此时,从其他机器访问fw1已放行相关协议,但是从fw1访问其他机器却无法成功。原因是数据可以发出去,但是返回的数据包也会进入INPUT,但是INPUT链中没有相关放行规则。

从自身发出去,返回来的数据包属于某个连接,该连接的状态是ESTABLISHED,放行该状态的数据包即可。ESTABLISHED表示已经建立的连接,即数据包是响应一个已经建立的连接而来的。

[root@fw1 ~]# iptables -I INPUT -m state --state ESTABLISHED -j ACCEPT

验证FORWARD链

要求:在fw1上配置防火墙,保护server1

  1. 默认拒绝所有数据包通过
  2. 从server1所在网段发往client1所在网段的包全部允许
  3. 从client1所在网段到server1所在网段,允许icmp,允许22、80、443端口通过
# 默认拒绝所有数据包通过,此时client1和server1完全不通
[root@fw1 ~]# iptables -P FORWARD DROP

# 源地址是192.168.99.0/24,目标地址是192.168.88.0/24的包,放行
[root@fw1 ~]# iptables -A FORWARD -s 192.168.99.0/24 -d 192.168.88.0/24 -j ACCEPT

# 从client1到server1,允许icmp
[root@fw1 ~]# 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@fw1 ~]# 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@fw1 ~]# 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@fw1 ~]# iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j MASQUERADE
                iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j SNAT --to-source 192.168.99.11
[root@fw1 ~]# iptables -t nat -nL

# client1再次访问server1时,server1上的日志将会显示fw1的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"

1112

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在Gradle工程中使用checkstyle来规范你的项目

🌹作者主页:青花锁 🌹简介:Java领域优质创作者🏆、Java微服务架构公号作者😄 🌹简历模板、学习资料、面试题库、技术互助 🌹文末获取联系方式 📝 系列专栏目录 [Java项…

深度学习 | 多模态算法

AIGC也就是AI内容生成已经成为新一轮人工智能发展的热点和必然趋势,它使得大规模高质量的创作变得更加容易。 一 、InstructGPT模型 1、GPT系列回顾 chatGPT和InstructGPT都使用了指示学习和基于人工反馈的强化学习来指导模型的训练,不同点仅仅是在采集数…

ECharts配置个性化图表:圆环、立体柱状图

ECharts配置个性化图表:圆环、立体柱状图 圆环图双纵轴多数据面积图折柱混合图3D立体圆环饼图3D立体饼图参考文章 官网调试地址:点击跳转调试 圆环图 效果图: 配置: option {color: [#29BEFF, #A2DC00, #FFC400, #FF7F5C, #C…

c jpeg 编码解码验证数据

1. yuv420p 1616 像素点 384字节全部数据 把上面的384个char从左到右,从上到下的顺序输入文件,就能显示红绿蓝白4个水平条

SwiftUI之深入解析ContentUnavailableView的实战应用

一、基本用法 SwiftUI 引入了新的 ContentUnavailableView 类型,允许在应用程序中展示空状态、错误状态或任何其他内容不可用的状态。那么,如何使用 ContentUnavailableView 引导用户浏览应用程序中的空状态呢?首先看看 ContentUnavailableV…

python中的selenium安装的步骤(浏览器自动化测试框架)

一、前言 我们今天要安装的selenium 就是浏览器自动化测试框架,是一个用于Web应用程序的测试工具,就是模拟用户操作。支持的浏览器包括Chrome,IE,Mozilla Firefox,Safari,Opera等。今天我们以Chrome为例讲…

msvcr120.dll丢失怎样修复,教你msvcr120.dll丢失的解决办法

在使用电脑的过程中出现关于msvcr120.dll丢失的问题,那么出现这样的问题应该怎么解决呢?其实解决的办法也很简单,今天就和大家说说msvcr120.dll丢失怎样修复,同时给大家介绍一些关于msvcr120.dll文件的相关内容,了解ms…

CMake入门教程【核心篇】添加库(add_library)

😈「CSDN主页」:传送门 😈「Bilibil首页」:传送门 😈「本文的内容」:CMake入门教程 😈「动动你的小手」:点赞👍收藏⭐️评论📝 文章目录 1. 基本用法2.STATIC…

python爬虫实现获取招聘信息

使用的python版本: 3.12.1 selenium版本:4.8.0 urllib版本:1.26.18 from selenium import webdriver from selenium.webdriver import ActionChains import timeimport re import xlwt import urllib.parsedef get_html(url):chrome_drive…

将linux的代码上传至gitte,从创建到linux命令详解

目录 1:创建gitte的代码仓库 1:登录gitte网页 https://gitee.com/ 2:点击导航栏的+号 3:点击新建仓库​编辑4:仓库配置 ​编辑5:复制仓库的路径 linux操作系统命令行 1: linux…

Hadoop集群三节点搭建(一)

一、第一台虚拟机准备 确认是可以上网,方便下载文件和工具,使用ping命令测试下 安装工具 net-tool:工具包集合,包含ifconfig等命令,大家可以根据自己需要按需下载 创建普通用户attest,并修改attest用户的密…

MO 2023 年度回顾

PART-ONE 行业态势 随着供需关系的变化,数据库的竞争在经历了 3 年 “百花齐放” 般的发展后,终于在 2023 年进入到了一个相对收拢的阶段。 2023 年,各个数据库厂商间很有默契地在两个方面达成了一致: HTAP 已经成为新一代数据…

YOLO算法入门指南:了解门槛、学习路径及其易学性

博主猫头虎的技术世界 🌟 欢迎来到猫头虎的博客 — 探索技术的无限可能! 专栏链接: 🔗 精选专栏: 《面试题大全》 — 面试准备的宝典!《IDEA开发秘籍》 — 提升你的IDEA技能!《100天精通Golang》…

基于Segformer实现PCB缺陷检测(步骤 + 代码)

导 读 本文主要介绍基于Segformer实现PCB缺陷检测 ,并给出步骤和代码。 背景介绍 PCB缺陷检测是电子制造的一个重要方面。利用Segformer等先进模型不仅可以提高准确性,还可以大大减少检测时间。传统方法涉及手动检查,无法扩展且容易出错…

k8s---声明式资源管理(yml文件)

在k8s当中支持两种声明资源的方式: 1、 yaml格式:主要用于和管理资源对象 2、 json格式:主要用于在API接口之间进行消息传递 声明式管理方法(yaml)文件 1、 适合对资源的修改操作 2、 声明式管理依赖于yaml文件,所有的内容都在y…

webapp下没有蓝点解决

解决方法: File->Project Structure 现在就是一个JavaWeb项目了。

WMS仓储管理系统如何优化急料处理流程

在当今快速发展的商业环境中,企业的运营效率和供应链管理面临着前所未有的挑战。尤其在面对急料处理这一环节时,许多企业都感到力不从心。为了满足生产线的连续运作、确保客户订单的及时交付,WMS仓储管理系统的急料处理流程优化成为了关键。本…

(17)Linux的进程阻塞进程程序替换 exec 函数簇

前言:本章我们讲解它的 options 参数。在讲解之前我们需要理解进程阻塞,然后我们重点讲解二进程程序替换,这是本章的重点,然后介绍一个进程替换函数 execl,通过介绍这个函数来打开突破口,引入进程创建的知识…

【解决复杂链式任务,打造全能助手】LangChain 大模型 打造 钢铁侠的全能助理 Jarvis

LangChain 大模型 结合 做 AutoGPT、ChatPDF 思维链 CoTLangChain模型IO:和大模型交互、提示词模版数据连接:从数据的接入、分割,到向量的构建、存储、搜索链:串联和组织,多个语言模型、组件记忆:灵魂伴侣&…

C#中使用 async await TaskCompletionSource<T>实现异步逻辑同步写

Task、async 和 await 是 C# 中用于处理异步编程的关键概念。它们一起构成了异步编程的基础。 Task Task 是表示异步操作的抽象,它属于 System.Threading.Tasks 命名空间。Task 可以表示已经完成的任务、正在运行的任务或者尚未开始的任务。通过 Task,…