有没有办法将Linux中网络配置的当前状态保存到数据文件或ip命令集(如iptables-save)中?

有没有办法将Linux中网络配置的当前状态保存到数据文件或ip命令集(如iptables-save)中?

假设我运行了相当多的 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 更改)都将丢失。

相关内容