假设我运行了相当多的 ip 命令并最终获得了所需的网络配置,但我没有保存命令历史记录。
有没有一种方法可以转储/保存网络配置的状态,例如 iptables-save 或 mysqldump 等,以便稍后我们可以恢复,而不是再次在文件或脚本中重写命令?
我发现在 Windows 中也可能出现类似的情况netnsh
(不确定这是否正是我正在寻找的解决方案。没有经历过它,但它似乎转储了网络配置状态)。
但我在 Linux 中找不到任何选项(尤其是 CentOS/RHEL)
答案1
确实存在使用 iproute2 命令保存地址、路由和规则的一些支持ip
。
出于明显的原因,链接不存在这种情况,即使人们可以想象保存的可能性一些虚拟链接,不是全部(“保存”veth-pair 链接的单边及其跨其他网络名称空间的对等链接?不会发生......),或者能够保存网桥和网桥的端口配置,包括 vlan 等。 ,目前似乎不存在。
现有命令有:
ip address save
ip address restore
ip route save
ip route restore
ip rule save
ip rule restore
转储格式是二进制的,命令将拒绝保存到 tty 或从 tty 恢复。
我建议在路由之前恢复地址(规则可以按任何顺序完成),否则大多数保存的路由将不会恢复,因为它们无法满足取决于地址的路由条件。警告:当然,下面的所有刷新命令都可能会中断网络连接,直到恢复完成,因此应避免远程网络访问(或在其他网络命名空间中完成)。
ip address save
/ip address restore
因此,要将地址从具有接口的简单网络命名空间
orig
的配置dummy0
(为了保持示例简单)复制到命名空间copy
:ip netns add orig ip netns exec orig sh << 'EOF' ip link add dummy0 type dummy ip address add dev dummy0 192.0.2.2/24 ip address add dev dummy0 2001:db8:0:1::2/64 ip link set dummy0 up ip address save > /tmp/address EOF ip netns add copy ip netns exec copy sh << 'EOF' ip link add dummy0 type dummy ip link set dummy0 up ip address restore < /tmp/address ip -br address EOF
例如将给出以下结果:
lo DOWN dummy0 UNKNOWN 192.0.2.2/24 2001:db8:0:1::2/64 fe80::68e3:bdff:feb0:6e85/64 fe80::e823:d1ff:fe8c:3a15/64
注意:之前的自动 IPv6 链路本地 (
scope link
) 地址也被保存,并因此被恢复,导致额外的(错误的)IPv6 链路本地地址,因为链路/以太网地址(此处在orig
6a:e3:bd:b0:6e:85
)基于IPv6 链路本地地址不会保存,因此不会恢复(此处保留copy
其他随机 MACea:23:d1:8c:3a:15
中的地址dummy0
)。因此,如果确实重要的话,实际上应该注意单独保存和复制此类虚拟接口的 MAC 地址,或者修剪物理接口的某些地址。如果环境不是“干净的状态”,您可能应该在恢复之前刷新所有地址,以避免留下旧地址。与下面的路线相反,我找不到一种简单的方法来冲洗所有这些一命令而无需声明接口。使用那些二应该足够好:
ip address flush permanent ip address flush temporary
同样的原理,路由和规则也可以保存和恢复:
ip route save
/ip route restore
有一个技巧。
ip route save
将仅保存main
表,这对于常见用例很有用,但不适用于策略路由的附加路由表。ip rule save table 220
如果需要,您可以指定一个特定的表(例如)。但特别table 0
代表的是全部表,使用ip route save table 0
将保存全部ip route show table 0
一次(包括它所属的每条路线的表,就像显示的一样)。在恢复路由之前,最好刷新所有现有路由:ip route flush table 0 all
显示任何路由表都可以保存而无需事先知道其值的示例:
# ip route add table 220 unreachable 10.0.0.0/8 metric 9999 # ip route show table 220 unreachable 10.0.0.0/8 metric 9999 # ip route save table 0 > /tmp/route # ip route flush table 0 all # ip route show table 220 # # ip route restore table 0 < /tmp/route # ip route show table 220 unreachable 10.0.0.0/8 metric 9999
当然,来自其他表(包括表 254 aka
main
)的所有路由也会被保存和恢复。ip rule save
/ip rule restore
这也很棘手,因为如果之前没有刷新,它将添加重复项而不会抱怨,并且刷新规则永远不会刷新规则 prio 0,因此
rule priority 0
必须显式删除:ip rule flush ip rule delete priority 0
因此要保存和恢复:
ip rule save > /tmp/rule
[...] 只是删除,或切换到其他环境等。
ip rule flush ip rule delete priority 0 ip rule restore < /tmp/rule
我希望您能找到它的一些用法,例如用于多个网络名称空间的自动化。
答案2
这里面有一个脚本github存储库。通过此脚本,您可以将当前的网络配置命令保存到 bash 脚本中。
./save_my_network.py
执行此脚本后,您可以network.save
在当前目录中找到一个文件
cat network.save
#!/bin/bash
ip addr add 192.168.1.97/24 dev wlan0
echo 0x1003 > /sys/class/net/wlan0/flags
ip addr add 172.17.0.1/16 dev docker0
ip addr add 172.19.0.1/24 dev docker0
ip addr add 172.18.0.1/24 dev docker0
ip addr add 172.20.0.1/16 dev docker0
echo 0x1002 > /sys/class/net/docker0/flags
ip addr add 127.0.0.1/8 dev lo
echo 0x9 > /sys/class/net/lo/flags
ip addr add 10.8.0.15/24 dev tun0
echo 0x1091 > /sys/class/net/tun0/flags
ip route add 0.0.0.0/1 via 10.8.0.1 dev tun0
ip route add default via 192.168.1.1 dev wlan0 proto dhcp metric 600
ip route add 10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.15
ip route add 94.130.24.225 via 192.168.1.1 dev wlan0
ip route add 128.0.0.0/1 via 10.8.0.1 dev tun0
ip route add 192.168.1.0/24 dev wlan0 proto kernel scope link src 192.168.1.97 metric 600
不要忘记执行权限network.save
chmod +x network.save
答案3
您的网络配置应保存在 /etc/sysconfig/network-scripts/ifconfig-(interface) 和 /etc/sysconfig/network、/etc/resolv.conf 等文件中。您只需修改这些文件并重新启动您的网络即可。网络服务,而不是即时进行更改。当系统重新启动时,您即时所做的任何更改(例如路由或 IP 更改)都将丢失。