インターフェースをdown状態にする
ここでは、Linuxでネットワークインターフェースをdown状態にする方法を説明したいと思います。
インターフェースをdown状態にするプログラム
このサンプルを実行するとネットワークインターフェースが通信不能になるのでご注意下さい。 このサンプルはネットワークインターフェースの状態を変更できる権限(rootなど)を持ったユーザとして実行しないと失敗します。 「ifconfig eth0 up」コマンドを実行するとネットワークインターフェースはup状態になります。
#include <stdio.h>
#include <string.h> /* for strncpy */
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <netinet/in.h>
#include <net/if.h>
int
main()
{
int fd;
struct ifreq ifr;
fd = socket(AF_INET, SOCK_DGRAM, 0);
/* インターフェースを指定 */
strncpy(ifr.ifr_name, "eth0", IFNAMSIZ-1);
/* 現在の状態を取得 */
if (ioctl(fd, SIOCGIFFLAGS, &ifr) != 0) {
perror("ioctl");
}
/* 現在の状態からIFF_UPをOFFに */
ifr.ifr_flags &= ~IFF_UP;
/* 状態を変更 */
if (ioctl(fd, SIOCSIFFLAGS, &ifr) != 0) {
/* 失敗したら理由を表示 */
perror("ioctl");
}
close(fd);
return 0;
}
このサンプルのポイントは、一度kernelが持っている状態を取得しておいて、IFF_UPの部分だけ変更していることです。 SIOCGIFFLAGSをしないでSIOCSIFFLAGSを使ってしまうと、場合によっては変えたくないパラメータまで変わってしまいます。
Linuxでは、ネットワークインターフェースの状態を変更するためにioctlを利用します。 ioctlを使用するにはソケットを開く必要があります。 作るソケットはAF_INETであればTCP(SOCK_STREAM)でもUDP(SOCK_DGRAM)でもかまいません。 このサンプルではUDPのソケットを利用しています。
開いたソケットは、状態の変更とともにcloseしてしまっても大丈夫です。 もちろん、ソケットをそのまま使い続ける事も可能です。