리눅스 네트워크 프로그래밍 - 네트워크 인터페이스 활성화하기

반응형

본 글에서는 리눅스 시스템의 네트워크 인터페이스를 C 언어로 작성된 프로그램 상에서 활성화하는 방법을 설명한다. 

반대로, 비활성화하는 방법은 다음 글에 설명되어 있다.

 

리눅스 시스템에서 네트워크 인터페이스를 활성화하기 위해 보통 ifconfig up 명령을 사용한다.

아래 내용은 ifconfig eth0 up 명령을 이용하여 eth0 라는 이름을 갖는 네트워크 인터페이스를 활성화 하는 내용이다.

root@10a25d934dda:/workspace# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@10a25d934dda:/workspace# ifconfig eth0 up
root@10a25d934dda:/workspace# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:14 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:1196 (1.1 KB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@10a25d934dda:/workspace#

 

C 언어로 작성된 프로그램 상에서 네트워크 인터페이스를 활성화하는 절차는 다음과 같다.

 

  • socket() 함수로 네트워크 인터페이스에 대한 소켓 파일 디스크립터를 연다.
  • struct ifreq 구조체 변수에 활성화할 네트워크 인터페이스의 이름(예: eth0)을 저장한다. 
  • ioctl() 함수의 SIOCGIFFLAGS 명령을 통해 네트워크 인터페이스의 현재 상태를 가져온다.
  • struct ifreq 구조체 변수의 플래그 상태 변수(ifr_flags)에 활성화 플래그를 설정한다.
  • ioctl() 함수의 SIOCSIFFLAGS 명령을 통해 네트워크 인터페이스의 상태를 변경한다.

 

 

 

다음은 네트워크 인터페이스를 활성화하는 예제 프로그램의 소스 코드이다.

#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <net/if.h>
#include <stdio.h>
#include <string.h>


/**
 * 네트워크 인터페이스를 활성화한다(이는 "ifconfig up" 명령과 같은 동작이다)
 *
 * @param[in] ifname  활성화하고자 하는 네트워크 인터페이스 이름
 *
 * @retval  0: 성공
 * @retval  -1: 실패
 */
int ActivateNetworkInterface(const char *ifname)
{
  printf("Activate network interface(%s)\n", ifname);
  
  /*
   * 네트워크 인터페이스 소켓을 연다.
   */
  int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
  if (sockfd < 0) {
    printf("Fail to activate network interface(%s) - socket() failed - %m\n", ifname);
    return -1;
  }

  struct ifreq ifr;
  memset(&ifr, 0, sizeof(ifr));
  strncpy(ifr.ifr_name, ifname, IFNAMSIZ);

  /*
   * 네트워크 인터페이스의 현재 상태를 읽어온다.
   */
  int ret = ioctl(sockfd, SIOCGIFFLAGS, &ifr);
  if (ret < 0) {
    printf("Fail to activate network interface(%s) - ioctl(SIOCGIFFLAGS) failed - %m\n", ifname);
    return -1;
  }

  /*
   * 인터페이스를 활성화 상태로 설정한다.
   */
  ifr.ifr_flags |= IFF_UP;
  ret = ioctl(sockfd, SIOCSIFFLAGS, &ifr);
  if (ret < 0) {
    printf("Fail to activate network interface(%s) - ioctl(SIOCSIFFLAGS) failed - %m\n", ifname);
    return -1;
  }

  printf("Success to activate network interface\n");
  return 0;
}


/**
 * 테스트 어플리케이션
 */
int main(int argc, char *argv[])
{
  const char *ifname = "eth0";

  /*
   * "eth0" 네트워크 인터페이스를 활성화한다. 
   */
  return ActivateNetworkInterface(ifname);
}

 

 

 

위 코드를 빌드 후, eth0 인터페이스가 활성화되지 않은 상태에서 실행하면 해당 인터페이스가 활성화 되는 것을 확인할 수 있다.

참고로 위 프로그램은 네트워크 디바이스에 접근하므로 관리자 권한으로 실행되어야 한다.
예를 들어, 도커 컨테이너는 privileged 모드로 실행되어야 한다.
root@10a25d934dda:/workspace# ifconfig
lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@10a25d934dda:/workspace#
root@10a25d934dda:/workspace# ./activate
Activate network interface(eth0)
Success to activate network interface
root@10a25d934dda:/workspace#
root@10a25d934dda:/workspace# ifconfig
eth0      Link encap:Ethernet  HWaddr 02:42:ac:11:00:02
          inet addr:172.17.0.2  Bcast:172.17.255.255  Mask:255.255.0.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:32 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:2696 (2.6 KB)  TX bytes:0 (0.0 B)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:65536  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

root@10a25d934dda:/workspace#

 

파트너스 활동을 통해 일정액의 수수료를 제공받을 수 있음

 

댓글

Designed by JB FACTORY