zoukankan      html  css  js  c++  java
  • Linux远程桌面(二)

    上一篇远程桌面采用的独立服务配置不适用于过多用户,这一篇采用超级Internet服务器搭建vnc服务可以解决多用户问题。

                                                                       vnc之xinetd服务搭建配置

    Linux远程桌面(一):vnc之独立服务配置

    步骤一:

    (1)检查是否安装vnc服务和xinetd服务

    (检测是否安装vnc)
    # rpm -qa | grep vnc
    
    (检测是否安装xinetd)
    # rpm -qa | grep xinetd

    (2)若没有这两项服务就需要安装

    /etc/xinetd.conf和/etc/xinetd.d/*     (启动关闭)
    # /etc/init.d/xinetd restart
    
    # service xinetd restart
    xinetd:未识别的服务
    
    # service xinetd reload
    xinetd:未识别的服务
    
    #
    
    # rpm -ivh xinetd-2.3.14-10.el5.i386.rpm 
    Preparing...    #####################[100%]
    1:xinetd        #####################[100%]
    
    # service xinetd restart
    Stopping xinetd:                         [FAILED]
    Starting xinetd:                         [  OK  ]
    
    #
    安装完成!
    View Code

    步骤二:

    (1)配置xinetd

       由xinetd管理的服务器会将配置文件放在 /etc/xinetd.d 目录中。

       因此,要配置xinetd来处理VNC,您应当创建或编辑一个名称类似 /etc/xinetd.d/vnc 的文件。

        (在某些发行版上,比如openSUSE,VNC 服务器包会安装这样的一个文件。)

     # vi /etc/xinetd.d/vnc   (vnc为新建文件,名称可任意)

        内容如下:

     service vnc_001
    {
        user         = user001
        port         = 5901
        type         = UNLISTED
        disable      = no
        socket_type  = stream
        protocol     = tcp
        wait         = no         
        server       = /usr/bin/Xvnc
        server_args  = -inetd -query localhost -geometry 1366x768 -once -securitytypes=none
    }
    service vnc_002
    {
        user         = user002
        port         = 5902
        type         = UNLISTED
        disable      = no
        socket_type  = stream
        protocol     = tcp
        wait         = no         
        server       = /usr/bin/Xvnc
        server_args  = -inetd -query localhost -geometry 1366x768 -once -securitytypes=none
    }
    service vnc_003
    {
        user         = user003
        port         = 5903
        type         = UNLISTED
        disable      = no
        socket_type  = stream
        protocol     = tcp
        wait         = no         
        server       = /usr/bin/Xvnc
        server_args  = -inetd -query localhost -geometry 1366x768 -once -securitytypes=none
    }
    View Code

        说明:

     1 user            = root 表示执行此服务进程的用户是root。
     2 port            = 5900 vnc使用5900及以上端口
     3 disable         = yes 表示禁用这个服务。
     4 socket_type     = stream 表示服务的数据包类型为stream。
     5 wait            = no 表示不需等待,即服务将以多线程的方式运行。             
     6 server          = /usr/bin/Xvnc 启动脚本的位置。
     7 log_on_failure += USERID:表示设置失败时,UID添加到系统登记表。
     8 server_args     = :8 -inetd -once -query localhost -depth 16 -geometry 1024x768 -securitytypes=none
     9           
    10                   :8  指定启动Xvnc服务器的X Window系统显示器
    11                   -inetd  把Xvnc服务器作为守护进程运行,并预期从xinetd(inetd)运行它
    12                   -once  当建立连接时从头启动Xvnc服务器,当连接结束时,终止服务器。此参数还能阻止Xvnc服务器的多个副本在同一端口上启动。
    13                   -query localhost  该选项告诉VNC X服务器查询localhost系统以便进行XDMCP 身份验证。
    14                       如果您想使用一台计算机作为中继来访问另一台计算机上的程序,您可以更改它。
    15                   -depth 16  该选项设置颜色深度。较低的值能够产生较快的显示更新,但是高色彩桌面环境会因颜色工件而受到折损。
    16                       有效的值介于2到32之间。
    17                   -geometry 1024x768  您可以使用该选项设置 VNC 会话的虚拟分辨率。
    18                       注意,该分辨率不需要类同于在服务器计算机上运行的常规X服务器的分辨率。值小于服务器使用分辨率。
    19                       您可能想要创建以不同分辨率运行的多个条目,以便让用户使用其本地系统便于应用的任何分辨率登录到VNC服务器。
    20                   -securitytypes=none  指定Xvnc服务器不使用它自己内部安全机制(vncpasswd)来允许对vnc服务器的访问,因为XDMCP会处理这个问题。
    21                   
    22                 
    View Code

            还有许多其他选项,一些随VNC服务器的不同而不同。查询您的VNC服务器的文档,了解更多内容。

    步骤三:

    (1)添加vnc服务(可省略此步骤,作用在此步骤最后...)

     # vi /etc/services

        内容如下:

     1 # /etc/services:
     2 # $Id: services,v 1.42 2006/02/23 13:09:23 pknirsch Exp $
     3 #
     4 # Network services, Internet style
     5 #
     6 # Note that it is presently the policy of IANA to assign a single well-known
     7 # port number for both TCP and UDP; hence, most entries here have two entries
     8 # even if the protocol doesn't support UDP operations.
     9 # Updated from RFC 1700, ``Assigned Numbers'' (October 1994).  Not all ports
    10 # are included, only the more common ones.
    11 #
    12 # The latest IANA port assignments can be gotten from
    13 #       http://www.iana.org/assignments/port-numbers
    14 # The Well Known Ports are those from 0 through 1023.
    15 # The Registered Ports are those from 1024 through 49151
    16 # The Dynamic and/or Private Ports are those from 49152 through 65535
    17 #
    18 # Each line describes one service, and is of the form:
    19 #
    20 # service-name  port/protocol  [aliases ...]   [# comment]
    21 
    22 tcpmux          1/tcp                           # TCP port service multiplexer
    23 tcpmux          1/udp                           # TCP port service multiplexer
    24 rje             5/tcp                           # Remote Job Entry
    25 rje             5/udp                           # Remote Job Entry
    26 echo            7/tcp
    27 echo            7/udp
    28 ...(省略过多内容)
    29 ...(省略过多内容)
    30 ...(省略过多内容)
    31 com-bardac-dw   48556/tcp                       # com-bardac-dw
    32 com-bardac-dw   48556/udp                       # com-bardac-dw
    33 iqobject        48619/tcp                       # iqobject
    34 iqobject        48619/udp                       # iqobject
    35 # Local services
    36 vnc_001          5901/tcp     (添加)
    37 vnc_002          5902/tcp     (添加)
    38 vnc_003          5903/tcp     (添加)
    39 vnc_004          5904/tcp     (添加)
    View Code

    (2)添加到service的作用说明

     11)作用:
     2     /etc/services文件是记录网络服务名和它们对应使用的端口号及协议。
     32)格式:
     4     文件中的每一行对应一种服务,它由4个字段组成,中间用TAB或空格分隔,分别表示“服务名称”、“使用端口”、“协议名称”以及“别名”。
     5     服务名    "tab"    端口号/协议名    “tab” 别名
     6 
     7     kermit             1649/udp
     8     l2tp               1701/tcp          l2f
     9     l2tp               1701/udp          l2f
    10     h323gatedisc       1718/tcp
    113)应用:
    12     很多的系统程序要使用这个文件。
    13     如果每一个服务都能够严格遵循该机制,在此文件里标注自己所使用的端口信息,则主机上各服务间对端口的使用,将会非常清晰明了,易于管理;
    14     在该文件中定义的服务名,可以作为配置文件中的参数使用。例如:在配置路由策略时,使用"www"代替"80",即为调用了此文件中的条目“www  80”;
    15     且当有特殊情况,需要调整端口设置,只需要在/etc/services中修改www的定义,即可影响到服务。
    16     例如:
    17         在文件中增加条目“privPort 55555”,在某个私有服务中多个配置文件里广泛应用,进行配置。
    18         当有特殊需要,要将这些端口配置改为66666,则只需修改/etc/services文件中对应行即可。
    19         在应用程序中可以通过服务名和协议获取到对应的端口号,通过在该文件注册可以使应用程序不再关心端口号。
    204)端口分配:
    21     Linux系统的端口号的范围为0–65535,不同范围有不同的意义。
    22         0 不使用
    23         1--1023 系统保留,只能由root用户使用
    24         1024---4999 由客户端程序自由分配
    25         5000---65535 由服务器端程序自由分配
    265)如何使应用程序不再关心服务所使用的端口号?
    27     [1]确定服务程序名称,协议,端口号
    28     [2]在/etc/services中配置[1]中信息
    29     [3]应用程序可以不直接使用端口号,通过函数getservbyname("server","tcp")获取端口号。
    30     [4]如果服务想更改端口号只要更改/etc/services中的端口号就可以了,应用程序不需要做任何更改。
    31      注:同时可以通过函数getservbyport(htons(50),“tcp”)获取对应端口和规约上的服务名。
    32     使用这两个系统函数需要包含头文件:#include <netdb.h>
    View Code

    步骤四:

    (1)配置XDMCP服务器

      大部分Linux发行版配置其XDMCP服务,主要是为了管理本地显示。

      为了提供远程访问,您必须重新配置您的XDMCP服务器,以接受在同一台计算机上运行的VNC服务器的请求。具体细节因XDMCP服务器而异。

      Linux上最常用的三个XDMCP服务器是GNOME Display Manager(GDM)、Light Display Manager(LightDM)和KDE Display Manager(KDM)。

      其他XDMCP服务器,比如XDM,需要接受不同于此处所描述的调整。不管怎么,在重新配置您的XDMCP服务器之后,您需要重启它。

    # vi /etc/gdm/custom.conf    (/usr/share/gdm/defaults.conf //GNOME管理默认的配置文件)

        内容如下:

     1 # For full reference documentation see the gnome help browser under
     2 # GNOME|System category.  You can also find the docs in HTML form on
     3 # http://www.gnome.org/projects/gdm/
     4 #
     5 # NOTE: Lines that begin with "#" are considered comments.
     6 #
     7 # Have fun!
     8 
     9 [daemon]
    10 # RemoteGreeter=/usr/libexec/gdmlogin    (添加)(此远程登录界面为传统界面)
    11 RemoteGreeter=/usr/libexec/gdmgreeter    (添加)(此远程登录界面为正常界面)
    12 
    13 [security]
    14 AllowRemoteRoot=true    (添加)
    15 
    16 [xdmcp]
    17 Enable=true    (添加)
    18 Port=177    (添加,可去)
    19 
    20 [gui]
    21 
    22 [greeter]
    23 
    24 [chooser]
    25 
    26 [debug]
    27 
    28 # Note that to disable servers defined in the defaults.conf file (such as
    29 # 0=Standard, you must put a line in this file that says 0=inactive, as
    30 # described in the Configuration section of the GDM documentation.
    31 #
    32 [servers]
    33 
    34 # Also note, that if you redefine a [server-foo] section, then GDM will
    35 # use the definition in this file, not the defaults.conf file.  It is
    36 # currently not possible to disable a [server-foo] section defined
    37 # in the defaults.conf file.
    38 #
    View Code

        说明:daemon表示使用和本地一样的登录界面,不配置是个丑陋的简洁界面;

             security是允许使用root用户直接远程登录,一般不配置,不配置也可su - root登录终端;

             xdmcp表示启用服务,服务使用177端口。

       保存退出后,重启gdm,放开防火墙端口,即可远程登录。

     # /usr/sbin/gdm-restart 

     (2)也可以在rhel的桌面控制台上,使用图形窗口配置custom.conf内容。

     # /usr/bin/gdmsetup          

      最后,如果inittab(vi /etc/inittab)设置在文本模式运行级别3,命令行可能无法启动gdmsetup,估计是gdm相关的服务在引导3下没有启动。

    # cat /etc/inittab|grep id    (查看运行级别)
    # vi /etc/inittab    (编辑运行模式级别为GUI运行)

      内容如下:

     1 #
     2 # inittab       This file describes how the INIT process should set up
     3 #               the system in a certain run-level.
     4 #
     5 # Author:       Miquel van Smoorenburg, <miquels@drinkel.nl.mugnet.org>
     6 #               Modified for RHS Linux by Marc Ewing and Donnie Barnes
     7 #
     8 
     9 # Default runlevel. The runlevels used by RHS are:
    10 #   0 - halt (Do NOT set initdefault to this)
    11 #   1 - Single user mode
    12 #   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
    13 #   3 - Full multiuser mode
    14 #   4 - unused
    15 #   5 - X11
    16 #   6 - reboot (Do NOT set initdefault to this)
    17 # 
    18 id:5:initdefault:
    19 
    20 # System initialization.
    21 si::sysinit:/etc/rc.d/rc.sysinit
    22 
    23 l0:0:wait:/etc/rc.d/rc 0
    24 l1:1:wait:/etc/rc.d/rc 1
    25 l2:2:wait:/etc/rc.d/rc 2
    26 l3:3:wait:/etc/rc.d/rc 3
    27 l4:4:wait:/etc/rc.d/rc 4
    28 l5:5:wait:/etc/rc.d/rc 5
    29 l6:6:wait:/etc/rc.d/rc 6
    30 
    31 # Trap CTRL-ALT-DELETE
    32 ca::ctrlaltdel:/sbin/shutdown -t3 -r now
    33 
    34 # When our UPS tells us power has failed, assume we have a few minutes
    35 # of power left.  Schedule a shutdown for 2 minutes from now.
    36 # This does, of course, assume you have powerd installed and your
    37 # UPS connected and working correctly.  
    38 pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down"
    39 
    40 # If power was restored before the shutdown kicked in, cancel it.
    41 pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled"
    42 
    43 
    44 # Run gettys in standard runlevels
    45 1:2345:respawn:/sbin/mingetty tty1
    46 2:2345:respawn:/sbin/mingetty tty2
    47 3:2345:respawn:/sbin/mingetty tty3
    48 4:2345:respawn:/sbin/mingetty tty4
    49 5:2345:respawn:/sbin/mingetty tty5
    50 6:2345:respawn:/sbin/mingetty tty6
    51 
    52 # Run xdm in runlevel 5
    53 x:5:respawn:/etc/X11/prefdm -nodaemon
    View Code

    步骤五:

    (1)配置防火墙

    # vi /etc/sysconfig/iptables 

      内容如下:

     1 # Firewall configuration written by system-config-securitylevel
     2 # Manual customization of this file is not recommended.
     3 *filter
     4 :INPUT ACCEPT [0:0]
     5 :FORWARD ACCEPT [0:0]
     6 :OUTPUT ACCEPT [0:0]
     7 :RH-Firewall-1-INPUT - [0:0]
     8 -A INPUT -j RH-Firewall-1-INPUT
     9 -A FORWARD -j RH-Firewall-1-INPUT
    10 -A RH-Firewall-1-INPUT -i lo -j ACCEPT
    11 -A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
    12 -A RH-Firewall-1-INPUT -p 50 -j ACCEPT
    13 -A RH-Firewall-1-INPUT -p 51 -j ACCEPT
    14 -A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
    15 -A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
    16 -A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
    17 -A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    18 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
    19 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5901 -j ACCEPT    (添加)
    20 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5902 -j ACCEPT    (添加)
    21 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5903 -j ACCEPT    (添加)
    22 -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 5904 -j ACCEPT    (添加)
    23 -A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
    24 COMMIT
    View Code

    (2)也可关闭防火墙(不建议)

    # service iptables stop    (即时关闭防火墙,重启失效)
    # chkconfig iptables off    (永久关闭防火墙,重启有效)

    步骤六:

      重启,vnc客户端连接测试

    # shutdown -h now    (立刻关机)
    # shutdown -r now     (立刻重启)

    步骤七: 维护

      如果在执行该测试时您没有看到一个XDMCP登录界面,那么就需要进行一些调试。要检查的内容包括:

      (1)如果vncviewer报告连接被拒绝,这很可能意味着超级服务器没有在VNC服务器计算机上得到适当的配置。检查您的 xinetd配置,尝试重启超级服务器。也有可能是防火

    墙阻止对 VNC 服务器计算机的访问。

      (2)如果 VNC 客户端启动并连接到了服务器,但是您所看到的只是一个灰色屏幕以及一个可随处移动的光标,问题可能出在XDMCP服务器配置上。检查之前描述的设置,并

    重新启动XDMCP服务器。

      (3)一个通用的故障排除方法就是检查您的日志文件。您可能需要搜索/var/log中的所有日志文件,查看是否引用到xinetd、您的XDMCP 服务器和您的VNC服务器。

      VNC 安全隐患:

      RFB 不是一个安全协议;大多数 VNC 客户端和服务器不对它们的数据进行加密。(虽然 VNC 对其自己的密码进行加密,但是这里描述的方法不使用这些密码。)要对部署

    VMC 的地点和方式十分谨慎。如果您希望在一个不安全的网络上使用 VNC,您有三个选择:

            使用一个虚拟专用网络 (VPN)。

            通过 SSH 通道传输协议。

            使用一个支持加密的 VNC 变体,比如 TigerVNC,它启用传输层安全加密。

      实现本文所描述的 VNC 登录会至少开启两个通向外界的端口(VNC 端口和 XDMCP 端口)。您可能希望使用防火墙规则同时限制这两个端口,以最大限度地降低滥用的风险。注意,XDMCP端口(UDP端口177)仅需要向 localhost开放,因此其防火墙规则会相当严格。

      结束语:
      总的来讲,链接VNC和XDMCP是支持通过远程GUI登录到多用户Linux计算机的一个非常有用的技术。该方法比在跨平台环境中直接使用XDMCP 或者在防火墙或NAT问题难

    以解决时使用XDMCP更有优势。它比多用户计算机上更加常见的直接VNC方法更有益。如果您使用该方法,一定要考虑安全性问题。请准备好设置防火墙规则来限制不需要的外部

    访问,并且如果您的传输经由不可信赖的网络,请务必使用加密功能。

    https://www.ibm.com/developerworks/cn/opensource/os-multiuserloginsvnc/#ibm-pcon

    如有错误还请指出,如有侵权还请告知,如需转载请注明出处!                                              

    本人博客:http://www.cnblogs.com/yllinux/

  • 相关阅读:
    Vue 组件4 动态组件
    Vue 组件3 作用域插槽
    Vue 组件 非父子组件通信
    vue 组件1
    单例模式--反射--防止序列化破坏单例模式
    遇到构造器中有多个可选参数时要考虑用构建器
    考虑用静态工厂方法代替构造器的场景
    转载--技术人员的发展之路
    一道lambda表达式题目
    想法跟实践的距离
  • 原文地址:https://www.cnblogs.com/yllinux/p/6986406.html
Copyright © 2011-2022 走看看