linux防火墙添加ip(linux软件防火墙)

时间:2023-05-12 10:52:04

作者:admin

来源:系统大师

#大有学问#

简介:Linux秒变软路由?防火墙与 IP 伪装/端口映射。外网远程访问内网数据?【好玩的网络-私有云 08】

附经典案例,分析与解决方案

  • Linux 防火墙介绍
  • iptables 与 firewalld 介绍
  • nat 表,prerouting 链,postrouting 链
  • filter 表,forward 链
  • IP 伪装和端口映射的具体实现

本期约 3400 字,阅读时长 3 分钟。

视频教程:视频

IP 伪装规则(秒变路由器):

firewall-cmd –direct –add-passthrough ipv4 -t nat -A POSTROUTING -j MASQUERADE -o pppoe-eno1

firewall-cmd –direct –add-passthrough ipv6 -t nat -A POSTROUTING -j MASQUERADE -o pppoe-eno1

端口映射:

firewall-cmd –direct –add-passthrough ipv4 -t nat -A PREROUTING -p tcp –dport 51413 -j DNAT –to-destination 192.168.4.232:51414 -i pppoe-eno1

文档教程(私有云篇命令脚本):GitHub – yzeng1995/funNetworkPrivateCloud

软路由,防火墙,NAT,路由器,Linux,端口映射,远程访问,旋律果子,好玩的网络

linux防火墙添加ip(linux软件防火墙)

Hi,大家好,我是继续填坑的小伙伴旋律果子,一个专注于网络技术 Geek。教大家搭建 NAS 和软路由的私有云系列视频已经出了 7 期了,

linux防火墙添加ip(linux软件防火墙)

1.上期回顾

上一期讲了防火墙 filter 表的 input 链,

linux防火墙添加ip(linux软件防火墙)

filter 表的主要作用阻断恶意链接,而 input 方向入站的网络数据包威胁最大,所以我们一般在 filter 表的 input 链做安全规则,主要有开放端口、关闭端口,拒绝或允许某些源 IP 地址的数据包,拒绝数据包从某个网卡进入等操作。

linux防火墙添加ip(linux软件防火墙)

2.本期提纲

这一期,我们主要学习一下 nat 表的 prerouting 链和 postrouting 链。

linux防火墙添加ip(linux软件防火墙)

linux防火墙添加ip(linux软件防火墙)

分别对应着常说的端口映射和 IP 伪装。

linux防火墙添加ip(linux软件防火墙)

linux防火墙添加ip(linux软件防火墙)

在学习的过程中,一定要对着 netfilter 的流程图来进行理解。

linux防火墙添加ip(linux软件防火墙)

在看这期视频时,如果你没有听说过 IP 伪装和端口映射,可以先去补一下好玩的网络基础篇第 3 期路由器的相关内容,详细讲解了网络层与路由表,以及 NAT 地址转换等概念。

linux防火墙添加ip(linux软件防火墙)

了解之后,我们开始这一期的内容吧。

经典案例

我们先看一个实际的问题,比较典型。

linux防火墙添加ip(linux软件防火墙)

网络环境是这样,他在家中和办公室中都搭建了 NAS 服务器,管理页面的端口都是 5000/tcp 端口,两边都在 openwrt 系统的主路由中通过端口映射的方式将 NAS 的管理页面映射到公网的 9527/tcp 端口。

linux防火墙添加ip(linux软件防火墙)

现在,如果通过手机流量访问办公室、家里两地的公网地址,均可以正常访问到对应的 NAS 管理页面。

如果在上班的时候,手机连接办公室的局域网,仍然去访问家里的公网地址,结果发现访问到的却是办公室的 NAS。

linux防火墙添加ip(linux软件防火墙)

如果两边主路由的端口不一致,那么这个访问是一切正常的。

linux防火墙添加ip(linux软件防火墙)

大家可以先思考一下这个问题是怎么回事?我们等会就来一探究竟。

NAT 表

Nat 的全称是 network address translation,顾名思义,就是网络地址转换。

这里不仅仅包括数据包的源 IP 地址和目的 IP 地址,还包含源端口号和目的端口号。

linux防火墙添加ip(linux软件防火墙)

路由器的主要作用是什么呢?

就是根据路由表来为数据包做路径选择的,Prerouting 和 postrouting,也顾名思义,pre 就是“前”的意思,就是在进行路由选择之前先进行网络地址转换;

linux防火墙添加ip(linux软件防火墙)

post 就是“后”的意思,就是在路由选择之后再进行网络地址转换。

linux防火墙添加ip(linux软件防火墙)

要完成网络地址转换,我们首先得知道要转换哪些数据包的网络地址。

也就是需要识别数据包。一般情况下,我们可以通过 7 大参数来识别。

入站网卡、出站网卡,源 ip 地址、目的 ip 地址,源端口号和目的端口号以及协议类型。

linux防火墙添加ip(linux软件防火墙)

识别数据包之后,我们就要对这些数据包进行一定的操作。

Nat 表中有几个非常重要的操作,SNAT、DNAT 以及 MASQUERADE,SNAT 是修改源 IP 地址和源端口号,DNAT 是修改目的 IP 地址和目的端口号,要执行 SNAT 和 DNAT 必须指定修改后的内容。

linux防火墙添加ip(linux软件防火墙)

进行 DNAT 主要是进行端口映射将从公网来的数据包转发到内网主机,而内网主机的 ip 地址一般都是固定的,所以没什么问题。然而 SNAT 主要是为了做 IP 伪装,并且是伪装成公网地址,我们知道,我们的宽带一般能获取到的是动态公网 IP 地址,也是就是说一个网卡上的公网 IP 地址经常发生变化的,所以直接使用 SNAT 操作就没办法实时指定修改后的源 IP 地址。所以就有了 MASQUERADE,这是一种特殊的 SNAT。MASQUERADE 会将源 IP 地址自动修改为出口网卡上的 IP 地址。

从防火墙的角度观察内网数据包出去的过程

现在我们再来从防火墙的角度观察内网数据包出去的过程。路由器有两个网口,内网网口为 br-lan,外网网卡为 pppoe-eno1。

linux防火墙添加ip(linux软件防火墙)

实操演示 IP 伪装

我们直接给大家展示一下应该添加的 IP 伪装规则。

就这么 2 行命令,IP 伪装就添加好了,其中一条是针对 ipv4 的,另外一条是针对 ipv6 的。

linux防火墙添加ip(linux软件防火墙)

我们识别数据包是根据出口网卡来识别的,只要数据包从 pppoe-eno1 这个网卡出去,就会被这个规则识别到,进行 IP 伪装。

linux防火墙添加ip(linux软件防火墙)

例如内网的主机 192.168.4.167 访问百度 220.181.38.148,

linux防火墙添加ip(linux软件防火墙)

首先,数据包会从路由器的 lan 口进入。

linux防火墙添加ip(linux软件防火墙)

然后经过路由器的 prerouting 链,

linux防火墙添加ip(linux软件防火墙)

因为在 prerouting 链里没有写规则,所以数据包不发生任何变化;因为目标地址不是路由器本机,所以接下来走 filter 表的 forwarding 链,

linux防火墙添加ip(linux软件防火墙)

因为 lan 到 wan 的转发一般为允许,所以可以通过,

linux防火墙添加ip(linux软件防火墙)

接下来数据包会被转发给 wan 口网卡准备出站。随后数据包继续经过 nat 表的 postrouting 链,

linux防火墙添加ip(linux软件防火墙)

这里检测到数据包从 wan 口出来,所以进行 MASQUERADE 操作,

linux防火墙添加ip(linux软件防火墙)

将源 IP 地址修改为 wan 口本身的 IP 地址,随后将数据包传出去。

linux防火墙添加ip(linux软件防火墙)

linux防火墙添加ip(linux软件防火墙)

同时在会话表中生成一条记录,这个记录记录了数据包通过防火墙的全过程(NAT)。

linux防火墙添加ip(linux软件防火墙)

当数据包从百度返回时,首先会发送给路由器的 wan 口。

linux防火墙添加ip(linux软件防火墙)

路由器发现这个数据包符合会话表中的记录,直接根据会话表将数据包还原后传递给内网主机。

linux防火墙添加ip(linux软件防火墙)

这里需要注意的是,数据包只会经过一次 NAT 表,出去的时候通过了一次 NAT,回来的时候就不再进行 NAT 了。

linux防火墙添加ip(linux软件防火墙)

这就是内网的主机和外网的主机之间通讯的全过程了。只要做了这一条规则,内部的设备配置好 ip 地址、DNS、默认网关后,其实就已经可以正常上网了。

从外网访问内网主机端口映射的全过程

我们再来从防火墙的角度观察外网的主机通过路由器的公网 IP 访问内网主机的过程。首先我们需要在路由器中做端口映射。我们以 ipv4 来举例子,ipv6 也是同样的操作。

linux防火墙添加ip(linux软件防火墙)

例如,我们要将内网主机 192.168.4.232 的 51414/tcp 端口映射到公网的 51413/tcp 端口,这里指定了 tcp 协议,到主路由的目的端口号,入站的网卡,以及修改后的目的 ip 地址和端口号。

linux防火墙添加ip(linux软件防火墙)

从外部发来的数据包首先到达路由器的 wan 口,

linux防火墙添加ip(linux软件防火墙)

经过 nat 表的 prerouting 链,

linux防火墙添加ip(linux软件防火墙)

经过检测,发现入站网卡和端口都满足规则的要求。于是将数据包的目的 IP 地址和目的端口号修改为目标内网主机。接下来会经历一次路由选择,发现目的 IP 地址不是路由器本机而是内网的主机,所以走 filter 表的 forward 链。

linux防火墙添加ip(linux软件防火墙)

这里特别注意,走的不是 input 链而是 forward 链,所以在从 wan 口入站的 input 链配置的防火墙规则对此是不产生作用的。

linux防火墙添加ip(linux软件防火墙)

这就是为什么设置了端口映射之后,不需要再在 filter 表中开放端口的原因。如果经过 filter 表的 forward 链,数据包被 accept,那么会继续走 postrouting 链,

linux防火墙添加ip(linux软件防火墙)

然而从 lan 口出站在 postrouting 链不会产生什么效果,所以继续从路由器的 lan 口转发到内网的指定主机。

linux防火墙添加ip(linux软件防火墙)

同时也生成一条会话表的记录。

linux防火墙添加ip(linux软件防火墙)

当内网主机返回数据包时,先从 lan 口入站,发现数据包满足会话表的记录,直接根据会话表还原后从 wan 口发送给远端的客户端。

linux防火墙添加ip(linux软件防火墙)

这就是从外网访问内网主机端口映射的全过程了。

linux防火墙添加ip(linux软件防火墙)

案例分析与解决方案

那么最开始的那个问题是怎么回事呢?实际上是规则配置错误了。我们把这个规则给大家看一下

大家发现这个规则的问题了吗?大家可以暂停下来思考一下(2 秒)。

linux防火墙添加ip(linux软件防火墙)

因为从办公室访问家里的公网 IP 地址和 9527 端口,

linux防火墙添加ip(linux软件防火墙)

从 lan 口入站的时候,我们发现这个是满足 nat 表的 prerouting 链的。所以目的地址本来是指向家里的,但是直接被修改为办公室内网 NAS 服务器的 IP 地址,接下来在进行路由选择的时候,直接被转发给了内网的 NAS 服务器,所以发现访问到了办公室的 NAS 主机。我告诉他在设置规则时应该指定 wan 口网卡,配置后,此问题得到解决。

linux防火墙添加ip(linux软件防火墙)

这一期就到这里了,有问题可以评论区提问,我是旋律果子,一个网络极客,我们下期再见。

图文编辑: 旋律果子 猫小爪

旋律果子: 网络 Geek/Linux 开发者/中国科学院大学在读博士/科技数码博主/国家水利水电二级建造师/优质科技领域创作者

大家都在看

电脑教程专题 更多+

提取码
XGZS
关闭 前往下载