#include #include #include #include #include #include #include // struct rtentry #include // 사용법: route add default gw int main(int argc, char *argv[]) { // 파싱을 간단하게 하기 위해 고정된 포맷만 지원 if (argc != 5 || strcmp(argv[1], "add") != 0 || strcmp(argv[2], "default") != 0 || strcmp(argv[3], "gw") != 0) { printf("Usage: route add default gw \n"); return 1; } int sockfd = socket(AF_INET, SOCK_DGRAM, 0); if (sockfd < 0) { perror("socket"); return 1; } struct rtentry rt; memset(&rt, 0, sizeof(rt)); // 1. 목적지 (Destination): 0.0.0.0 (모든 주소) struct sockaddr_in *dst = (struct sockaddr_in *)&rt.rt_dst; dst->sin_family = AF_INET; dst->sin_addr.s_addr = INADDR_ANY; // 2. 마스크 (Genmask): 0.0.0.0 (모든 비트 허용) struct sockaddr_in *mask = (struct sockaddr_in *)&rt.rt_genmask; mask->sin_family = AF_INET; mask->sin_addr.s_addr = INADDR_ANY; // 3. 게이트웨이 (Gateway): 입력받은 IP (예: 10.0.2.2) struct sockaddr_in *gw = (struct sockaddr_in *)&rt.rt_gateway; gw->sin_family = AF_INET; if (inet_pton(AF_INET, argv[4], &gw->sin_addr) <= 0) { printf("Invalid Gateway IP\n"); close(sockfd); return 1; } // 4. 플래그 설정 // RTF_UP: 경로 활성화 // RTF_GATEWAY: 목적지가 게이트웨이임 rt.rt_flags = RTF_UP | RTF_GATEWAY; // 5. 커널에 라우팅 테이블 추가 요청 (SIOCADDRT) if (ioctl(sockfd, SIOCADDRT, &rt) < 0) { perror("route add"); close(sockfd); return 1; } printf("Default gateway set to %s\n", argv[4]); close(sockfd); return 0; }