Hãy để Xorg nghe trên TCP, nhưng chỉ với localhost?


12

Tôi có một số chương trình máy khách X cần truy cập vào máy chủ X. Nó chỉ có thể truy cập máy chủ X bằng TCP, không phải bằng các phương thức khác như ổ cắm miền unix. Nó sẽ chạy trên cùng một máy chủ với máy chủ, để làm cho mọi thứ dễ dàng.

Vậy, làm cách nào tôi có thể khiến máy chủ Xorg của mình nghe trên cổng TCP 6000, nhưng chỉ cho các kết nối từ localhost?

Tôi đã tìm thấy Làm thế nào để làm cho X.org nghe các kết nối từ xa trên cổng 6000? , giải thích cách bật quyền truy cập cho máy chủ từ xa, nhưng tôi không thực sự muốn truy cập từ xa (vì lý do bảo mật, chủ yếu).

Tôi đã nghĩ về việc bằng cách nào đó chuyển tiếp vận chuyển mặc định sang TCP, nhưng tôi không thực sự tìm thấy thông tin về việc vận chuyển mặc định là gì.

(Tôi đang sử dụng kdm làm trình quản lý hiển thị của mình ở đây, nhưng tôi nghĩ rằng tôi có thể chuyển các giải pháp cho trình quản lý hiển thị hoặc thậm chí chuyển đổi trình quản lý hiển thị.)

Có ý kiến ​​gì không?

Đây là vào ngày 11.04 trên bản cài đặt Kubfox-Ubuntu-XUb Ubuntu hỗn hợp (ban đầu là Kubfox, nhưng tôi đã thêm ubfox-desktop và xubfox-desktop. Khi khởi động, nó hiện đang nói Xubfox 11.04). Tôi hiện đang sử dụng máy tính để bàn cổ điển gnome, tôi nghĩ, từ KDM.


Đối với tất cả các thắc mắc máy khách X này là gì: Trên thực tế, đó là một triển khai Java SSH ( JSch ) cố gắng chuyển tiếp X đến một máy chủ khác. Java thực sự không thể truy cập vào các ổ cắm tên miền unix. Vấn đề tương tự cũng sẽ áp dụng cho một dự án khác (hiện đã tạm dừng) của tôi, nơi tôi muốn triển khai một máy khách X trong Java thuần (ví dụ: bằng cách đọc / ghi một socket, không sử dụng một số thư viện cửa sổ).
Paŭlo Ebermann

@Paulo, java thực sự có thể sử dụng các socket miền unix (bạn có thể viết thư viện riêng sẽ cung cấp quyền truy cập vào các tòa nhà chọc trời cần thiết hoặc chỉ cần tìm đã được viết). Nhưng sau đó, fwiw, bạn thực sự mất đi lợi ích chính của java: tính di động cao. Vì vậy, nếu bạn thực sự cần thiết, bạn có thể dễ dàng viết thư viện máy khách X trong java, nó sẽ hoạt động trên PF_LOCAL. Cũng lưu ý rằng giao diện TCP over loopback có chi phí hoạt động cao hơn nhiều so với ổ cắm unix tiêu chuẩn.
ulidtko

Có, tôi đã tìm thấy một số thư viện, nhưng điều này sẽ không giúp tôi miễn là tôi không biết địa chỉ UDS thực tế. Đây có phải là tài liệu ở đâu đó?
Paŭlo Ebermann

1
@Paulo, ổ cắm miền unix thường sử dụng không gian tên của hệ thống tập tin. Địa chỉ của họ là tên tập tin . Các nút tệp tương ứng là "tệp ổ cắm đặc biệt". Trên hệ thống của tôi, tôi có rất nhiều kết nối tới /tmp/.X11-unix/X0- đây một ví dụ về địa chỉ AF_UNIX (sử dụng netstat -xđể xem địa chỉ của chính bạn). Đặc tả giao thức X11 sẽ xác định các địa chỉ chính xác để kết nối. Và bạn thực sự PHẢI đọc nó nếu bạn đang viết thư viện máy khách cho giao thức đó.
ulidtko

1
/tmp/.X11-unix/X0tồn tại dưới dạng ổ cắm ở đây (OpenSUSE), tôi cũng sẽ kiểm tra lại tại nhà (trên hệ thống Ubuntu có tên trong câu hỏi). Bây giờ tôi chỉ phải xem làm thế nào để chuyển tiếp cái này đến ổ cắm TCP vào lúc 6000.
Paŭlo Ebermann

Câu trả lời:


8

Có vẻ như một cách giải quyết sẽ được sử dụng socat. Đây là một dòng lệnh dường như hoạt động, nếu máy chủ X chưa chạy trên TCP:

socat -d -d TCP-LISTEN:6000,fork,bind=localhost UNIX-CONNECT:/tmp/.X11-unix/X0

Sau đó tôi có thể làm

xlogo -display localhost:0

Kỳ lạ thay, nó dường như không hoạt động nếu tôi để nó nghe trên 6001 và sau đó chỉ định màn hình localhost:1thay vì localhost:0- tôi nhận được No protocol specified. Có vẻ tôi sẽ phải đọc lại giao thức X. (Và qua JSch thì nó thoát ra Invalid MIT-MAGIC-COOKIE-1 key, nhưng đây là một vấn đề khác.)


Đúng!! Tôi đã được tìm kiếm một cách để làm xserver-allow-tcp=true sau khi X đã được bắt đầu với -nolisten tcp trong /etc/X11/xinit/xserverrcmà không khởi động lại. Chỉ trong trường hợp của tôi, bind=0.0.0.0để cho phép các máy chủ bên ngoài của tôi.
Marcos

5

Mã Xorg hiện không có bất kỳ tùy chọn nào để kiểm soát giao diện nào cần nghe. Không nên thêm khó khăn, nhưng việc cấu hình tường lửa của bạn để chặn các kết nối đến cổng 6000 từ các máy khác sẽ dễ dàng hơn nữa.


2

Chỉ là một vài suy nghĩ khác ...

  1. Cho phép nhưng chặn với xhost (và / hoặc lọc mạng)

Cách truyền thống để làm điều này là cho máy chủ X lắng nghe ổ cắm TCP và sử dụng xhost để xác định máy chủ nào được phép kết nối. Xem trang man cho xhost (1). (Ngoài ra, tất nhiên, địa chỉ IP và lọc cổng cũng sẽ giúp ích ở đây, như các đề xuất trước đây đã lưu ý.)

  1. Chỉ nghe trên giao diện cục bộ

Theo nhận xét của alanc ở trên, hiện tại không có mã nào, nhưng gần như vậy!

Hãy nhớ rằng (hầu hết) tất cả các máy chủ đều có ít nhất hai giao diện, giao diện loopback lo0 (luôn là 127.0.0.1) và ethernet eth0 bình thường (hoặc wlan0 hoặc bất cứ thứ gì, giả sử là 192.168.0.128) và nhiều giao diện khác có nhiều hơn. Thông thường các máy chủ TCP / IP (tức là máy chủ X) sẽ cho phép các kết nối đến bất kỳ địa chỉ IP nào của chúng trên bất kỳ giao diện nào của chúng, nhưng hầu hết các phần mềm sẽ cho phép bạn chỉ định địa chỉ IP nếu bạn muốn. Công việc thực tế được thực hiện bằng liên kết (2), lấy INADDR_ANY (0.0.0.0) hoặc địa chỉ IP thực.

Máy chủ Xorg thực hiện -name địa chỉ cục bộ nhưng không may, điều này chỉ dành cho XDMCP (xem tệp os / xdmcp.c, thực hiện chính xác theo như tôi biết.) Kết nối thực tế cho giao thức X, tôi tin rằng, được thực hiện bởi SocketINETCreateListener trong tệp /usr/include/X11/Xtrans/Xtranssock.c, đặt địa chỉ thành INADDR_ANY và sau đó liên kết với nó mà không cần xử lý thêm. Điều cần thiết là cờ -from (được xử lý bởi os / xdmcp.c là FromAddress) để bằng cách nào đó kết nối thông qua biến 'sockname' ngay trước SocketCreateListener () trong Xtranssock.c. Vấn đề, tất nhiên, là tất cả những thứ vận chuyển thực sự được thực hiện theo cách trung lập trong vận chuyển nên sẽ hơi khó khăn để đưa thông tin vào Xtranssock.c.

Đường dẫn tệp có thể khác nhau, đã được xem xét với Ubuntu 10.04 LTS và lưu ý rằng tên hàm trong Xtranssock.c đã thay đổi bởi một TRANS macro. http://cgit.freedesktop.org/xorg/xserver/tree/os/xdmcp.c

Hy vọng đó là một số sử dụng.

Trân trọng

Jonathan.


Hiện tại, tôi đang sử dụng xác thực cookie ma thuật, do đó, ngay cả các kết nối từ cùng một máy chủ sẽ không được phép. xhostsẽ mở rộng truy cập, không thu hẹp nó.
Paŭlo Ebermann

Và tôi không nghĩ rằng tôi sẽ hack vào máy chủ X của mình, nhưng cảm ơn vì lời đề nghị về nơi để làm như vậy.
Paŭlo Ebermann

9 năm sau và điều này không thay đổi. gitlab.freedesktop.org/xorg/lib/libxtrans/blob/master/ mẹo
daveloyall
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.