62 lines
1.8 KiB
C
62 lines
1.8 KiB
C
#include <stdio.h>
|
|
#include <stdlib.h>
|
|
#include <string.h>
|
|
#include <unistd.h>
|
|
#include <sys/socket.h>
|
|
#include <sys/ioctl.h>
|
|
#include <net/route.h> // struct rtentry
|
|
#include <arpa/inet.h>
|
|
|
|
// 사용법: route add default gw <GATEWAY_IP>
|
|
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 <GATEWAY_IP>\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;
|
|
} |