본문으로 바로가기
반응형

오늘 갑자기 발생한 socket() 함수 에러에 대해서 알아보겠습니다.

-------------------------------------------------------------------------
[test@test users]$ cat test.c
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <unistd.h>

int main(){
        int sockfd = socket(PF_INET,SOCK_PACKET , 0);
        if (sockfd < 0) {
                perror("socket");
                exit(EXIT_FAILURE);
        }
}
[test@test users]$ ./test
socket: Operation not permitted
-------------------------------------------------------------------------

위의 소스코드를 한번 살펴보겠습니다.

redhat 8.8을 사용하고 있습니다.

위의 c 파일을 컴파일 한 후, 일반 계정 test로 접속하여 프로그램을 실행했습니다.

에러가 뜹니다...

직역하면 허용되지 않는 동작이라고 합니다.

분명히 무엇인가 문제가 있다는 것이고, root 계정으로 접속해서 실행하니 정상적으로 동작합니다.

일단은 구글링 + chatgpt의 도움을 받아서 해결했습니다.

결론적으로는 권한 이슈입니다.

socket 함수의 두번째 인자인 SOCK_PACKET 옵션이 문제였습니다.

SOCK_PACKET 옵션의 경우, 기본적으로 루트 권한에서만 설정 가능합니다.

이유는 패킷을 저수준에서 조작할 수 있기 때문입니다.

리눅스에서는 보안문제로 root 권한에서만 SOCK_PACKET를 사용할 수 있게 되어 있습니다.

그런데 저는 일반계정으로 저 옵션을 써야됩니다!

해결방법으로는 리눅스 명령어를 한번 수행하면됩니다.

]# setcap cap_net_raw+ep [프로그램명]

이렇게 하면 위에서 입력한 프로그램이 SOCK_PACKET 옵션을 사용할 수 있도록 권한을 주는것입니다.

]# setcap cap_net_raw+ep test

위의 명령어 실행 후, test 프로그램을 실행하면 에러없이 실행되는 것을 볼 수 있습니다.

반응형