如何在 Ubuntu 20.04 服务器中添加持久 IP 路由

如何在 Ubuntu 20.04 服务器中添加持久 IP 路由

也许这个问题之前在某个地方已经得到解答了,但我似乎还没有弄清楚。最近我的 Ubuntu 20.04 服务器出现了一些问题。我安装了 OpenVPN,可以成功使用 NordVPN 创建 vpn 隧道。问题是,当创建隧道时,连接中断,除非我添加一些 ip 路由,否则我无法通过 ssh 返回服务器。我找到了一个解决方案:假设服务器的真实 ip 是185.230.125.107,我手动添加了路线如下:

sudo ip rule add from 185.230.125.107 table 128
sudo ip route add table 128 185.230.125.107/32 dev eno0
sudo ip route add table 128 default via 185.230.125.254

在重启之前,这个方法都很好用。机器重启后,我必须重新添加这些规则。我的问题是:我该如何添加这些规则,让它们持久化,以便在重启时它们仍然有效!?我应该在哪里以及如何添加它们!?我在某处读到我需要在 /etc/network/if-up.d 中创建某种脚本,但我不知道如何编写这样的脚本。请问有人愿意帮忙吗?我真的很感激你们。非常感谢 Nick

答案1

  1. 你好,伙计,我无法发表评论,因此我将尝试在这里回答。
  2. 有少数选项可以创建一个计划流程来解决该问题。
  3. 这里有两个选项:
    • crontab-不太适合您的问题。
    • 提供一项服务-完美地解决您的问题。
    • 可能有更多更好的方法来解决这个问题。
  4. 关于 crontab:
    • crontab 是您想要定期运行的命令列表。
    • 要添加您想要安排运行的命令,您必须使用命令编辑 crontab 文件crontab -e
    • 你可以使用这个网站来帮助你计算你想要执行特定命令的间隔crontab计算器
    • 你可以使用本指南来制定你自己的 crontab 文件crontab指南
  5. 我认为更好的选择是创建自己的服务。
    • 当您创建一项服务时,您可以像运行所有其他服务一样运行它,这意味着您可以启用、禁用、重新启动、启动以及使用systemctl命令附带的所有其他选项。
    • 您必须将您的服务创建为文本文件并将其命名为myServiceName.service。
    • 那么你必须找到该服务/etc/systemd/system/.
    • 使用本指南获取服务模板如何制作服务指南
    • 创建服务并将其放置在特定目录中后,您可以通过以下命令启用并启动它:systemctl enable serviceName.servicesystemctl start serviceName.service
    • 该服务应在任何重启时启动,因此它可能会解决您的问题。
  6. 根据评论进行编辑
    • 使用以下脚本创建sudo nano /usr/local/sbin/SCRIPT_NAME.sh
    • 包含命令的脚本示例:
    • #/bin/bash!
    • ip rule add from 185.230.125.107 table 128
    • ip route add table 128 185.230.125.107/32 dev eno0
    • ip route add table 128 default via 185.230.125.254
    • 现在赋予脚本执行权限chmod a+x SCRIPT_NAME.sh
    • 现在创建一个服务sudo nano /systemd/system/SERVICE_NAME.service
    • 使用该模板:在 ExecStart 字段中执行你的脚本
Description=ROT13 demo service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=centos
ExecStart=/usr/local/sbin/./SCRIPT_NAME.sh

[Install]
WantedBy=multi-user.target
  1. 根据第二条评论进行编辑:
  2. 要确保您的服务配置正确,请按照以下步骤操作:
    • 找到服务/etc/systemd/system/LOCATE_HERE.service
    • 授予服务运行的脚本执行权限sudo chmod a+x yourscript.sh
    • 执行命令sudo systemctl daemon-reload重新加载新的服务。
    • 执行命令sudo systemctl enable serviceName.service
    • 执行命令sudo systemctl start serviceName.service
    • 执行命令sudo systemctl status serviceName.service
    • 如果服务正在运行,请重新启动系统。
    • 重启后执行命令sudo systemctl status serviceName.service检查服务是否正在运行。
    • 图片:
    • 适合我的服务示例
    • 如何启动服务命令
    • 如果所有解决方案均无效,则文件类型可能有问题 - 请在此处查看解决方案解决方案ForFileTypeError

答案2

你绝对可以在 Netplan 中做到这一点。我刚刚这样做了,并在重启后确认了持久性。Netplan 官方网站的示例页面显示了许多这样的例子。

例子:

  1. 编辑您的 netplan 配置文件(位于 /etc/netplan/)

  2. 找到您想要路由的接口(例如 eth0)

  3. 找到地址部分

  4. 在地址部分下添加路线关键字和路线详情

    routes:
       - to: default
         via: 1.1.1.254
    
  5. 保存并关闭

  6. 输入:sudo netplan generate(然后按 Enter)

  7. 输入:sudo netplan apply(然后按 Enter)

  8. 通过 ping 目标网络上的已知 IP 来测试路由

答案3

以下是我使用 netplan 最终得到的结果。从您的帖子中获取 IP,您将执行以下操作/etc/netplan/*.yaml

network:
    version: 2
    ethernets:
        eno0:
            ...
            routing-policy:
            - from: 185.230.125.107
              table: 128
            routes:
            -   to: 0.0.0.0/0
                via: 185.230.125.254
            -   to: default
                via: 185.230.125.254
                on-link: True
                table: 128
            -   to: 185.230.125.107/32
                on-link: True
                table: 128
            ...
            set-name: eno0

我一度怀念的是- to: default

相关内容