RHCE 系列(二):如何进行包过滤、网络地址转换和设置内核运行时参数-阿里云开发者社区

开发者社区> 寒凝雪> 正文

RHCE 系列(二):如何进行包过滤、网络地址转换和设置内核运行时参数

简介:
+关注继续查看

正如第一部分(“设置静态网络路由”)提到的,在这篇文章(RHCE 系列第二部分),我们首先介绍红帽企业版 Linux 7(RHEL)中包过滤和网络地址转换(NAT)的原理,然后再介绍在某些条件发生变化或者需要变动时设置运行时内核参数以改变运行时内核行为。

RHCE 第二部分:网络包过滤

RHCE 第二部分:网络包过滤

RHEL 7 中的网络包过滤

当我们讨论数据包过滤的时候,我们指防火墙读取每个试图通过它的数据包的包头所进行的处理。然后,根据系统管理员之前定义的规则,通过采取所要求的动作过滤数据包。

正如你可能知道的,从 RHEL 7 开始,管理防火墙的默认服务是 firewalld。类似 iptables,它和 Linux 内核的 netfilter 模块交互以便检查和操作网络数据包。但不像 iptables,Firewalld 的更新可以立即生效,而不用中断活跃的连接 - 你甚至不需要重启服务。

Firewalld 的另一个优势是它允许我们定义基于预配置服务名称的规则(之后会详细介绍)。

在第一部分,我们用了下面的场景:

静态路由网络示意图

静态路由网络示意图

然而,你应该记得,由于还没有介绍包过滤,为了简化例子,我们停用了2号路由器的防火墙。现在让我们来看看如何使接收的数据包发送到目的地的特定服务或端口。

首先,让我们添加一条永久规则允许从 enp0s3 (192.168.0.19) 到 enp0s8 (10.0.0.18) 的入站流量:


  1. # firewall-cmd --permanent --direct --add-rule ipv4 filter FORWARD 0 -i enp0s3 -o enp0s8 -j ACCEPT

上面的命令会把规则保存到 /etc/firewalld/direct.xml 中:


  1. # cat /etc/firewalld/direct.xml

检查 Firewalld 保存的规则

检查 Firewalld 保存的规则

然后启用规则使其立即生效:


  1. # firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i enp0s3 -o enp0s8 -j ACCEPT

现在你可以从 RHEL 7 中通过 telnet 到 web 服务器并再次运行 tcpdump 监视两台机器之间的 TCP 流量,这次2号路由器已经启用了防火墙。


  1. # telnet 10.0.0.20 80
  2. # tcpdump -qnnvvv -i enp0s3 host 10.0.0.20

如果你想只允许从 192.168.0.18 到 web 服务器(80 号端口)的连接而阻塞 192.168.0.0/24 网络中的其它来源呢?

在 web 服务器的防火墙中添加以下规则:


  1. # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.18/24" service name="http" accept'
  2. # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.18/24" service name="http" accept' --permanent
  3. # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" drop'
  4. # firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" drop' --permanent

现在你可以从 192.168.0.18 和 192.168.0.0/24 中的其它机器发送到 web 服务器的 HTTP 请求。第一种情况连接会成功完成,但第二种情况最终会超时。

任何下面的命令可以验证这个结果:


  1. # telnet 10.0.0.20 80
  2. # wget 10.0.0.20

我强烈建议你看看 Fedora Project Wiki 中的 Firewalld Rich Language 文档更详细地了解关于富规则的内容。

RHEL 7 中的网络地址转换(NAT)

网络地址转换(NAT)是为专用网络中的一组计算机(也可能是其中的一台)分配一个独立的公共 IP 地址的过程。这样,在内部网络中仍然可以用它们自己的私有 IP 地址来区别,但外部“看来”它们是一样的。

另外,网络地址转换使得内部网络中的计算机发送请求到外部资源(例如因特网),然后只有源系统能接收到对应的响应成为可能。

现在让我们考虑下面的场景:

网络地址转换

网络地址转换

在2号路由器中,我们会把 enp0s3 接口移动到外部区域(external),enp0s8 到内部区域(external),伪装(masquerading)或者说 NAT 默认是启用的:


  1. # firewall-cmd --list-all --zone=external
  2. # firewall-cmd --change-interface=enp0s3 --zone=external
  3. # firewall-cmd --change-interface=enp0s3 --zone=external --permanent
  4. # firewall-cmd --change-interface=enp0s8 --zone=internal
  5. # firewall-cmd --change-interface=enp0s8 --zone=internal --permanent

对于我们当前的设置,内部区域(internal) - 以及和它一起启用的任何东西都是默认区域:


  1. # firewall-cmd --set-default-zone=internal

下一步,让我们重载防火墙规则并保持状态信息:


  1. # firewall-cmd --reload

最后,在 web 服务器中添加2号路由器为默认网关:


  1. # ip route add default via 10.0.0.18

现在你会发现在 web 服务器中你可以 ping 1号路由器和外部网站(例如 tecmint.com):


  1. # ping -c 2 192.168.0.1
  2. # ping -c 2 tecmint.com

验证网络路由

验证网络路由

在 RHEL 7 中设置内核运行时参数

在 Linux 中,允许你更改、启用以及停用内核运行时参数,RHEL 也不例外。当操作条件发生变化时,/proc/sys 接口(sysctl)允许你实时设置运行时参数改变系统行为,而不需太多麻烦。

为了实现这个目的,会用 shell 内建的 echo 写 /proc/sys/<category> 中的文件,其中 <category> 一般是以下目录中的一个:

  • dev: 连接到机器中的特定设备的参数。
  • fs: 文件系统配置(例如 quotas 和 inodes)。
  • kernel: 内核配置。
  • net: 网络配置。
  • vm: 内核的虚拟内存的使用。

要显示所有当前可用值的列表,运行


  1. # sysctl -a | less

在第一部分中,我们通过以下命令改变了 net.ipv4.ip_forward 参数的值以允许 Linux 机器作为一个路由器。


  1. # echo 1 > /proc/sys/net/ipv4/ip_forward

另一个你可能想要设置的运行时参数是 kernel.sysrq,它会启用你键盘上的 Sysrq 键,以使系统更好的运行一些底层功能,例如如果由于某些原因冻结了后重启系统:


  1. # echo 1 > /proc/sys/kernel/sysrq

要显示特定参数的值,可以按照下面方式使用 sysctl


  1. # sysctl <parameter.name>

例如,


  1. # sysctl net.ipv4.ip_forward
  2. # sysctl kernel.sysrq

有些参数,例如上面提到的某个,只需要一个值,而其它一些(例如 fs.inode-state)要求多个值:

查看内核参数

查看内核参数

不管什么情况下,做任何更改之前你都需要阅读内核文档。

请注意系统重启后这些设置会丢失。要使这些更改永久生效,我们需要添加内容到 /etc/sysctl.d 目录的 .conf 文件,像下面这样:


  1. # echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/10-forward.conf

(其中数字 10 表示相对同一个目录中其它文件的处理顺序)。

并用下面命令启用更改:


  1. # sysctl -p /etc/sysctl.d/10-forward.conf

总结

在这篇指南中我们解释了基本的包过滤、网络地址变换和在运行的系统中设置内核运行时参数并使重启后能持久化。我希望这些信息能对你有用,如往常一样,我们期望收到你的回复!


本文来自云栖社区合作伙伴“Linux中国”,原文发布日期:2015-10-24

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
在SQL service或Oracle中将数字转换成有千位符号
1、在SQL service中的写法: 1 --Function主体 2 CREATE FUNCTION [dbo].[FnMoneyStyle](@Number float,@strType char(1)) 3 RETURNS VARCHAR(100) 4 AS 5 BE...
971 0
js中ip地址与整数的相互转换
转载地址 //IP转成整型function _ip2int(ip) {    var num = 0;    ip = ip.split(".");    num = Number(ip[0]) * 256 * 256 * 256 + Number(ip[1]) * 256 * 256 + Num...
714 0
Java基础-22总结登录注册IO版,数据操作流,内存操作流,打印流,标准输入输出流,转换流,随机访问流,合并流,序列化流,Properties
你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流QQ群553841695 分享是一种美德,分享更快乐! 1:登录注册IO版本案例(掌握) 要求,对着写一遍。 cn.i
1727 0
【汇编语言/底层开发】7、更灵活的定位内存地址方法
1、[bx+idata] 通常情况下,我们使用ds和[bx]指定内存中的一个内存单元。而[bx+idata]所表示的是一种更加灵活的方式来定位内存地址,其表示的是段地址为DS,偏移地址为(bx)+idata的内存位置。
907 0
flutter网络dio框架公共请求参数、请求header使用总结
> 本文章将讲述 > 1.get请求中配置公共参数 > 2.post请求配置公共参数 > 3.请求header配置
565 0
linux内存管理---物理地址、线性地址、虚拟地址、逻辑地址之间的转换
linux内存管理---虚拟地址、逻辑地址、线性地址、物理地址的区别(一) 这篇文章中介绍了四个名词的概念,下面针对四个地址的转换进行分析 CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步(如下图): 首先,将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址, 其次,再利用其页式内存管理单元,转换为最终物理地址。
909 0
PostgreSQL 11 内核优化 - 降低vacuum cleanup阶段index scan概率 ( vacuum_cleanup_index_scale_factor , skip index vacuum cleanup stage)
PostgreSQL 11 内核优化 - 降低vacuum cleanup阶段index scan概率 ( vacuum_cleanup_index_scale_factor , skip index vacuum cleanup stage)
594 0
QGraphicsItem的类型检测与转换
简述 由于 QGraphicsScene 和 QGraphicsItem 的大多数便利函数(例如:items(),selectedItems()、collidingItems()、childItems())返回一个 QList&lt;QGraphicsItem *&gt; 列表,在遍历列表的时候,通常需要对其中的 QGraphicsItem 进行类型检测与转换,以确定实
2056 0
+关注
5854
文章
223
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载