Joyber 发布的文章

git rebase 是 Git 中的一种操作,用于将一个分支上的修改应用到另一个分支的顶部。它的主要作用是整合不同分支上的提交,并保持一个干净、线性的提交历史。

工作原理

假设你在分支 feature 上开发,并且该分支已经从 main 分支分出来了。如果在你开发的过程中,main 分支也有新的提交,这时你可以使用 git rebasefeature 分支的修改移到 main 分支最新的提交之上。

基本语法

git rebase <base-branch>
  • <base-branch> 是你想要将当前分支变基到的目标分支,通常是主分支(例如 mainmaster)。

举个例子

  1. 你在 feature 分支上工作:

    git checkout feature
  2. 假设 main 分支有一些新的提交,你希望将 feature 分支的提交移到 main 最新的提交上。

    git fetch origin
    git rebase origin/main

这时,Git 会将 feature 分支的提交重新应用到 main 分支的顶部。

git rebase 的效果

  1. 提交历史线性化:使用 rebase 操作后,feature 分支的提交会被“移动”到 main 分支之后,形成一个线性的提交历史,避免了 merge 时可能产生的“合并提交”。
  2. 清理历史:有时候,rebase 可以帮助你简化历史,避免混乱的提交,特别是多个开发人员在不同分支上的协作时。

交互式 rebase

你还可以使用 git rebase -i 来进行交互式 rebase,这允许你在应用提交时进行选择、修改、合并、拆分或删除某些提交。

例如:

git rebase -i HEAD~3

这将打开一个编辑器,允许你对最近的 3 次提交进行操作。你可以修改提交顺序、合并提交、编辑提交信息等。

rebasemerge 的区别

  • merge:将两个分支的提交合并在一起,形成一个新的“合并提交”,历史记录中会保留合并的痕迹。
  • rebase:将一个分支的提交移到另一个分支的顶部,历史记录更加线性,不会产生合并提交。

注意事项

  • 在公共分支上使用 rebase 时要小心,因为它会重写提交历史,可能会导致其他开发者的本地仓库出现冲突。如果是在团队协作时,最好在个人分支上使用 rebase,而避免在公共分支上操作。

服务器使用的是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 地址表或使用抓包工具来间接获得这些信息。