avatar

甄天祥-Linux-个人小站

A text-focused Halo theme

  • 首页
  • 分类
  • 标签
  • 关于
Home Linux 双网卡网络回包问题
文章

Linux 双网卡网络回包问题

Posted 2025-03-20 Updated 2025-04- 2
By Administrator
22~28 min read

一、背景

  • 办公网:172.16.246.171/24

  • 内网:192.168.0.0/16

最近我在使用 ESXI 和 vCenter 虚拟机工具,由于服务器网卡不是很多,只有4张卡,并且2个电口2个光口,由于没有使用光口交换机只有电口交换机,所以也就使用的电口网卡

由于创建虚拟机不想影响到办公网络,于是我就想创建一台虚拟机,给虚拟机使用两张虚拟网卡(端口组),这样一来区分开虚拟机外网地址(办公网)和虚拟机内网地址,这样一来后面的虚拟机想要上网的话可以,以 192.168.0.1 为网关,然后路由转发到 172.16.246.0/24 网络环境中,从而实现 nat 上网。

二、现象

当我配置好网卡之后,发现只有处于办公网络(二层)网络下才能正常 ping 通虚拟机的外网地址,但是如果经过路由器来访问虚拟机的办公地址的话是无法 ping 通的

1-pvrz.png

2-nfru.png

关闭内网地址网卡恢复正常

3-kvmp.png

4-dybw.png

三、初步怀疑

ping 请求包 可能从三层网络经过路由器进入,进行路由规则找到 172.16.246.0/24 网络地址池,然后经过查找 ARP 协议找到对应的 Mac 地址最后下发到虚拟机上,此时是通过 ens192 进入的入向流量。但是回包的时候,系统可能从 ens224 网卡进行的回包,但是这是一个仅主机内网的地址,他无法经过上层路由进行汇报,因为上游路由协议中没有这个内网的相关 ARP 协议以及路由条目。

1. 策略路由(PBR)

设置一个策略路由,让 172.16.246.0/24 网段的流量始终走 ens192

# 临时生效
[root@localhost ~]# ip rule add from 172.16.246.171 table 100
[root@localhost ~]# ip route add default via 172.16.246.1 dev ens192 table 100

# 永久生效
[root@localhost ~]# vim /etc/sysconfig/network-scripts/rule-ens192
ip rule add from 172.16.246.171 table 100
ip route add default via 172.16.246.1 dev ens192 table 100

[root@localhost ~]# systemctl restart network

5-pilm.png

2. 验证效果

6-hcig.png

小结论:这也就是为什么二层网络中你能 ping 通,三层网路中你无法ping 通,因为二层网络设备之间互相通信是相互寻找 Mac 地址,而不会经过路由条目。

四、配置端口映射

如果想通过外网地址登陆过着访问到内网地址的服务可以使用端口映射

1. 创建规则

[root@localhost ~]# iptables -t nat -A PREROUTING -d 172.16.246.171 -p tcp --dport 2021 -j DNAT --to-destination 11.0.1.11:22

[root@localhost ~]# iptables -t nat -A POSTROUTING -d 11.0.1.11 -p tcp --dport 22 -j MASQUERADE

[root@localhost ~]# iptables -t nat -vnL PREROUTING --line-numbers
Chain PREROUTING (policy ACCEPT 361 packets, 21607 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1        0     0 DNAT       tcp  --  *      *       0.0.0.0/0            172.16.246.171       tcp dpt:2021 to:192.168.0.11:22

[root@localhost ~]# iptables -t nat -vnL POSTROUTING --line-numbers
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination         
1     3889  209K mt_rtr_4_n_rtr  all  --  *      *       0.0.0.0/0            0.0.0.0/0           
2        0     0 MASQUERADE  tcp  --  *      *       0.0.0.0/0            192.168.0.11            tcp dpt:22

2. 测试

从其他的机器上登陆,本地是不可以的

[root@mirrors ~]# ssh -p 2021 172.16.246.171
The authenticity of host '[172.16.246.171]:2021 ([172.16.246.171]:2021)' can't be established.
ECDSA key fingerprint is SHA256:ceiwc3ljUuyHsVARtkszD21dlojadTVczEbGXxcPFUE.
ECDSA key fingerprint is MD5:09:1d:10:01:2b:cf:bb:4c:d8:4f:49:43:d8:37:2f:fe.
Are you sure you want to continue connecting (yes/no)? 

四、为什么会这样

Linux 的 路由决策机制 是基于 最长前缀匹配(LPM)+ Metric 权重:

  1. 两张网卡都匹配 IP 包,但是 192.168.0.0/16 和 172.16.246.0/24 都是直连网络。

  2. Metric 小的优先,ens192 的 Metric 是 100,ens224 是 101,所以默认流量优先走 ens192。

  3. 但 返回流量(Reply Packets) 不一定会走 ens192,因为:

    • Linux 可能根据源地址选择 ens224 进行回包,导致问题。

    • 这个现象在 Linux 的 反向路径过滤(rp_filter)未启用 时更容易发生。

五、多种办法

1. 策略路由(PBR)

ip rule 让 172.16.246.171 只走 ens192

[root@localhost ~]# ip rule add from 172.16.246.171 table 100
[root@localhost ~]# ip route add default via 172.16.246.1 dev ens192 table 100

2. arp_ignore & arp_filter 限制 ARP 响应

  • arp_ignore = 1 让 Linux 只在绑定该 IP 的网卡上响应 ARP 请求,防止错误的网卡响应。

  • arp_filter = 1 让 Linux 根据最佳路由选择正确的接口响应 ARP,避免流量走错。

在多网卡环境(如 ens192 和 ens224)下,强烈建议开启这两个参数,可以有效避免 非对称路由和 ARP 响应异常。

# 临时生效
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/ens224/arp_ignore
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/ens224/arp_filter

# 永久生效
[root@localhost ~]# cat >> /etc/sysctl.conf <<EOF
net.ipv4.conf.all.arp_ignore = 1
net.ipv4.conf.ens192.arp_ignore = 1
net.ipv4.conf.ens224.arp_ignore = 1
EOF

[root@localhost ~]# sysctl -p

3. 启用 rp_filter(反向路径过滤)

rp_filter 是 Linux 内核中的 反向路径过滤机制,用于防止 源地址欺骗(IP Spoofing) 和 非对称路由 问题。

工作原理

当 rp_filter 启用时,Linux 内核会检查 进入数据包的源 IP 地址,如果发现该 IP 不能从同一接口返回,就会直接丢弃该数据包。

# 临时生效
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
[root@localhost ~]# echo 1 > /proc/sys/net/ipv4/conf/default/rp_filter

# 永久生效
[root@localhost ~]# cat >> /etc/sysctl.conf <<EOF
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
EOF

[root@localhost ~]# sysctl -p

Linux系统与应用
路由规则
License:  CC BY 4.0
Share

Further Reading

Aug 6, 2025

Linux 使用 lvm 管理设备挂载分区

LVM(逻辑卷管理)是Linux环境下用于灵活管理磁盘分区的机制。它允许管理员将多个磁盘分区整合为一个卷组,形成存储池,并在卷组上创建逻辑卷以供使用。LVM的主要优点包括:文件系统大小不受物理磁盘限制、可在线扩展文件系统、支持新磁盘添加到存储池中、数据冗余以及方便的数据迁移。然而,LVM也存在一些局限性,比如移除磁盘时的操作复杂性、单个磁盘故障可能影响整个卷组、不能减小文件系统大小以及可能影响存储性能。LVM的基本组成包括物理卷(PV)、卷组(VG)、逻辑卷(LV)和物理块(PE)。创建LVM的过程涉及初始化物理卷、创建卷组、创建逻辑卷、格式化逻辑卷、挂载并配置自动挂载等步骤。通过这些操作,LVM提供了一种高效且灵活的方式来管理和扩展Linux系统的存储资源。

May 19, 2025

Linux 运维常用脚本和工具

本文档详细介绍了多个脚本及其用途,涵盖了ETCD备份、远程同步、Harbor仓库同步、压缩与解压缩、计划任务、网站健康监控、带宽流量统计、MySQL查询、SSH管理及K8S相关操作等。以下是每个部分的简洁摘要: ### 一、ETCD 备份 - **主程序脚本**:通过选择健康的ETCD节点进行快照备份,并删除超过7天的旧备份。 - **systemd 管理脚本**:配置systemd服务以定时执行ETCD备份。 - **systemd 定时任务**:每4小时运行一次ETCD备份。 ### 二、远程同步 - **定时远程同步本地文件**:每天凌晨1点将最新的6个ETCD备份文件同步到远程服务器。 - **脚本本地目录同步到远程**:同步本地目录(如mysql-backup、pgsql-backup和mongodb-backup)到远程服务器,支持重试机制并记录日志。 ### 三、Harbor 仓库远程自动同步 - **harbor-sync.sh**:自动同步A仓库的镜像到B仓库,支持守护模式和日志记录。 - **systemd 管理脚本**:配置systemd服务以持续运行Harbor同步脚本。 ### 四、常用Shell脚本 - **解压缩**:使用`tar`和`pigz`进行多线程压缩和解压缩。 - **计划任务**:同步本地最新目录到远端,执行脚本自动导入数据库。 - **循环探活网站**:使用`curl`和`ping`定期检查多个URL的健康状态。 - **带宽流量统计**:使用Python脚本统计多台服务器的出入口带宽流量。 - **参数化同步脚本**:灵活备份任意目录到远程位置,支持多种选项和错误处理。 ### 五、MySQL 常用语法 - **查询数据库存储使用大小**:查询整个数据库或单个数据库的存储使用情况。 ### 六、SSH 操作相关脚本 - **测试远程登录**:批量测试多个主机的SSH连接。 - **维护用户名密码**:批量修改密码、创建用户、设置sudo权限和修复SSH端口。 - **配置免密登录**:批量配置多台主机的SSH免密登录。 - **自动化远程机器执行脚本**:批量上传并执行本地脚本到远程机器,支持危险命令检测。 ### 七、K8S 和容器相关脚本 - **根据域名查询Ingress**:查询所有命名空间中匹配特定域名的Ingress及其TLS Secret。 - **更新Ingress使用的Secret**:更新指定域名的Ingress所使用的TLS证书。 这些脚本提供了从备份、同步、监控到自动化管理的一系列功能,适用于多种运维场景。

Mar 20, 2025

Linux 双网卡网络回包问题

一、背景 办公网:172.16.246.171/24 内网:192.168.0.0/16 最近我在使用 ESXI 和 vCenter 虚拟机工具,由于服务器网卡不是很多,只有4张卡,并且2个电口2个光口,由于没有使用光口交换机只有电口交换机,所以也就使用的电口网卡 由于创建虚拟机不想影响到办公网络,

OLDER

企业级别部署 Harbor 私有镜像仓库

NEWER

Kubernetes 部署 Mysql 8.0.32 MGR 高可用集群

Recently Updated

  • Kubernetes 安装部署 Alist 并配置 Onlyoffice
  • KubeSphere-04-Dev-ops 流水线插件的使用
  • KubeSphere-03-Logging 日志插件的使用
  • KubeSphere-02-Service Mesh 的使用
  • KubeSphere-01-介绍与基础使用

Trending Tags

KVM Service Mesh Docker shell 路由规则 Mysql Containerd GitOps 网络设备 Prometheus

Contents

©2025 甄天祥-Linux-个人小站. Some rights reserved.

Using the Halo theme Chirpy