也许这个问题之前在某个地方已经得到解答了,但我似乎还没有弄清楚。最近我的 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
- 你好,伙计,我无法发表评论,因此我将尝试在这里回答。
- 有少数选项可以创建一个计划流程来解决该问题。
- 这里有两个选项:
- crontab-不太适合您的问题。
- 提供一项服务-完美地解决您的问题。
- 可能有更多更好的方法来解决这个问题。
- 关于 crontab:
- crontab 是您想要定期运行的命令列表。
- 要添加您想要安排运行的命令,您必须使用命令编辑 crontab 文件
crontab -e
。 - 你可以使用这个网站来帮助你计算你想要执行特定命令的间隔crontab计算器
- 你可以使用本指南来制定你自己的 crontab 文件crontab指南
- 我认为更好的选择是创建自己的服务。
- 当您创建一项服务时,您可以像运行所有其他服务一样运行它,这意味着您可以启用、禁用、重新启动、启动以及使用
systemctl
命令附带的所有其他选项。 - 您必须将您的服务创建为文本文件并将其命名为myServiceName.service。
- 那么你必须找到该服务
/etc/systemd/system/.
- 使用本指南获取服务模板如何制作服务指南。
- 创建服务并将其放置在特定目录中后,您可以通过以下命令启用并启动它:
systemctl enable serviceName.service
和systemctl start serviceName.service
。 - 该服务应在任何重启时启动,因此它可能会解决您的问题。
- 当您创建一项服务时,您可以像运行所有其他服务一样运行它,这意味着您可以启用、禁用、重新启动、启动以及使用
- 根据评论进行编辑。
- 使用以下脚本创建
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
- 根据第二条评论进行编辑:
- 要确保您的服务配置正确,请按照以下步骤操作:
- 找到服务
/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 官方网站的示例页面显示了许多这样的例子。
例子:
编辑您的 netplan 配置文件(位于 /etc/netplan/)
找到您想要路由的接口(例如 eth0)
找到地址部分
在地址部分下添加路线关键字和路线详情
routes: - to: default via: 1.1.1.254
保存并关闭
输入:sudo netplan generate(然后按 Enter)
输入:sudo netplan apply(然后按 Enter)
通过 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