服务器使用的是ubuntu 20.04版本,出现的问题是我在192.168.40.43网段访问数据,时而通时而不通
我本地路由使用双lan网口,服务器是接入与本地不同的网口。

以下是服务器的网络配置:

vim /etc/netplan/00-installer-config.yaml


# This is the network config written by 'subiquity'
network:
  ethernets:
    ens3:
      dhcp4: false
      addresses:
      - 192.168.1.80/24
      gateway4: 192.168.1.1
      nameservers:
        addresses:
        - 192.168.1.1
      routes:
        - to: default
          via: 192.168.1.1
          metric: 100

    ens4:
      dhcp4: false
      addresses:
      - 192.168.8.80/24
      gateway4: 192.168.8.1
      nameservers:
        addresses:
        - 192.168.8.1
      #routes: []
      routes:
        - to: 192.168.8.0/24
          via: 192.168.8.1
          metric: 200
  version: 2

步骤:配置多路由表和路由规则

  1. 手动添加路由表
    为了使用多个路由表,需要编辑 /etc/iproute2/rt_tables 文件,为每个路由表添加一个条目。用以下命令编辑 rt_tables 文件并添加表项:

    sudo nano /etc/iproute2/rt_tables

    在文件的末尾添加如下内容:

    100    table1
    200    table2

    这些表名分别对应 ens3ens4

  2. 手动设置路由
    配置好路由表后,手动添加路由。首先,使用以下命令来为每个路由表添加默认路由:

    sudo ip route add default via 192.168.1.1 table table1
    sudo ip route add default via 192.168.8.1 table table2
  3. 配置路由规则
    接下来,需要为每个源地址添加路由规则,确保流量通过正确的路由表:

    sudo ip rule add from 192.168.1.80 table table1
    sudo ip rule add from 192.168.8.80 table table2

    这将确保从 192.168.1.80 发出的流量会使用 table1(即 ens3 的路由表),从 192.168.8.80 发出的流量会使用 table2(即 ens4 的路由表)。

  4. 保存路由规则
    为了确保每次重启后这些规则仍然有效,你可以将它们添加到系统启动脚本中。编辑 /etc/rc.local 文件(如果系统使用它)或创建一个新的启动脚本来执行这些命令。

    sudo nano /etc/rc.local

    exit 0 之前添加以下命令:

    ip route add default via 192.168.1.1 table table1
    ip route add default via 192.168.8.1 table table2
    ip rule add from 192.168.1.80 table table1
    ip rule add from 192.168.8.80 table table2
  5. 应用 netplan 配置

    使用 netplan 应用你的网络配置:

    sudo netplan apply
  6. 验证配置
    使用以下命令验证路由和路由规则是否正确:

    • 查看路由表:

      ip route show table table1
      ip route show table table2
    • 查看路由规则:

      ip rule show

总结

由于 netplan 不支持 routing-policy,我们采用了手动配置多路由表的方式,结合 ip rule 来为不同的源 IP 配置不同的路由表。这种方式能够解决路由冲突问题,并让你的服务器可以正确地通过不同的网卡与不同的网络进行通信。

在 Ubuntu 20.04 中,rc.local 文件默认是没有的,因为 Ubuntu 已经转向了 systemd 来管理系统服务和启动任务。不过,你可以通过创建一个 systemd 服务单元 来执行启动时的自定义命令。

创建一个 systemd 服务来代替 rc.local

  1. 创建一个自定义的 systemd 服务单元文件

    你需要为你的自定义命令创建一个 systemd 服务单元文件。使用以下命令创建一个新的 systemd 服务单元:

    sudo nano /etc/systemd/system/custom-routing.service
  2. 编写服务单元文件

    在文件中输入以下内容:

    [Unit]
    Description=Custom Routing Rules
    After=network.target
    
    [Service]
    Type=oneshot
    ExecStart=/bin/bash -c "ip route add default via 192.168.1.1 table table1; ip route add default via 192.168.8.1 table table2; ip rule add from 192.168.1.80 table table1; ip rule add from 192.168.8.80 table table2"
    RemainAfterExit=true
    
    [Install]
    WantedBy=multi-user.target

    解释:

    • [Unit] 部分定义了服务的描述和依赖关系,After=network.target 确保服务在网络配置完成后启动。
    • [Service] 部分定义了要执行的命令,ExecStart 中包含了你之前的路由和规则设置命令。
    • RemainAfterExit=true 表示服务执行完成后不会被停止。
    • [Install] 部分指定了服务将在系统启动时运行。
  3. 重新加载 systemd 配置

    创建服务单元文件后,你需要让 systemd 重新加载配置文件并启动服务。

    sudo systemctl daemon-reload
  4. 启用并启动服务

    启用服务,这样它会在每次启动时自动运行:

    sudo systemctl enable custom-routing.service

    然后,手动启动该服务来测试是否能正常工作:

    sudo systemctl start custom-routing.service
  5. 检查服务状态

    使用以下命令检查服务的状态,确保没有错误:

    sudo systemctl status custom-routing.service

    如果服务运行成功,你会看到类似 Active: active (exited) 的状态。

总结

在 Ubuntu 20.04 中,rc.local 文件已经被弃用,取而代之的是 systemd。你可以创建一个自定义的 systemd 服务单元 来执行启动时的命令。这种方式比 rc.local 更加灵活且符合现代的系统管理方法。

解决方案:
启用 IP 转发(用于支持不同网卡间的通信)。编辑 /etc/sysctl.conf 文件,确保以下内容被取消注释:

net.ipv4.ip_forward = 1

执行以下命令使配置生效:

sudo sysctl -p

ubuntu20.04版本的网络配置

cat /etc/netplan/00-installer-config.yaml 


# This is the network config written by 'subiquity'
network:
  ethernets:
    ens3:
      addresses:
      - 192.168.1.80/24
      gateway4: 192.168.1.1
      nameservers:
        addresses:
        - 192.168.1.1
      routes:
        - to: default
          via: 192.168.1.1
          metric: 100

    ens4:
      #dhcp4: true
      addresses:
      - 192.168.8.80/24
      gateway4: 192.168.8.1
      nameservers:
        addresses:
        - 192.168.8.1
      #routes: []
      routes:
        - to: default
          via: 192.168.8.1
          metric: 200
  version: 2

要获取某个内网IP对应的网卡MAC地址,可以通过以下几种方式,具体方法取决于你所使用的操作系统和网络环境:

1. 使用 arp 命令(适用于大多数操作系统)

ARP(地址解析协议)用于将IP地址映射到物理MAC地址。你可以通过以下步骤获取某个IP地址对应的MAC地址:

Windows系统

  1. 打开命令提示符(CMD)。
  2. 输入以下命令:

    arp -a <IP地址>

    例如:

    arp -a 192.168.1.100
  3. 查找对应IP地址的MAC地址。命令会列出一个IP地址和其对应的MAC地址。

Linux系统 / macOS

  1. 打开终端。
  2. 输入以下命令:

    arp -n <IP地址>

    或者

    arp <IP地址>

    例如:

    arp -n 192.168.1.100
  3. 会显示该IP地址的MAC地址。

2. 使用 ping + arp 方法

如果ARP缓存中没有该IP地址的MAC地址,您可以首先尝试ping该IP地址,然后再查看ARP缓存:

步骤

  1. 在命令行中输入 ping 命令来确保与目标IP地址的连接。
    例如:

    ping 192.168.1.100
  2. 然后查看ARP缓存:

    arp -a

    这时,命令会显示出连接过的设备的IP地址和对应的MAC地址。

3. 通过路由器或交换机获取

如果你有路由器或交换机的管理权限,也可以通过登录到网络设备的管理界面查看设备的MAC地址表。大多数路由器和交换机会列出连接到网络中的设备及其IP与MAC地址对应关系。

4. 使用网络扫描工具

如果你在局域网内,并且没有相应的权限或工具来获取MAC地址,你可以使用一些网络扫描工具来获取该信息。例如:

  • Nmap:一个强大的网络扫描工具,可以扫描整个子网并列出IP和MAC地址。
    使用以下命令:

    nmap -sP 192.168.1.0/24

    这会扫描192.168.1.x网络段,并显示每个活动设备的IP和MAC地址。

  • Wireshark:可以捕获和分析网络上的数据包,能够提取设备的MAC地址。

注意:

  • 获取其他设备的MAC地址通常需要在同一网络段内,并且目标设备的ARP缓存必须已经包含该信息。如果ARP缓存过期或没有更新,可能需要重新发送数据包以刷新缓存。
  • 确保你的操作符合网络安全规定,未经授权扫描其他网络设备可能会违反使用政策。

跨网段使用arp就不行

是的,跨网卡(即不同子网或不同网络接口卡)时直接获取 MAC 地址 是不可行的,原因如下:

1. ARP 协议的限制

  • ARP(地址解析协议)是局域网内的协议,用于将 IP 地址 映射到 MAC 地址,它只在同一子网内有效。当你尝试通过一个网卡查询另一个子网的设备时,ARP 请求无法跨越路由器,因此 ARP 请求 只能在同一网络接口的局域网内工作。

2. 不同子网的网络设备

  • 当设备在不同的子网或通过不同网卡连接时,它们之间的通信需要通过 路由器网关。由于路由器只关心 IP 层(网络层)而不关心 MAC 地址,它会将数据包转发到目标设备所在的子网,然后目标设备再使用 ARP 解析 IP 地址到 MAC 地址。
  • 因此,在一个子网的设备是无法直接访问另一个子网设备的 MAC 地址,因为路由器会丢弃 MAC 地址信息,传递给目标设备的仅是 IP 地址。

3. 跨网卡获取 MAC 地址的方法

如果你需要在跨网卡(不同子网或不同网络接口卡)的情况下获取 MAC 地址,可以考虑以下方法:

  • 使用网络扫描工具

    • Nmap 等扫描工具可以帮助你扫描整个网络段,并获取各设备的 IP 和 MAC 地址。例如,Nmap 可以扫描整个子网,帮助你识别其他子网设备的 MAC 地址(即使它们不在同一局域网内)。

      nmap -sP 192.168.1.0/24

      这条命令会扫描 192.168.1.0/24 网段,列出所有活动设备的 IP 和 MAC 地址。

  • 通过路由器或网关

    • 如果你有路由器或网关的管理权限,通常它会记录已连接设备的 IP 地址MAC 地址,并提供相应的设备管理界面,允许你查看整个网络的 IP 和 MAC 地址映射表
    • 例如,许多家庭路由器和企业级路由器都会在其管理界面中列出已连接设备的 MAC 地址表
  • 使用 Wireshark 等抓包工具

    • 你可以通过 Wireshark 等网络抓包工具,在不同子网内捕获流量。虽然 Wireshark 无法直接获取其他子网设备的 MAC 地址,但它可以捕获来自网关的数据包,并通过分析报文中的 MAC 地址信息,间接获取其他子网的设备信息。

4. 总结

  • 在不同网卡或跨网段的情况下,直接使用 ARP 命令是无法获取设备的 MAC 地址的,因为 ARP 协议仅在同一局域网内有效。
  • 如果你需要跨网卡获取 MAC 地址,通常需要依赖网络扫描工具、路由器的 MAC 地址表或使用抓包工具来间接获得这些信息。

遇到的问题,作个笔记!

bootstrap model 关闭的时候控制台提示报错信息:

 Blocked aria-hidden on an element because its descendant retained focus. The focus must not be hidden from assistive technology users. Avoid using aria-hidden on a focused element or its ancestor. Consider using the inert attribute instead, which will also prevent focus.

是 aria-hidden 的属性产生的:

查看页面代码 model 模态框 把 aria-hidden=true 加到了 .modal 这个节点上了,将这个属性去掉就解决了

关于 aria-hidden 属性的详解:
aria-hidden 是一个与可访问性(accessibility)相关的 HTML 属性,它用于告知屏幕阅读器和其他辅助技术是否应该忽略某个元素,从而不将该元素呈现给使用这些技术的用户。

ARIA(Accessible Rich Internet Applications)

ARIA 是一组专门用于提高 Web 内容可访问性的属性,尤其针对使用屏幕阅读器等辅助工具的用户。aria-hidden 是其中一个属性,它与语义 HTML 标签的作用不同,而是帮助向辅助技术表明某些元素是否对残障人士可见或可访问。

aria-hidden 的作用

  • aria-hidden="true":该属性的值为 true 时,表示该元素和它的所有子元素会被屏幕阅读器忽略。这样,这些元素将不被读取或呈现给使用屏幕阅读器的用户。即使元素的样式使其可见,屏幕阅读器也不会将其读取。
  • aria-hidden="false":这个值表示该元素对屏幕阅读器是可见的,允许它作为正常内容被屏幕阅读器读取。如果没有显式设置 aria-hidden,默认情况下元素对屏幕阅读器是可访问的。

应用场景

  1. 隐藏装饰性元素

    • 你可能希望屏幕阅读器忽略一些纯粹用于装饰或视觉效果的元素(例如图标、背景图片等),因为这些元素并不为内容提供有意义的信息。
    • 例如,假设你有一个图标元素,它只用于视觉展示,而不包含任何有用信息,可以设置 aria-hidden="true" 来让屏幕阅读器忽略它。
    <div aria-hidden="true">
      <i class="icon">xxxxxx</i>  <!-- 这是装饰性图标,屏幕阅读器会忽略它 -->
    </div>
  2. 隐藏不必要的内容

    • 有时你可能希望动态地隐藏一些内容,这些内容可能不适合当前的用户(例如,某些信息只适用于特定条件下的用户)。可以使用 aria-hidden 来隐藏这些内容。
    <div aria-hidden="true">
      <p>这个内容在当前情况下对屏幕阅读器用户不可见。</p>
    </div>
  3. 动态控制可见性

    • aria-hidden 还可以用于动态控制元素的可访问性。例如,当某个弹出窗口(如模态框)被打开时,可以使用 aria-hidden="true" 来隐藏背景内容,从而让用户集中注意力在弹出窗口上。
    <div aria-hidden="true">这是被隐藏的背景内容,屏幕阅读器不会读取它。</div>
    <div>这是可见的前景内容,屏幕阅读器将读取它。</div>
  4. 改善用户体验

    • aria-hidden 可以帮助优化用户体验,尤其是在设计复杂的用户界面时。通过正确使用它,可以减少不必要的干扰,使用户能够专注于他们需要关注的内容。

注意事项

  • 影响范围aria-hidden="true" 不仅会影响当前元素,还会递归地影响该元素的所有子元素。如果父元素被设置为 aria-hidden="true",它的所有子元素都会被屏幕阅读器忽略。

    <div aria-hidden="true">
      <p>这个段落和其内部的所有内容都会被屏幕阅读器忽略。</p>
    </div>
  • 使用时机aria-hidden 应该小心使用。误用可能导致有意义的内容被错误地隐藏,影响用户的访问体验。最好只在元素确实是纯粹装饰性,或在某些条件下不需要被读取时使用。
  • 对可视化的影响aria-hidden 仅影响屏幕阅读器和其他辅助技术的行为,它不会改变元素的可视化显示。即使一个元素被设置为 aria-hidden="true",它仍然会在屏幕上显示。要完全隐藏该元素,可以使用 CSS 设置 display: nonevisibility: hidden

总结

  • aria-hidden="true":使元素和其子元素对屏幕阅读器隐藏,忽略该元素。
  • aria-hidden="false":明确表示该元素对屏幕阅读器可见(如果没有显式设置,则默认为 false)。
  • aria-hidden 是帮助提高网页可访问性的重要工具,特别是在有复杂界面时。
  • 使用时要小心,确保不会误隐藏那些有意义的内容,从而影响用户体验。