569305227 发表于 2025-5-25 14:09:00

Linux基于Vxlan透传交换机vlan建立ospf邻居

本帖最后由 569305227 于 2025-5-28 10:11 编辑

<p>Linux 基于 VXLAN 透传交换机 VLAN 建立 OSPF 邻居实验指南</p>
<h2>一、实验概述</h2>
<p>本实验旨在于两台 Linux 设备之间通过配置 VXLAN 隧道,模拟二层专线通信,将两台分别连接到 Linux 设备的交换机上的特定 VLAN 流量(包含 OSPF 报文)透明地传输过去,最终实现跨越底层网络的交换机在该 VLAN 内建立 OSPF 邻居关系。</p>
<p><img src="data/attachment/forum/202505/25/140440bw1ecaeeimg91338.png" alt="image.png" title="image.png" /></p>
<h2>二、实验设备清单</h2>
<ul>
<li>两台支持 VLAN Trunking 和 OSPF 的交换机。</li>
<li>两台安装 Linux 操作系统(内核版本支持 VXLAN)的设备。</li>
<li>核心要求:两台 Linux 设备(即 VXLAN 隧道端点 VTEP)之间具备 IP 层可达性。这里我使用管理接口来自动下发IP地址</li>
</ul>
<h2>三、技术原理</h2>
<p>实验的关键在于在 Linux 设备上构建一个二层网桥 (<code>br0</code>),并将连接本地网络的接口 (<code>eth1</code>) 和 VXLAN 接口 (<code>vxlan0</code>) 加入该网桥。</p>
<ol>
<li>连接本地交换机的接口 (<code>eth1</code>) 配置为混杂模式,接收包含 VLAN 标签的二层报文。</li>
<li>这些报文进入网桥 (<code>br0</code>)。</li>
<li>网桥根据目的 MAC 地址学习到的转发表决定出接口。如果目的 MAC 地址在对端 VXLAN 接口 (<code>vxlan0</code>) 学习到,网桥会将报文转发至 <code>vxlan0</code>。</li>
<li>VXLAN 接口 (<code>vxlan0</code>) 对接收到的二层报文进行 VXLAN 封装:
<ul>
<li>
<p>在外层添加 VXLAN 头部(包含 VNI)。<br />
绿色部分为vxlan封装<br />
黄色部分为原始封装,图是我后补的,看现象就行</p>
<p><img src="data/attachment/forum/202505/28/100908zpsqq13rl61oe1eu.png" alt="image.png" title="image.png" /></p>
</li>
<li>
<p>在外层添加 UDP 头部(默认目标端口 4789,但是我这个实验linux生成的是8472)。</p>
<p><img src="data/attachment/forum/202505/25/140532mu5w8ewtzi5i8a80.png" alt="image.png" title="image.png" /></p>
</li>
<li>
<p>在外层添加新的 IP 头部(源 IP 为本地 VTEP IP,目的 IP 为对端 VTEP IP)。</p>
</li>
<li>
<p>在外层添加底层网络的数据链路层头部。</p>
</li>
</ul>
</li>
<li>封装后的 IP 报文通过承载 VXLAN 流量的物理接口 (<code>eth0</code>) 在底层网络中传输到对端 Linux 设备。</li>
<li>对端 Linux 设备的 <code>eth0</code> 接收到 VXLAN 报文后,经过网络协议栈,最终由对端的 <code>vxlan0</code> 接口处理。</li>
<li>对端 <code>vxlan0</code> 接口解封装,剥离外层头部,恢复原始的二层报文(包含原始的 VLAN 标签)。</li>
<li>解封装后的二层报文进入对端的网桥 (<code>br0</code>)。</li>
<li>网桥将报文转发至连接本地交换机的接口 (<code>eth1</code>)。</li>
<li>本地交换机接收到带有原始 VLAN 标签的报文,并进行进一步处理(如 OSPF 邻居发现等)。</li>
</ol>
<p>整个过程对于上层应用(如交换机上的 OSPF)来说是透明的,仿佛通过一根二层链路直连。</p>
<h2>四、节点配置规划</h2>
<p>为了清晰起见,我们将两个 Linux 节点分别称为 Node A 和 Node B。</p>
<h3>(一)Node A</h3>
<table>
<thead>
<tr>
<th align="left">参数</th>
<th align="left">配置值</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><strong>物理传输接口</strong></td>
<td align="left"><code>eth0</code></td>
<td align="left">连接底层网络,用于 VXLAN 报文的传输</td>
</tr>
<tr>
<td align="left"><strong>本地接入接口</strong></td>
<td align="left"><code>eth1</code></td>
<td align="left">连接本地交换机,处理原始 VLAN 流量</td>
</tr>
<tr>
<td align="left"><strong>本地 VTEP IP</strong></td>
<td align="left"><code>192.168.17.133</code></td>
<td align="left">配置在 <code>eth0</code> 接口上,作为 VXLAN 源 IP</td>
</tr>
<tr>
<td align="left"><strong>远程 VTEP IP</strong></td>
<td align="left"><code>192.168.17.134</code></td>
<td align="left">Node B 的 VTEP IP,作为 VXLAN 目标 IP</td>
</tr>
<tr>
<td align="left"><strong>VNI (VXLAN ID)</strong></td>
<td align="left"><code>100</code></td>
<td align="left">标识 VXLAN 网段,通信双方需一致</td>
</tr>
<tr>
<td align="left"><strong>Linux 网桥</strong></td>
<td align="left"><code>br0</code></td>
<td align="left">桥接 <code>eth1</code> 和 <code>vxlan0</code></td>
</tr>
<tr>
<td align="left"><strong>VXLAN 接口</strong></td>
<td align="left"><code>vxlan0</code></td>
<td align="left">基于 VNI 100 创建</td>
</tr>
</tbody>
</table>
<h3>(二)Node B (对称配置)</h3>
<table>
<thead>
<tr>
<th align="left">参数</th>
<th align="left">配置值</th>
<th align="left">说明</th>
</tr>
</thead>
<tbody>
<tr>
<td align="left"><strong>物理传输接口</strong></td>
<td align="left"><code>eth0</code></td>
<td align="left">连接底层网络,用于 VXLAN 报文的传输</td>
</tr>
<tr>
<td align="left"><strong>本地接入接口</strong></td>
<td align="left"><code>eth1</code></td>
<td align="left">连接本地交换机,处理原始 VLAN 流量</td>
</tr>
<tr>
<td align="left"><strong>本地 VTEP IP</strong></td>
<td align="left"><code>192.168.17.134</code></td>
<td align="left">配置在 <code>eth0</code> 接口上,作为 VXLAN 源 IP</td>
</tr>
<tr>
<td align="left"><strong>远程 VTEP IP</strong></td>
<td align="left"><code>192.168.17.133</code></td>
<td align="left">Node A 的 VTEP IP,作为 VXLAN 目标 IP</td>
</tr>
<tr>
<td align="left"><strong>VNI (VXLAN ID)</strong></td>
<td align="left"><code>100</code></td>
<td align="left">标识 VXLAN 网段,通信双方需一致</td>
</tr>
<tr>
<td align="left"><strong>Linux 网桥</strong></td>
<td align="left"><code>br0</code></td>
<td align="left">桥接 <code>eth1</code> 和 <code>vxlan0</code></td>
</tr>
<tr>
<td align="left"><strong>VXLAN 接口</strong></td>
<td align="left"><code>vxlan0</code></td>
<td align="left">基于 VNI 100 创建</td>
</tr>
</tbody>
</table>
<p><strong>注意:</strong> 实际部署时,请根据您的网络环境调整接口名称(如 <code>eth0</code>, <code>eth1</code> 可能在您的系统上是 <code>ens33</code>, <code>enp0s8</code> 等)和 IP 地址。确保 <code>eth0</code> 接口所在的 IP 网络 (<code>192.168.17.0/24</code> 在示例中) 在 Node A 和 Node B 之间是可路由的。</p>
<h2>五、操作步骤 (Node A/B 通用)</h2>
<p>以下步骤在两台 Linux 设备上均需执行,注意根据 Node A/B 的规划修改 IP 地址。</p>
<p><strong>重要提示:</strong> 以下 <code>ip</code> 命令的配置是临时性的,系统重启后会丢失。生产环境中请使用网络管理工具(如 netplan, networkd, ifupdown 或 NetworkManager)进行持久化配置。</p>
<h3>(一)加载 Vxlan 内核模块</h3>
<pre><code class="language-bash">sudo modprobe vxlan # 加载 vxlan 模块
lsmod | grep vxlan# 检查模块是否加载成功
</code></pre>
<h3>(二)配置物理传输接口 (eth0)</h3>
<p>为用于承载 VXLAN 流量的物理接口配置 IP 地址并启用。</p>
<pre><code class="language-bash"># 示例命令(根据 Node A/B 的规划和实际接口名称调整)
# --- Node A ---
# sudo ip addr add 192.168.17.133/24 dev eth0
# sudo ip link set eth0 up

# --- Node B ---
# sudo ip addr add 192.168.17.134/24 dev eth0
# sudo ip link set eth0 up

# 确认配置
ip addr show eth0
ip link show eth0
</code></pre>
<h3>(三)启用本地接入接口 (eth1)</h3>
<p>启用连接本地交换机的接口。注意,此接口无需配置 IP 地址,其二层流量由网桥处理。</p>
<pre><code class="language-bash"># 示例命令(根据实际接口名称调整)
# sudo ip link set eth1 up

# 确认状态
ip link show eth1
</code></pre>
<h3>(四)创建 Linux 网桥 (br0)</h3>
<pre><code class="language-bash">sudo ip link add name br0 type bridge # 创建网桥设备 br0

# 确认创建成功
ip link show br0
</code></pre>
<h3>(五)创建 Vxlan 接口 (vxlan0)</h3>
<p>创建一个 VXLAN 类型的虚拟接口,指定 VNI、本地 VTEP IP、对端 VTEP IP 以及承载 VXLAN 流量的物理接口 (<code>eth0</code>)。</p>
<pre><code class="language-bash"># 示例命令(根据 Node A/B 的规划调整)
# --- Node A ---
sudo ip link add name vxlan0 type vxlan id 100 local 192.168.17.133 remote 192.168.17.134 dev eth0

# --- Node B ---
# sudo ip link add name vxlan0 type vxlan id 100 local 192.168.17.134 remote 192.168.17.133 dev eth0

# 确认创建成功
ip link show vxlan0
</code></pre>
<ul>
<li><code>id 100</code>:指定 VXLAN 网络标识 (VNI),两端必须一致。</li>
<li><code>local &lt;本地IP&gt;</code>:指定本地 VTEP 的源 IP 地址,必须配置在 <code>dev</code> 指定的接口上。</li>
<li><code>remote &lt;对端IP&gt;</code>:指定对端 VTEP 的 IP 地址。</li>
<li><code>dev eth0</code>:指定承载 VXLAN 封装报文的物理接口,此接口必须配置了 <code>local</code> 指定的 IP 地址且 IP 可达对端 <code>remote</code> IP。</li>
</ul>
<h3>(六)将本地接入接口和 Vxlan 接口加入网桥</h3>
<p>将 <code>eth1</code> (连接本地交换机) 和 <code>vxlan0</code> 加入到 <code>br0</code> 网桥中。</p>
<pre><code class="language-bash"># 将 eth1 加入网桥
sudo ip link set eth1 master br0

# 将 vxlan0 加入网桥
sudo ip link set vxlan0 master br0

# 确认接口已加入网桥 (可使用 brctl 或 ip 命令)
brctl show # 可能需要安装 bridge-utils
ip link show master br0
</code></pre>
<h3>(七)启用网桥和 Vxlan 接口</h3>
<p>使能网桥和 VXLAN 接口。</p>
<pre><code class="language-bash">sudo ip link set br0 up
sudo ip link set vxlan0 up

# 确认状态
ip link show br0
ip link show vxlan0
</code></pre>
<p>至此,Linux 端的 VXLAN 隧道和网桥配置完成。连接到 <code>eth1</code> 的本地交换机将能够通过 VXLAN 隧道与对端交换机进行二层通信。</p>
<h2>六、交换机配置示例</h2>
<p>假设两台交换机通过 Linux 设备上的 <code>eth1</code> 接口接入 VXLAN 隧道。我们需要在交换机上配置相同的 VLAN ID(如 100)和 OSPF 进程/区域。交换机与 Linux <code>eth1</code> 连接的端口应配置为 Trunk 或允许指定 VLAN 通过。</p>
<h3>(一)交换机 1 配置示例</h3>
<p>假设连接 Linux Node A <code>eth1</code> 的物理接口是 <code>HundredGigE1/0/1</code>。我们希望在 VLAN 100 中运行 OSPF。</p>
<pre><code class="language-plaintext"># 进入系统视图
system-view

# 创建并配置 VLAN 100
vlan 100
quit

# 配置物理接口 HundredGigE1/0/1
interface HundredGigE1/0/1
port link-mode bridge # 配置为桥接模式(二层转发)
port link-type trunk# 配置为 Trunk 端口
port trunk permit vlan 100 # 允许 VLAN 100 通过
# 可选:配置 PVID 如果需要处理 untagged 流量,但此实验场景通常只传 tagged
# port trunk pvid vlan 1 # 示例
quit

# 创建 VLAN 接口并配置 IP(用于 VLAN 100 内的通信和 OSPF 邻居建立)
interface Vlan-interface100
ip address 100.1.1.1 255.255.255.0
quit

# 启用 OSPF 进程
ospf 1 router-id 100.1.1.1 # router-id 可选,建议配置
# 进入 OSPF 区域 0
area 0.0.0.0
# 在 VLAN 接口 100 上使能 OSPF
network 100.1.1.0 0.0.0.255 # 在 VLAN 100 网段宣告 OSPF

# (可选) passive-interface default 阻止在其他接口发送 OSPF hello
# passive-interface default
# undo passive-interface Vlan-interface100 # 允许在 VLAN 100 接口发送 hello
quit
quit

# 保存配置 (根据交换机型号使用对应的命令)
# save
</code></pre>
<p><strong>注意:</strong> 有些交换机可能使用子接口 (<code>GigabitEthernet1/0/1.100</code>) 并配置 <code>dot1q termination vid 100</code> 来处理带标签的 VLAN 流量。示例中使用了 VLAN 接口(<code>Vlan-interface100</code>)配合物理口的trunk配置,这是另一种常见方式。两种方式的目的都是让交换机能在物理端口上收发带 VLAN 100 标签的报文,并在逻辑上的 VLAN 100 接口上运行 OSPF。</p>
<h3>(二)交换机 2 配置示例</h3>
<p>假设连接 Linux Node B <code>eth1</code> 的物理接口是 <code>HundredGigE1/0/1</code>。</p>
<pre><code class="language-plaintext"># 进入系统视图
system-view

# 创建并配置 VLAN 100
vlan 100
quit

# 配置物理接口 HundredGigE1/0/1
interface HundredGigE1/0/1
port link-mode bridge # 配置为桥接模式
port link-type trunk# 配置为 Trunk 端口
port trunk permit vlan 100 # 允许 VLAN 100 通过
quit

# 创建 VLAN 接口并配置 IP
interface Vlan-interface100
ip address 100.1.1.2 255.255.255.0
quit

# 启用 OSPF 进程
ospf 1 router-id 100.1.1.2
area 0.0.0.0
network 100.1.1.0 0.0.0.255
# (可选) passive-interface default
# passive-interface default
# undo passive-interface Vlan-interface100
quit
quit

# 保存配置
# save
</code></pre>
<h2>七、验证要点</h2>
<p>完成上述配置后,按照以下步骤进行验证:</p>
<ol>
<li><strong>检查 Linux 接口和网桥状态:</strong>
<ul>
<li>使用 <code>ip addr show</code> 确认 <code>eth0</code> 配置了正确的 IP 地址且状态为 <code>UP</code>。</li>
<li>使用 <code>ip link show</code> 确认 <code>eth1</code>, <code>br0</code>, <code>vxlan0</code> 接口状态为 <code>UP</code>。</li>
<li>使用 <code>ip link show master br0</code> 或 <code>brctl show</code> 确认 <code>eth1</code> 和 <code>vxlan0</code> 已正确加入 <code>br0</code> 网桥。</li>
<li>检查 <code>vxlan0</code> 的配置是否正确 (<code>ip -d link show vxlan0</code>),特别是 VNI, local, remote, dev 等参数。</li>
</ul>
</li>
<li><strong>测试 VTEP 之间 IP 连通性:</strong>
<ul>
<li>在 Node A 上 <code>ping 192.168.17.134</code> (Node B 的 VTEP IP)。</li>
<li>在 Node B 上 <code>ping 196.168.17.133</code> (Node A 的 VTEP IP)。</li>
<li>这是 VXLAN 隧道建立的基础,必须保证底层 IP 网络可达。</li>
</ul>
</li>
<li><strong>检查 Linux 网桥学习到的 MAC 地址:</strong>
<ul>
<li>使用 <code>bridge fdb show</code> (或 <code>brctl showmacs br0</code>) 查看网桥的 MAC 地址转发表。</li>
<li>交换机上 VLAN 100 接口的 MAC 地址应该在对端的 <code>vxlan0</code> 接口上学到。</li>
<li>示例输出可能类似:<code>aa:bb:cc:dd:ee:ff dev vxlan0 dst 192.168.17.134</code> (其中 <code>aa:bb:cc:dd:ee:ff</code> 是对端交换机 VLAN 100 接口的 MAC 地址)。</li>
</ul>
</li>
<li><strong>在交换机上验证 VLAN 100 接口的连通性:</strong>
<ul>
<li>在交换机 1 上 <code>ping 100.1.1.2</code> (交换机 2 的 VLAN 100 IP)。</li>
<li>在交换机 2 上 <code>ping 100.1.1.1</code> (交换机 1 的 VLAN 100 IP)。</li>
<li>如果 ping 不通,检查交换机接口配置(trunking, permitted VLANs)、VLAN 接口状态、IP 地址和子网掩码。</li>
</ul>
</li>
<li><strong>在交换机上查看 OSPF 邻居:</strong>
<ul>
<li>
<p>在两台交换机上使用命令 <code>display ospf peer</code> (或 <code>show ip ospf neighbor</code> 等,具体命令取决于交换机厂商)。</p>
</li>
<li>
<p>如果配置正确,两台交换机应该能在 VLAN 100 接口上建立 OSPF Full 邻居关系。</p>
<p><img src="data/attachment/forum/202505/25/140716qeubxb8bl3u8zrba.png" alt="image.png" title="image.png" /></p>
</li>
</ul>
</li>
<li><strong>抓包分析 (可选但推荐):</strong>
<ul>
<li>在 Linux Node A 的 <code>eth0</code> 接口上使用 <code>tcpdump -i eth0 -n 'udp port 4789'</code> 抓包。您应该能看到源 IP 192.168.17.133, 目标 IP 192.168.17.134, UDP 端口 4789 的 VXLAN 报文。展开报文可以看到内部封装了原始的以太网帧,其中包含 VLAN 100 标签和 OSPF 报文 (如果交换机正在发送 OSPF hello)。</li>
<li>在 Linux Node A 的 <code>eth1</code> 接口上使用 <code>tcpdump -i eth1 -n 'vlan 100'</code> 抓包。您应该能看到带 VLAN 100 标签的原始二层报文,例如 OSPF hello 报文。</li>
</ul>
</li>
</ol>
<h2>八、常见问题排查</h2>
<ul>
<li><strong>VTEP 之间 ping 不通:</strong> 检查 <code>eth0</code> IP 配置、子网掩码、路由表以及底层网络连通性(防火墙是否阻止了 ICMP 或 UDP )。</li>
<li><strong>VXLAN 接口或网桥未 UP:</strong> 使用 <code>ip link set &lt;interface&gt; up</code> 启用。</li>
<li><strong>接口未加入网桥:</strong> 使用 <code>ip link set &lt;interface&gt; master br0</code> 加入,并用 <code>brctl show</code> 或 <code>ip link show master br0</code> 确认。确保加入网桥的接口没有 IP 地址。</li>
<li><strong>交换机 VLAN 100 接口 ping 不通:</strong> 检查交换机 VLAN 配置、物理接口配置(trunk/access, permit VLANs, PVID)、VLAN 接口 IP 地址、子网掩码和状态。检查 Linux <code>eth1</code> 接口状态。</li>
<li><strong>OSPF 邻居建立不起来:</strong>
<ul>
<li>检查两端交换机 VLAN 100 接口的 IP 地址是否在同一网段。</li>
<li>检查 OSPF 进程、区域 ID 是否一致。</li>
<li>检查 OSPF Network 命令是否覆盖了 VLAN 100 的网段。</li>
<li>检查防火墙是否阻止了 OSPF 报文 (IP Protocol 89)。</li>
<li>抓包确认 OSPF hello 报文是否正常发送和接收。</li>
<li>检查 Linux 网桥的 MAC 地址学习表,确认交换机的 MAC 地址能在对端 vxlan0 接口学习到。</li>
</ul>
</li>
<li><strong>抓包发现没有 VXLAN 报文:</strong> 确认 <code>vxlan0</code> 接口已 UP 并加入网桥。确认有流量(例如交换机 VLAN 100 的 ARP 请求或 OSPF hello)进入 <code>br0</code> 并尝试从 <code>vxlan0</code> 发出(目标 MAC 在对端 vxlan0 学习到)。确认 VTEP IP 可达。确认内核模块已加载。</li>
</ul>

mmc2000 发表于 2025-6-3 20:42:21

不错···楼主辛苦了·················
页: [1]
查看完整版本: Linux基于Vxlan透传交换机vlan建立ospf邻居