현재 위치: > 최신 기사 목록> 소켓 옵션을 설정할 때 Socket_set_option 공통 권한 오류 및 해당 솔루션

소켓 옵션을 설정할 때 Socket_set_option 공통 권한 오류 및 해당 솔루션

gitbox 2025-05-29

PHP를 사용하여 네트워크를 프로그래밍 할 때 Socket_set_option은 개발자가 다양한 커뮤니케이션 요구를 충족시키기 위해 소켓에 대한 다양한 옵션을 설정할 수있는 매우 중요한 기능입니다. 그러나 실제 개발 에서이 기능을 사용하여 소켓 옵션을 설정할 때 특히 서버 환경이나 로컬 개발 중에 권한 관련 오류가 발생합니다. 이 기사는 이러한 일반적인 권한 오류를 분석하고 해당 솔루션을 제공합니다.

1. 공통 권한 오류 유형

1. 경고 : socket_set_option () : 소켓 설정 옵션 옵션 [13] : 허가 거부

이것은 가장 일반적인 실수 중 하나입니다. 오류 코드 [13] 는 "허가 거부"를 의미합니다. 즉, 허가가 거부됩니다. 이것은 일반적으로 SO_BROADCAST 또는 SO_REUSEPORT 와 같은 일부 시스템으로 보호 된 소켓 옵션을 설정할 때 발생합니다.

2. socket_set_option () 의 원시 소켓의 제한 사항

원래 소켓에 대한 IP_HDRINCL 과 ​​같은 옵션을 설정하려고 할 때 스크립트에 충분한 권한이없는 경우 (예 : 루트로 실행되지 않음) 시스템에 의해 금지됩니다.

3. Selinux 또는 Apparmor에 대한 제한

Selinux 또는 Apparmor와 같은 보안 모듈이 엄격하게 구성된 시스템에서 정책 제한으로 인해 일부 소켓 옵션이 설정되지 않을 수 있습니다.

2. 권한 오류로 이어지는 일반적인 시나리오 분석

  • PHP-FPM 또는 CLI를 비정상적인 사용자로 실행하십시오 . 기본적으로 웹 서버 (예 : Nginx, Apache) 또는 CLI PHP 프로그램은 일반적으로 뿌리가 아닌 사용자로 실행되므로 고급 권한이 필요한 특정 옵션을 설정하려고 할 때 실패합니다.

  • 제한된 포트 또는 브로드 캐스트 주소에 바인딩 : SO_BROADCAST 와 같은 포트를 사용하거나 1024 미만의 포트에 바인딩 할 때 운영 체제는 뿌리가 아닌 사용자가 사용하는 것을 제한 할 수 있습니다.

  • Docker 또는 제한된 컨테이너 환경에서 실행 : 권한이 올바르게 구성되지 않으면 컨테이너화 된 PHP 프로그램이 그러한 오류에 직면 할 수도 있습니다.

3. 솔루션

1. 스크립트를 실행할 때 권한을 높이십시오

허용되는 경우 스크립트를 실행할 권한을 늘려 해결할 수 있습니다.

 sudo php your_script.php

또는 특정 사용자가 루트 권한으로 PHP를 실행할 수 있도록 웹 서비스를 구성하지만,이 관행은 보안 위험이 있으며 생산 환경에서는 권장되지 않습니다.

2. 시스템 구성 파일 수정 (예 : Sudoers)

CLI 스크립트의 경우 /etc /sudoers를 구성하여 특정 사용자가 암호를 입력하지 않고 루트 권한으로 특정 PHP 스크립트를 실행할 수 있도록 구성 할 수 있습니다.

 username ALL=(ALL) NOPASSWD: /usr/bin/php /path/to/your_script.php

3. SetCap을 사용하여 CAP_NET_RAW 권한을 설정하십시오

원래 패킷을 보내는 것이 필요한 소켓 작업의 경우 PHP 실행 파일에 필요한 권한을 부여 할 수 있습니다.

 sudo setcap cap_net_raw+ep /usr/bin/php

이렇게하면 전체 PHP 스크립트를 루트로 실행할 필요는 없지만 여전히 필요한 소켓 작업을 수행 할 수 있습니다.

4. Selinux 또는 Apparmor 정책을 점검하고 구성하십시오

Selinux 또는 AppArmor가 활성화 된 시스템의 경우 보안 정책이 소켓의 특정 작업을 차단하는지 확인하십시오. 다음 명령을 따라 Selinux 로그를 확인할 수 있습니다.

 sudo ausearch -m avc -ts recent

AppArmor의 경우 /var/log/syslog 인 관련 제한 로그를 볼 필요가 있습니다.

5. 제한된 포트 이외의 통신 정책을 사용하십시오

예를 들어, 루트 권한이 필요하지 않도록 서비스 포트를 1024 이상으로 조정하십시오.

 $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($socket, '0.0.0.0', 12345); // 비전없는 포트 사용

6. 불필요한 옵션 설정을 피하십시오

예를 들어 SO_BROADCAST 는 UDP 방송에만 사용되며 TCP 연결에서 완전히 무시할 수있는 경우 소켓 설정이 필요하지 않습니다.

 socket_set_option($socket, SOL_SOCKET, SO_BROADCAST, 1); // 실제로 필요한 경우에만 설정하십시오

4. 디버깅 기술 및 로그 모니터링

권한 관련 오류 문제를 해결하면 자세한 오류 로그 출력을 활성화하는 것이 좋습니다.

 error_reporting(E_ALL);
ini_set('display_errors', 1);

시스템 로그 (예 : /var/log/syslog , /var/log/php-fpp.log )를 결합하여 더 많은 컨텍스트 정보를 얻습니다.

또한 코드에 디버그 정보를 추가하여 문제를 찾는 데 도움이 될 수 있습니다.

 if (!socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1)) {
    echo "Set option failed: " . socket_strerror(socket_last_error($socket)) . PHP_EOL;
}

5. 요약

공통 권한 오류는 일반적으로 소켓 구성에 Socket_set_option을 사용할 때 시스템 권한, 보안 정책 제한 또는 잘못된 매개 변수 설정으로 인해 발생합니다. 이러한 유형의 문제는 실행 권한을 개선하거나 시스템 보안 정책을 구성하거나 소켓 사용을 최적화함으로써 효과적으로 피하고 해결할 수 있습니다.

생산 환경에서는 루트 권한을 사용하여 PHP 스크립트를 실행하지 말고 보안과 기능 간의 균형을 보장하기 위해 더 미세한 과립 허가 제어 ( SetCap 또는 특수 시스템 사용자 권한 구성 등)를 통해 필요한 기능을 구현하십시오. 실제 프로젝트에서 방송 또는 저 포트 바인딩 커뮤니케이션을 구현하려면 https://gitbox.net/docs/php-socket-broadcast 의 샘플 코드 및 실제 경험을 참조하십시오.