오늘 갑자기 발생한 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 프로그램을 실행하면 에러없이 실행되는 것을 볼 수 있습니다.
반응형
반응형
프로그래밍C카테고리의 다른글
[C] 리눅스에서 ctag로 하위디렉토리 까지 검색하는 방법 (0) | 2024.02.13 |
---|---|
[C] curl 라이브러리 thread safe (2) | 2023.07.13 |
[C] 디렉토리 검색 함수 scandir (0) | 2023.06.29 |
[C] 문자열에서 CRLF 찾는 방법 (0) | 2023.03.30 |
[C] memcpy vs sprintf 차이? (0) | 2023.03.08 |