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 INPUT

Chain 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 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@node1 ~]# 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到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 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 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 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@node1 ~]# 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@node1 ~]# iptables -D INPUT 4

[root@node1 ~]# 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 node1。-I不指定位置,默认插到最上面

[root@node1 ~]# iptables -I INPUT -s 192.168.88.254 -p icmp -j REJECT

[root@node1 ~]# 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@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"

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

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

相关文章

.NET Core WebAPI中使用swagger版本控制,添加注释

一、效果 二、实现步骤 在代码中添加注释 在项目属性中生成API文档 在Program中注册Swagger服务并配置文档信息 // 添加swagger注释 builder.Services.AddSwaggerGen(x > {x.SwaggerDoc("v1", new OpenApiInfo { Title "Swagger标题", Version "…

STM32F1 - 中断系统

Interrupt 1> 硬件框图2> NVIC 中断管理3> EXTI 中断管理3.1> EXTI与NVIC3.2> EXTI内部框图 4> 外部中断实验4.1> 实验概述4.2> 程序设计 5> 总结 1> 硬件框图 NVIC:Nested Vectored Interrupt Controller【嵌套向量中断控制器】 管理…

springboot192中国陕西民俗网

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的中国陕西民俗网 适用于计算机类毕业设计,课程设计参考与学习用途。仅供学习参考, 不得用于商业或者非法用途,否则,一切后果请用户自负。 看运行截图看 第五章 第四章 获取…

蓝桥杯:C++排列与组合

排列是暴力枚举时的常见操作。有以下两种情况。 C的 next_permutation()是全排列函数,只能输出序列中所有元素的全排列。 本节将给出手写排列和组合的代码。因为在很多场合中不能使用系统自带的排列函数,所以需要自己编写。 全排列函数:nex…

《合成孔径雷达成像算法与实现》Figure6.18

% rho_r c/(2*Fr)而不是rho_r c/(2*Bw) % Hsrcf exp函数里忘记乘pi了 clc clear close all参数设置 距离向参数设置 R_eta_c 20e3; % 景中心斜距 Tr 2.5e-6; % 发射脉冲时宽 Kr 20e12; % 距离向调频率 alpha_os_r 1.2; …

如何使用六图一表七种武器

六图一表七种武器用于质量管理: 描述当遇到问题时应该用那张图来解决: 一、如果题目说出了质量问题需要找原因? 解:用因果图,因果图也称石川图或鱼骨图 二、如果要判断过程是否稳定受控? 解&#xff1a…

【zabbix】(五)-自定义监控项:MySQL主从状态-自动告警

一 查看主从状态 二 在zabbix-agent端配置监控脚本 2.1 首先定义监控项 [rootmysql-112 conf]# mysql -uroot -pLXYlxy2:024.#8u} -e "show slave status\G" | grep -w Slave_IO_Running | awk {print $2} mysql: [Warning] Using a password on the command line…

UI设计常见风格(1):一文读懂九个,教你如何辨识。

Hello,我是大千UI工场,设计风格是我们新开辟的栏目,上次讲了毛玻璃风格、辨识方法、应用场景、运用方法等,很受大家欢迎,本次带来常见的风格及辨识,让大家有个总览,以后会逐个讲解的&#xff0c…

Python一些可能用的到的函数系列124 GlobalFunc

说明 GlobalFunc是算网的下一代核心数据处理基础。 算网是一个分布式网络,为了能够实现真的分布式计算(加快大规模任务执行效率),以及能够在很长的时间内维护不同版本的计算方法,需要这样一个对象/服务来支撑。Globa…

学法减分线上考试答案查找?分享九个搜题直接出答案的软件 #媒体#媒体#笔记

在信息爆炸的时代,选择适合自己的学习辅助工具和资料,能够提供更高效、便捷和多样化的学习方式。 1.试题猪 这是个微信公众号 一款聚合了好多款搜题软件的公众号,对话框可以直接搜题,题库好像挺多的,一次性能出好多…

计算机二级数据库之数据模型(三层相关的结构)

数据模型 模型的概念 模型的介绍模型是对现实世界特征的模拟和抽象, 数据模型的概念: 数据模型是对现实世界中数据特征的抽象,描述的是数据的共性。 数据模型是用来在数据库中抽象、表示和处理现实世界中的数据和信凹。 其相关的共同特…

阿里云幻兽帕鲁服务器中据点帕鲁数量上限是修改哪个参数?

在阿里云的计算巢管理中,找到你的这台部署幻兽帕鲁的服务器实例,选择右上角的“修改游戏配置” 然后选择“基地内工作帕鲁的最大数量”改成20 不过也有同学说更改上面的数字,根本不起作用。 参考资料:大多数人现在都知道&#xf…

AGV|RGV基本概念及导航分类与差异

AGV是自动导引运输车,装备采用电磁或光学等自动导引装置,能够沿规定的导引路径行驶,具有安全保护以及各种移载功能的运输车。其导航方式主要分磁条|磁钉导航、激光导航、激光反光板、激光自然导航、二维码导航、惯性导航等方式,广…

【51单片机】利用STC-ISP软件工具【定时器计算器】配置【定时器】教程(详细图示)(AT89C52)

前言 大家好吖,欢迎来到 YY 滴单片机系列 ,热烈欢迎! 本章主要内容面向接触过单片机的老铁 主要内容含: 欢迎订阅 YY滴C专栏!更多干货持续更新!以下是传送门! YY的《C》专栏YY的《C11》专栏YY的…

OpenAI全新发布文生视频模型Sora - 现实,不存在了

OpenAI,发他们的文生视频大模型,Sora了。。。。。 而且,是强到,能震惊我一万年的程度。。。 https://openai.com/sora 如果非要用三个词来总结Sora,那就是“60s超长长度”、“单视频多角度镜头”和“世界模型” &am…

一周学会Django5 Python Web开发-项目配置settings.py文件-资源文件配置

锋哥原创的Python Web开发 Django5视频教程: 2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 Django5 Python web开发 视频教程(无废话版) 玩命更新中~共计17条视频,包括:2024版 Django5 Python we…

深度学习之梯度下降算法

梯度下降算法 梯度下降算法数学公式结果 梯度下降算法存在的问题随机梯度下降算法 梯度下降算法 数学公式 这里案例是用梯度下降算法,来计算 y w * x 先计算出梯度,再进行梯度的更新 import numpy as np import matplotlib.pyplot as pltx_data [1.0,…

紫微斗数双星组合:武曲破军在巳亥

文章目录 前言内容总结 前言 紫微斗数双星组合:武曲破军在巳亥 内容 紫微斗数双星组合:武曲破军在巳亥 性格分析 在紫微斗数命盘中,武曲星入命之人性格大都为正直、刚强、果决、重视原则。假如与破军星同守命宫时,身边的破军是…

【防网盘在线解压】Peazip 豌豆压缩 v9.7.0

软件介绍 Peazip 是一个免费的文件归档应用程序, 支持跨平台,是和WinRar、WinZip类似软件的开源免费替代品;支持压缩/ 存档到 7Z, ARC、Brotli BR、BZip2、GZip、 PAQ、PEA、RAR、自解压档案、TAR、WIM、XZ、Zstandard ZST、打开…

如何为你的幻兽帕鲁服务器手动配置虚拟内存或Swap、Zram

其实非常简单,如果是Windows系统服务器的话,直接远程连接到服务器桌面。 连上之后,打开设置,找到“高级系统设置” 可以参考视频教程: 拒绝卡顿!幻兽帕鲁服务器内存优化攻略! 详细教程地址&…