저는 간단한 X11 유닉스 소켓 기반 프록시를 작성하려고 합니다. 다양한 표준 애플리케이션을 시도하고 나만의 코드를 작성했지만 얻은 결과는 매우 다양했습니다. 무엇이 잘못되었나요?
배경:나의 궁극적인 목표는 xpra 및 xepyr에 대한 경량 대체품으로 보안 목적으로 필터링 X11 프록시를 구현하는 것입니다. 바라보다Firejail을 사용하여 Firefox 브라우저 샌드박스X11 취약점에 대한 추가 정보.
노력하다
ssh localhost -X
우리는 X 리트윗을 알고 사랑합니다
ssh
. 좋은 결과.ssh localhost -R /tmp/.X11-unix/Xnnn:/tmp/.X11-unix/X0
ssh
소켓도 전달할 수 있으며 X 전달이 이를 잘 처리합니다. (참고로 수동으로 설정해야 합니다DISPLAY=:nnn
.)socat UNIX-LISTEN:/tmp/.X11-unix/Xnnn,fork UNIX-CONNECT:/tmp/.X11-unix/X0
socat
본질적으로 소켓 프록시로 설계된 프로그램입니다. 그러나 이를 통한 X11 전달은 불안정합니다. (참고로 수동으로 설정해야 합니다DISPLAY=:nnn
.)socat UNIX-LISTEN:/tmp/.X11-unix/Xnnn UNIX-CONNECT:/tmp/.X11-unix/X0
모든 연결을 분기하는 대신
socat
하나의 연결만 처리한 다음 종료할 수 있습니다. 이렇게 하면 Firefox가 작동하지만 Okular 또는 keepassx는 작동하지 않으며 지속적으로 실행되는 프록시가 필요하기 때문에 어떤 경우에도 실용적이지 않습니다.-
애플리케이션은 들어오는 각 연결에 대해 스레드를 시작하고 프록시 소켓에서 서버 소켓으로 또는 그 반대로만 데이터를 전달합니다. 결과는 같습니다
socat fork
내가 작성한 Haskell 앱은 소켓을 전달하지만 하나의 연결만 허용합니다.
위와 동일하지만 하나의 연결만 허용합니다. 결과
socat
는 no 와 동일하며fork
이는 의심스럽습니다.
결과
나는 기본 X 애플리케이션( , , , ), Firefox, Firefox를 사용하여 xterm
모든 프록시 시도를 테스트했습니다 xeyes
.xclock
xev
오쿠라그리고 keepassx
. 결과는 다음과 같습니다. ✓ 유효한 경우, 유효하지 않은 경우 공백입니다. 작동하지 않는 조합의 경우 애플리케이션은 출력 없이 "중단"되며 아무 것도 수행 중이라는 표시도 없습니다.
ssh -X |
ssh -R |
socat fork |
socat 아니요fork |
하스켈 애플리케이션 | Haskell 응용 프로그램은 하나만 허용됩니다. | |
---|---|---|---|---|---|---|
베이직X | ✓ | ✓ | ✓ | ✓ | ✓ | ✓ |
파이어폭스 브라우저 | ✓ | ✓ | ✓ | ✓ | ||
오쿠라 | ✓ | ✓ | ||||
비밀번호를 유지하다 | ✓ | ✓ |
질문
가장 큰 질문은 왜 작동하지 않는가 socat
입니다 ssh
. socat
유일한 작업은 소켓을 전달하는 것이므로 다른 작업이 있는 것 외에도 성능이 좋지 않다는 것에 놀랐습니다 ssh
. 내가 찾은openssh의 소켓 전달 소스socat
하지만 작동하지 않는 방식으로 작동하는 이유를 이해하기에는 너무 복잡합니다.
내가 누락되었을 수 있는 소켓 프록시 애플리케이션에 분명한 내용을 작성해야 합니까?
배울 수 있는 X를 성공적으로 전달할 수 있는 간단한(몇백 줄) 소켓 프록시의 예제 소스 코드가 있습니까? openssh 코드 베이스가 너무 큽니다.
Firefox가 새 연결 허용을 중단하면 socat
내 앱이 갑자기 Firefox와 작동하기 시작하는 이유는 무엇입니까 ?
답변1
하나 이상의 X 확장(내 생각에는 DRI가 그 중 하나라고 생각함)은 유닉스 도메인 소켓을 통해 파일 설명자를 보내고 이러한 파일 설명자는 프록시되지 send
않습니다 recv
. 대신 sendmsg
/를 사용 recvmsg
하고 모든 CMsg 데이터를 보내야 합니다.
이것은 당신이 찾은 결과를 잘 설명합니다. socat
파일 설명자가 프록시되지 않고(코드에서 호출되지 않음 sendmsg
) 하스켈 애플리케이션도 프록시되지 않는다고 생각합니다 . 왜 그것이 작동하는지 이해하지 못합니다 ssh -R
.
네이티브 X11 프록시를 작성하려고 할 때 나 자신도 이 문제로 인해 당황했습니다. 마침내 소스 코드를 조작하여 문제를 해결했고 xtrace
유닉스 연결을 성공적으로 프록시했습니다.