Converter o comando ifconfig para iproute2

1

Estou usando este comando ifconfig para definir o IP em uma interface de rede

ifconfig eth0 x.x.x.x netmask x.x.x.x mtu 1400

Agora eles dizem que o ifconfig está obsoleto e eu devo usar o iproute2. Eu converti esse comando em dois comandos:

ip addr add x.x.x.x/24 dev eth0
ip link set mtu 1400 dev eth0

Como posso juntar os dois em apenas um comando?

    
por kuchi 23.07.2013 / 11:30

1 resposta

2

Resposta curta : você não pode, a menos que você a envolva em uma função de shell. Versão de um homem pobre:

function ifaddrmtu() {
    # Call: ifaddrmtu eth0:foobar 1.1.1.1 255.255.255.254
    #   or: ifaddrmtu eth0:foobar 1.1.1.1 255.255.255.254 1400
    local label=$1
    local ip=$2
    local mask=$3
    local mtu=$4
    sudo ip addr add $ip/$mask brd + dev ${label%:*} label $label
    [ ! -z $mtu ] && sudo ip link set mtu $mtu dev $label
}

Agora, se você realmente quiser mapear o antigo comportamento ifconfig para iproute2 , será necessário escrever um analisador, que mapeie ifconfig sintaxe e semântica para iproute2 . Um pouco mais de dez anos atrás, eu escrevi um biest na concha para uma empresa que eu trabalhei. Se você precisar, posso tentar extraí-lo de um dos meus discos rígidos antigos. Foi muito legal e também veio com maneiras mais fáceis de mostrar as tabelas de roteamento e suas entradas.

Uma resposta mais detalhada : Usar a estrutura iproute2 adicionando um endereço IP e definindo o mtu de um dispositivo são duas coisas bastante diferentes do ponto de vista do kernel. Enquanto ifconfig usa a comunicação ioctl de estilo antigo para alterar a configuração na pilha de rede do kernel (o kernel subseqüentemente faz todo o trabalho chamando internamente funções diferentes para adicionar um endereço IP e configurar o mtu), iproute2 usa o netlink estrutura de mensagens para se comunicar com a pilha de rede.

É melhor vê-lo usando strace (trecho da minha VM do Linux):

# ip addr del 1.1.1.1/32 dev eth4

# strace -e ioctl ifconfig eth4:new 1.1.1.1 netmask 255.255.255.255 mtu 1400
ioctl(4, SIOCSIFADDR, {ifr_name="eth4:new", ifr_addr={AF_INET, inet_addr("1.1.1.1")}}) = 0
ioctl(4, SIOCGIFFLAGS, {ifr_name="eth4:new", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFFLAGS, {ifr_name="eth4:new", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFNETMASK, {ifr_name="eth4:new", ifr_netmask={AF_INET, inet_addr("255.255.255.255")}}) = 0
ioctl(4, SIOCSIFMTU, {ifr_name="eth4:new", ifr_mtu=1400}) = 0

# ip -4 addr show dev eth4
2: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP qlen 1000
    inet 10.211.55.4/24 brd 10.211.55.255 scope global eth4
    inet 1.1.1.1/32 scope global eth4:new

# ip addr del 1.1.1.1/32 dev eth4                                          

# strace -e "send,sendmsg,recvmsg" ip addr add 1.1.1.1/32 dev eth4 label eth4:new
send(3, "
function ifaddrmtu() {
    # Call: ifaddrmtu eth0:foobar 1.1.1.1 255.255.255.254
    #   or: ifaddrmtu eth0:foobar 1.1.1.1 255.255.255.254 1400
    local label=$1
    local ip=$2
    local mask=$3
    local mtu=$4
    sudo ip addr add $ip/$mask brd + dev ${label%:*} label $label
    [ ! -z $mtu ] && sudo ip link set mtu $mtu dev $label
}
# ip addr del 1.1.1.1/32 dev eth4

# strace -e ioctl ifconfig eth4:new 1.1.1.1 netmask 255.255.255.255 mtu 1400
ioctl(4, SIOCSIFADDR, {ifr_name="eth4:new", ifr_addr={AF_INET, inet_addr("1.1.1.1")}}) = 0
ioctl(4, SIOCGIFFLAGS, {ifr_name="eth4:new", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFFLAGS, {ifr_name="eth4:new", ifr_flags=IFF_UP|IFF_BROADCAST|IFF_RUNNING|IFF_MULTICAST}) = 0
ioctl(4, SIOCSIFNETMASK, {ifr_name="eth4:new", ifr_netmask={AF_INET, inet_addr("255.255.255.255")}}) = 0
ioctl(4, SIOCSIFMTU, {ifr_name="eth4:new", ifr_mtu=1400}) = 0

# ip -4 addr show dev eth4
2: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP qlen 1000
    inet 10.211.55.4/24 brd 10.211.55.255 scope global eth4
    inet 1.1.1.1/32 scope global eth4:new

# ip addr del 1.1.1.1/32 dev eth4                                          

# strace -e "send,sendmsg,recvmsg" ip addr add 1.1.1.1/32 dev eth4 label eth4:new
send(3, "%pre%%pre%%pre%%pre%6R%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 20, 0) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0%pre%%pre%%pre%%pre%6R7%pre%%pre%%pre%%pre%%pre%%pre%%pre%I%pre%%pre%%pre%%pre%%pre%%pre%"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 2992
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"%pre%%pre%%pre%%pre%%pre%6R7%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%I%pre%%pre%%pre%%pre%%pre%%pre%"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 20
sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"8%pre%%pre%%pre%%pre%7R%pre%%pre%%pre%%pre% %pre%%pre%%pre%%pre%%pre%%pre%%pre%"..., 56}], msg_controllen=0, msg_flags=0}, 0) = 56
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"$%pre%%pre%%pre%%pre%%pre%%pre%7R7%pre%%pre%%pre%%pre%%pre%%pre%08%pre%%pre%%pre%%pre%7R"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36                       = ?

# strace -e "send,sendmsg,recvmsg" ip link set mtu 1420 dev eth4
send(3, " %pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 32, 0) = 32
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"4%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%0%pre%%pre%5777 %pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%"..., 8192}], msg_controllen=0, msg_flags=0}, 0) = 52
send(3, "%pre%%pre%%pre%%pre%;R%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 20, 0) = 20
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0%pre%%pre%%pre%%pre%;R0%pre%%pre%%pre%%pre%%pre%%pre%%pre%I%pre%%pre%%pre%%pre%%pre%%pre%"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 2992
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"%pre%%pre%%pre%%pre%%pre%;R0%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%I%pre%%pre%%pre%%pre%%pre%%pre%"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 20
sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"(%pre%%pre%%pre%%pre%%pre%<R%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%"..., 40}], msg_controllen=0, msg_flags=0}, 0) = 40
recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"$%pre%%pre%%pre%%pre%%pre%%pre%<R0%pre%%pre%%pre%%pre%%pre%%pre%(%pre%%pre%%pre%%pre%%pre%<R"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36

# ip -4 addr show dev eth4
2: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1420 qdisc pfifo_fast state UP qlen 1000
    inet 10.211.55.4/24 brd 10.211.55.255 scope global eth4
    inet 1.1.1.1/32 scope global eth4:new
%pre%%pre%6R%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 20, 0) = 20 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0%pre%%pre%%pre%%pre%6R7%pre%%pre%%pre%%pre%%pre%%pre%%pre%I%pre%%pre%%pre%%pre%%pre%%pre%"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 2992 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"%pre%%pre%%pre%%pre%%pre%6R7%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%I%pre%%pre%%pre%%pre%%pre%%pre%"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 20 sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"8%pre%%pre%%pre%%pre%7R%pre%%pre%%pre%%pre% %pre%%pre%%pre%%pre%%pre%%pre%%pre%"..., 56}], msg_controllen=0, msg_flags=0}, 0) = 56 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"$%pre%%pre%%pre%%pre%%pre%%pre%7R7%pre%%pre%%pre%%pre%%pre%%pre%08%pre%%pre%%pre%%pre%7R"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36 = ? # strace -e "send,sendmsg,recvmsg" ip link set mtu 1420 dev eth4 send(3, " %pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 32, 0) = 32 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"4%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%0%pre%%pre%5777 %pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%"..., 8192}], msg_controllen=0, msg_flags=0}, 0) = 52 send(3, "%pre%%pre%%pre%%pre%;R%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%", 20, 0) = 20 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"0%pre%%pre%%pre%%pre%;R0%pre%%pre%%pre%%pre%%pre%%pre%%pre%I%pre%%pre%%pre%%pre%%pre%%pre%"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 2992 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"%pre%%pre%%pre%%pre%%pre%;R0%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%I%pre%%pre%%pre%%pre%%pre%%pre%"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 20 sendmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"(%pre%%pre%%pre%%pre%%pre%<R%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%%pre%"..., 40}], msg_controllen=0, msg_flags=0}, 0) = 40 recvmsg(3, {msg_name(12)={sa_family=AF_NETLINK, pid=0, groups=00000000}, msg_iov(1)=[{"$%pre%%pre%%pre%%pre%%pre%%pre%<R0%pre%%pre%%pre%%pre%%pre%%pre%(%pre%%pre%%pre%%pre%%pre%<R"..., 16384}], msg_controllen=0, msg_flags=0}, 0) = 36 # ip -4 addr show dev eth4 2: eth4: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1420 qdisc pfifo_fast state UP qlen 1000 inet 10.211.55.4/24 brd 10.211.55.255 scope global eth4 inet 1.1.1.1/32 scope global eth4:new

É claro que existem mais razões pelas quais um endereço IP e a configuração do mtu para uma entrada de dispositivo são duas coisas diferentes. Digamos apenas que os endereços IP não pertencem realmente às interfaces, como sugerido por ifconfig . O nome é meramente um rótulo usado como um nome de interface que a base de informações de encaminhamento (FIB) usa para pesquisar / filtrar e rotear pacotes para. O kernel de um ponto de vista de manipulação de pacotes poderia muito bem viver sem o nome do dispositivo.

    
por 24.08.2013 / 23:28