| SSH(1) General Commands Manual SSH(1) |
| |
| NAME |
| ssh M-bM-^@M-^S OpenSSH SSH client (remote login program) |
| |
| SYNOPSIS |
| ssh [-1246AaCfGgKkMNnqsTtVvXxYy] [-b bind_address] [-c cipher_spec] |
| [-D [bind_address:]port] [-E log_file] [-e escape_char] |
| [-F configfile] [-I pkcs11] [-i identity_file] |
| [-L [bind_address:]port:host:hostport] [-l login_name] [-m mac_spec] |
| [-O ctl_cmd] [-o option] [-p port] |
| [-Q cipher | cipher-auth | mac | kex | key | protocol-version] |
| [-R [bind_address:]port:host:hostport] [-S ctl_path] [-W host:port] |
| [-w local_tun[:remote_tun]] [user@]hostname [command] |
| |
| DESCRIPTION |
| ssh (SSH client) is a program for logging into a remote machine and for |
| executing commands on a remote machine. It is intended to replace rlogin |
| and rsh, and provide secure encrypted communications between two |
| untrusted hosts over an insecure network. X11 connections, arbitrary TCP |
| ports and UNIX-domain sockets can also be forwarded over the secure |
| channel. |
| |
| ssh connects and logs into the specified hostname (with optional user |
| name). The user must prove his/her identity to the remote machine using |
| one of several methods depending on the protocol version used (see |
| below). |
| |
| If command is specified, it is executed on the remote host instead of a |
| login shell. |
| |
| The options are as follows: |
| |
| -1 Forces ssh to try protocol version 1 only. |
| |
| -2 Forces ssh to try protocol version 2 only. |
| |
| -4 Forces ssh to use IPv4 addresses only. |
| |
| -6 Forces ssh to use IPv6 addresses only. |
| |
| -A Enables forwarding of the authentication agent connection. This |
| can also be specified on a per-host basis in a configuration |
| file. |
| |
| Agent forwarding should be enabled with caution. Users with the |
| ability to bypass file permissions on the remote host (for the |
| agent's UNIX-domain socket) can access the local agent through |
| the forwarded connection. An attacker cannot obtain key material |
| from the agent, however they can perform operations on the keys |
| that enable them to authenticate using the identities loaded into |
| the agent. |
| |
| -a Disables forwarding of the authentication agent connection. |
| |
| -b bind_address |
| Use bind_address on the local machine as the source address of |
| the connection. Only useful on systems with more than one |
| address. |
| |
| -C Requests compression of all data (including stdin, stdout, |
| stderr, and data for forwarded X11, TCP and UNIX-domain |
| connections). The compression algorithm is the same used by |
| gzip(1), and the M-bM-^@M-^\levelM-bM-^@M-^] can be controlled by the |
| CompressionLevel option for protocol version 1. Compression is |
| desirable on modem lines and other slow connections, but will |
| only slow down things on fast networks. The default value can be |
| set on a host-by-host basis in the configuration files; see the |
| Compression option. |
| |
| -c cipher_spec |
| Selects the cipher specification for encrypting the session. |
| |
| Protocol version 1 allows specification of a single cipher. The |
| supported values are M-bM-^@M-^\3desM-bM-^@M-^], M-bM-^@M-^\blowfishM-bM-^@M-^], and M-bM-^@M-^\desM-bM-^@M-^]. For protocol |
| version 2, cipher_spec is a comma-separated list of ciphers |
| listed in order of preference. See the Ciphers keyword in |
| ssh_config(5) for more information. |
| |
| -D [bind_address:]port |
| Specifies a local M-bM-^@M-^\dynamicM-bM-^@M-^] application-level port forwarding. |
| This works by allocating a socket to listen to port on the local |
| side, optionally bound to the specified bind_address. Whenever a |
| connection is made to this port, the connection is forwarded over |
| the secure channel, and the application protocol is then used to |
| determine where to connect to from the remote machine. Currently |
| the SOCKS4 and SOCKS5 protocols are supported, and ssh will act |
| as a SOCKS server. Only root can forward privileged ports. |
| Dynamic port forwardings can also be specified in the |
| configuration file. |
| |
| IPv6 addresses can be specified by enclosing the address in |
| square brackets. Only the superuser can forward privileged |
| ports. By default, the local port is bound in accordance with |
| the GatewayPorts setting. However, an explicit bind_address may |
| be used to bind the connection to a specific address. The |
| bind_address of M-bM-^@M-^\localhostM-bM-^@M-^] indicates that the listening port be |
| bound for local use only, while an empty address or M-bM-^@M-^X*M-bM-^@M-^Y indicates |
| that the port should be available from all interfaces. |
| |
| -E log_file |
| Append debug logs to log_file instead of standard error. |
| |
| -e escape_char |
| Sets the escape character for sessions with a pty (default: M-bM-^@M-^X~M-bM-^@M-^Y). |
| The escape character is only recognized at the beginning of a |
| line. The escape character followed by a dot (M-bM-^@M-^X.M-bM-^@M-^Y) closes the |
| connection; followed by control-Z suspends the connection; and |
| followed by itself sends the escape character once. Setting the |
| character to M-bM-^@M-^\noneM-bM-^@M-^] disables any escapes and makes the session |
| fully transparent. |
| |
| -F configfile |
| Specifies an alternative per-user configuration file. If a |
| configuration file is given on the command line, the system-wide |
| configuration file (/etc/ssh/ssh_config) will be ignored. The |
| default for the per-user configuration file is ~/.ssh/config. |
| |
| -f Requests ssh to go to background just before command execution. |
| This is useful if ssh is going to ask for passwords or |
| passphrases, but the user wants it in the background. This |
| implies -n. The recommended way to start X11 programs at a |
| remote site is with something like ssh -f host xterm. |
| |
| If the ExitOnForwardFailure configuration option is set to M-bM-^@M-^\yesM-bM-^@M-^], |
| then a client started with -f will wait for all remote port |
| forwards to be successfully established before placing itself in |
| the background. |
| |
| -G Causes ssh to print its configuration after evaluating Host and |
| Match blocks and exit. |
| |
| -g Allows remote hosts to connect to local forwarded ports. If used |
| on a multiplexed connection, then this option must be specified |
| on the master process. |
| |
| -I pkcs11 |
| Specify the PKCS#11 shared library ssh should use to communicate |
| with a PKCS#11 token providing the user's private RSA key. |
| |
| -i identity_file |
| Selects a file from which the identity (private key) for public |
| key authentication is read. The default is ~/.ssh/identity for |
| protocol version 1, and ~/.ssh/id_dsa, ~/.ssh/id_ecdsa, |
| ~/.ssh/id_ed25519 and ~/.ssh/id_rsa for protocol version 2. |
| Identity files may also be specified on a per-host basis in the |
| configuration file. It is possible to have multiple -i options |
| (and multiple identities specified in configuration files). ssh |
| will also try to load certificate information from the filename |
| obtained by appending -cert.pub to identity filenames. |
| |
| -K Enables GSSAPI-based authentication and forwarding (delegation) |
| of GSSAPI credentials to the server. |
| |
| -k Disables forwarding (delegation) of GSSAPI credentials to the |
| server. |
| |
| -L [bind_address:]port:host:hostport |
| Specifies that the given port on the local (client) host is to be |
| forwarded to the given host and port on the remote side. This |
| works by allocating a socket to listen to port on the local side, |
| optionally bound to the specified bind_address. Whenever a |
| connection is made to this port, the connection is forwarded over |
| the secure channel, and a connection is made to host port |
| hostport from the remote machine. Port forwardings can also be |
| specified in the configuration file. IPv6 addresses can be |
| specified by enclosing the address in square brackets. Only the |
| superuser can forward privileged ports. By default, the local |
| port is bound in accordance with the GatewayPorts setting. |
| However, an explicit bind_address may be used to bind the |
| connection to a specific address. The bind_address of |
| M-bM-^@M-^\localhostM-bM-^@M-^] indicates that the listening port be bound for local |
| use only, while an empty address or M-bM-^@M-^X*M-bM-^@M-^Y indicates that the port |
| should be available from all interfaces. |
| |
| -l login_name |
| Specifies the user to log in as on the remote machine. This also |
| may be specified on a per-host basis in the configuration file. |
| |
| -M Places the ssh client into M-bM-^@M-^\masterM-bM-^@M-^] mode for connection sharing. |
| Multiple -M options places ssh into M-bM-^@M-^\masterM-bM-^@M-^] mode with |
| confirmation required before slave connections are accepted. |
| Refer to the description of ControlMaster in ssh_config(5) for |
| details. |
| |
| -m mac_spec |
| Additionally, for protocol version 2 a comma-separated list of |
| MAC (message authentication code) algorithms can be specified in |
| order of preference. See the MACs keyword for more information. |
| |
| -N Do not execute a remote command. This is useful for just |
| forwarding ports (protocol version 2 only). |
| |
| -n Redirects stdin from /dev/null (actually, prevents reading from |
| stdin). This must be used when ssh is run in the background. A |
| common trick is to use this to run X11 programs on a remote |
| machine. For example, ssh -n shadows.cs.hut.fi emacs & will |
| start an emacs on shadows.cs.hut.fi, and the X11 connection will |
| be automatically forwarded over an encrypted channel. The ssh |
| program will be put in the background. (This does not work if |
| ssh needs to ask for a password or passphrase; see also the -f |
| option.) |
| |
| -O ctl_cmd |
| Control an active connection multiplexing master process. When |
| the -O option is specified, the ctl_cmd argument is interpreted |
| and passed to the master process. Valid commands are: M-bM-^@M-^\checkM-bM-^@M-^] |
| (check that the master process is running), M-bM-^@M-^\forwardM-bM-^@M-^] (request |
| forwardings without command execution), M-bM-^@M-^\cancelM-bM-^@M-^] (cancel |
| forwardings), M-bM-^@M-^\exitM-bM-^@M-^] (request the master to exit), and M-bM-^@M-^\stopM-bM-^@M-^] |
| (request the master to stop accepting further multiplexing |
| requests). |
| |
| -o option |
| Can be used to give options in the format used in the |
| configuration file. This is useful for specifying options for |
| which there is no separate command-line flag. For full details |
| of the options listed below, and their possible values, see |
| ssh_config(5). |
| |
| AddressFamily |
| BatchMode |
| BindAddress |
| CanonicalDomains |
| CanonicalizeFallbackLocal |
| CanonicalizeHostname |
| CanonicalizeMaxDots |
| CanonicalizePermittedCNAMEs |
| ChallengeResponseAuthentication |
| CheckHostIP |
| Cipher |
| Ciphers |
| ClearAllForwardings |
| Compression |
| CompressionLevel |
| ConnectionAttempts |
| ConnectTimeout |
| ControlMaster |
| ControlPath |
| ControlPersist |
| DynamicForward |
| EscapeChar |
| ExitOnForwardFailure |
| FingerprintHash |
| ForwardAgent |
| ForwardX11 |
| ForwardX11Timeout |
| ForwardX11Trusted |
| GatewayPorts |
| GlobalKnownHostsFile |
| GSSAPIAuthentication |
| GSSAPIDelegateCredentials |
| HashKnownHosts |
| Host |
| HostbasedAuthentication |
| HostbasedKeyTypes |
| HostKeyAlgorithms |
| HostKeyAlias |
| HostName |
| IdentityFile |
| IdentitiesOnly |
| IPQoS |
| KbdInteractiveAuthentication |
| KbdInteractiveDevices |
| KexAlgorithms |
| LocalCommand |
| LocalForward |
| LogLevel |
| MACs |
| Match |
| NoHostAuthenticationForLocalhost |
| NumberOfPasswordPrompts |
| PasswordAuthentication |
| PermitLocalCommand |
| PKCS11Provider |
| Port |
| PreferredAuthentications |
| Protocol |
| ProxyCommand |
| ProxyUseFdpass |
| PubkeyAuthentication |
| RekeyLimit |
| RemoteForward |
| RequestTTY |
| RhostsRSAAuthentication |
| RSAAuthentication |
| SendEnv |
| ServerAliveInterval |
| ServerAliveCountMax |
| StreamLocalBindMask |
| StreamLocalBindUnlink |
| StrictHostKeyChecking |
| TCPKeepAlive |
| Tunnel |
| TunnelDevice |
| UpdateHostKeys |
| UsePrivilegedPort |
| User |
| UserKnownHostsFile |
| VerifyHostKeyDNS |
| VisualHostKey |
| XAuthLocation |
| |
| -p port |
| Port to connect to on the remote host. This can be specified on |
| a per-host basis in the configuration file. |
| |
| -Q cipher | cipher-auth | mac | kex | key | protocol-version |
| Queries ssh for the algorithms supported for the specified |
| version 2. The available features are: cipher (supported |
| symmetric ciphers), cipher-auth (supported symmetric ciphers that |
| support authenticated encryption), mac (supported message |
| integrity codes), kex (key exchange algorithms), key (key types) |
| and protocol-version (supported SSH protocol versions). |
| |
| -q Quiet mode. Causes most warning and diagnostic messages to be |
| suppressed. |
| |
| -R [bind_address:]port:host:hostport |
| Specifies that the given port on the remote (server) host is to |
| be forwarded to the given host and port on the local side. This |
| works by allocating a socket to listen to port on the remote |
| side, and whenever a connection is made to this port, the |
| connection is forwarded over the secure channel, and a connection |
| is made to host port hostport from the local machine. |
| |
| Port forwardings can also be specified in the configuration file. |
| Privileged ports can be forwarded only when logging in as root on |
| the remote machine. IPv6 addresses can be specified by enclosing |
| the address in square brackets. |
| |
| By default, the listening socket on the server will be bound to |
| the loopback interface only. This may be overridden by |
| specifying a bind_address. An empty bind_address, or the address |
| M-bM-^@M-^X*M-bM-^@M-^Y, indicates that the remote socket should listen on all |
| interfaces. Specifying a remote bind_address will only succeed |
| if the server's GatewayPorts option is enabled (see |
| sshd_config(5)). |
| |
| If the port argument is M-bM-^@M-^X0M-bM-^@M-^Y, the listen port will be dynamically |
| allocated on the server and reported to the client at run time. |
| When used together with -O forward the allocated port will be |
| printed to the standard output. |
| |
| -S ctl_path |
| Specifies the location of a control socket for connection |
| sharing, or the string M-bM-^@M-^\noneM-bM-^@M-^] to disable connection sharing. |
| Refer to the description of ControlPath and ControlMaster in |
| ssh_config(5) for details. |
| |
| -s May be used to request invocation of a subsystem on the remote |
| system. Subsystems are a feature of the SSH2 protocol which |
| facilitate the use of SSH as a secure transport for other |
| applications (eg. sftp(1)). The subsystem is specified as the |
| remote command. |
| |
| -T Disable pseudo-tty allocation. |
| |
| -t Force pseudo-tty allocation. This can be used to execute |
| arbitrary screen-based programs on a remote machine, which can be |
| very useful, e.g. when implementing menu services. Multiple -t |
| options force tty allocation, even if ssh has no local tty. |
| |
| -V Display the version number and exit. |
| |
| -v Verbose mode. Causes ssh to print debugging messages about its |
| progress. This is helpful in debugging connection, |
| authentication, and configuration problems. Multiple -v options |
| increase the verbosity. The maximum is 3. |
| |
| -W host:port |
| Requests that standard input and output on the client be |
| forwarded to host on port over the secure channel. Implies -N, |
| -T, ExitOnForwardFailure and ClearAllForwardings. Works with |
| Protocol version 2 only. |
| |
| -w local_tun[:remote_tun] |
| Requests tunnel device forwarding with the specified tun(4) |
| devices between the client (local_tun) and the server |
| (remote_tun). |
| |
| The devices may be specified by numerical ID or the keyword |
| M-bM-^@M-^\anyM-bM-^@M-^], which uses the next available tunnel device. If |
| remote_tun is not specified, it defaults to M-bM-^@M-^\anyM-bM-^@M-^]. See also the |
| Tunnel and TunnelDevice directives in ssh_config(5). If the |
| Tunnel directive is unset, it is set to the default tunnel mode, |
| which is M-bM-^@M-^\point-to-pointM-bM-^@M-^]. |
| |
| -X Enables X11 forwarding. This can also be specified on a per-host |
| basis in a configuration file. |
| |
| X11 forwarding should be enabled with caution. Users with the |
| ability to bypass file permissions on the remote host (for the |
| user's X authorization database) can access the local X11 display |
| through the forwarded connection. An attacker may then be able |
| to perform activities such as keystroke monitoring. |
| |
| For this reason, X11 forwarding is subjected to X11 SECURITY |
| extension restrictions by default. Please refer to the ssh -Y |
| option and the ForwardX11Trusted directive in ssh_config(5) for |
| more information. |
| |
| -x Disables X11 forwarding. |
| |
| -Y Enables trusted X11 forwarding. Trusted X11 forwardings are not |
| subjected to the X11 SECURITY extension controls. |
| |
| -y Send log information using the syslog(3) system module. By |
| default this information is sent to stderr. |
| |
| ssh may additionally obtain configuration data from a per-user |
| configuration file and a system-wide configuration file. The file format |
| and configuration options are described in ssh_config(5). |
| |
| AUTHENTICATION |
| The OpenSSH SSH client supports SSH protocols 1 and 2. The default is to |
| use protocol 2 only, though this can be changed via the Protocol option |
| in ssh_config(5) or the -1 and -2 options (see above). Both protocols |
| support similar authentication methods, but protocol 2 is the default |
| since it provides additional mechanisms for confidentiality (the traffic |
| is encrypted using AES, 3DES, Blowfish, CAST128, or Arcfour) and |
| integrity (hmac-md5, hmac-sha1, hmac-sha2-256, hmac-sha2-512, umac-64, |
| umac-128, hmac-ripemd160). Protocol 1 lacks a strong mechanism for |
| ensuring the integrity of the connection. |
| |
| The methods available for authentication are: GSSAPI-based |
| authentication, host-based authentication, public key authentication, |
| challenge-response authentication, and password authentication. |
| Authentication methods are tried in the order specified above, though |
| protocol 2 has a configuration option to change the default order: |
| PreferredAuthentications. |
| |
| Host-based authentication works as follows: If the machine the user logs |
| in from is listed in /etc/hosts.equiv or /etc/shosts.equiv on the remote |
| machine, and the user names are the same on both sides, or if the files |
| ~/.rhosts or ~/.shosts exist in the user's home directory on the remote |
| machine and contain a line containing the name of the client machine and |
| the name of the user on that machine, the user is considered for login. |
| Additionally, the server must be able to verify the client's host key |
| (see the description of /etc/ssh/ssh_known_hosts and ~/.ssh/known_hosts, |
| below) for login to be permitted. This authentication method closes |
| security holes due to IP spoofing, DNS spoofing, and routing spoofing. |
| [Note to the administrator: /etc/hosts.equiv, ~/.rhosts, and the |
| rlogin/rsh protocol in general, are inherently insecure and should be |
| disabled if security is desired.] |
| |
| Public key authentication works as follows: The scheme is based on |
| public-key cryptography, using cryptosystems where encryption and |
| decryption are done using separate keys, and it is unfeasible to derive |
| the decryption key from the encryption key. The idea is that each user |
| creates a public/private key pair for authentication purposes. The |
| server knows the public key, and only the user knows the private key. |
| ssh implements public key authentication protocol automatically, using |
| one of the DSA, ECDSA, Ed25519 or RSA algorithms. Protocol 1 is |
| restricted to using only RSA keys, but protocol 2 may use any. The |
| HISTORY section of ssl(8) contains a brief discussion of the DSA and RSA |
| algorithms. |
| |
| The file ~/.ssh/authorized_keys lists the public keys that are permitted |
| for logging in. When the user logs in, the ssh program tells the server |
| which key pair it would like to use for authentication. The client |
| proves that it has access to the private key and the server checks that |
| the corresponding public key is authorized to accept the account. |
| |
| The user creates his/her key pair by running ssh-keygen(1). This stores |
| the private key in ~/.ssh/identity (protocol 1), ~/.ssh/id_dsa (protocol |
| 2 DSA), ~/.ssh/id_ecdsa (protocol 2 ECDSA), ~/.ssh/id_ed25519 (protocol 2 |
| Ed25519), or ~/.ssh/id_rsa (protocol 2 RSA) and stores the public key in |
| ~/.ssh/identity.pub (protocol 1), ~/.ssh/id_dsa.pub (protocol 2 DSA), |
| ~/.ssh/id_ecdsa.pub (protocol 2 ECDSA), ~/.ssh/id_ed25519.pub (protocol 2 |
| Ed25519), or ~/.ssh/id_rsa.pub (protocol 2 RSA) in the user's home |
| directory. The user should then copy the public key to |
| ~/.ssh/authorized_keys in his/her home directory on the remote machine. |
| The authorized_keys file corresponds to the conventional ~/.rhosts file, |
| and has one key per line, though the lines can be very long. After this, |
| the user can log in without giving the password. |
| |
| A variation on public key authentication is available in the form of |
| certificate authentication: instead of a set of public/private keys, |
| signed certificates are used. This has the advantage that a single |
| trusted certification authority can be used in place of many |
| public/private keys. See the CERTIFICATES section of ssh-keygen(1) for |
| more information. |
| |
| The most convenient way to use public key or certificate authentication |
| may be with an authentication agent. See ssh-agent(1) for more |
| information. |
| |
| Challenge-response authentication works as follows: The server sends an |
| arbitrary "challenge" text, and prompts for a response. Protocol 2 |
| allows multiple challenges and responses; protocol 1 is restricted to |
| just one challenge/response. Examples of challenge-response |
| authentication include BSD Authentication (see login.conf(5)) and PAM |
| (some non-OpenBSD systems). |
| |
| Finally, if other authentication methods fail, ssh prompts the user for a |
| password. The password is sent to the remote host for checking; however, |
| since all communications are encrypted, the password cannot be seen by |
| someone listening on the network. |
| |
| ssh automatically maintains and checks a database containing |
| identification for all hosts it has ever been used with. Host keys are |
| stored in ~/.ssh/known_hosts in the user's home directory. Additionally, |
| the file /etc/ssh/ssh_known_hosts is automatically checked for known |
| hosts. Any new hosts are automatically added to the user's file. If a |
| host's identification ever changes, ssh warns about this and disables |
| password authentication to prevent server spoofing or man-in-the-middle |
| attacks, which could otherwise be used to circumvent the encryption. The |
| StrictHostKeyChecking option can be used to control logins to machines |
| whose host key is not known or has changed. |
| |
| When the user's identity has been accepted by the server, the server |
| either executes the given command, or logs into the machine and gives the |
| user a normal shell on the remote machine. All communication with the |
| remote command or shell will be automatically encrypted. |
| |
| If a pseudo-terminal has been allocated (normal login session), the user |
| may use the escape characters noted below. |
| |
| If no pseudo-tty has been allocated, the session is transparent and can |
| be used to reliably transfer binary data. On most systems, setting the |
| escape character to M-bM-^@M-^\noneM-bM-^@M-^] will also make the session transparent even if |
| a tty is used. |
| |
| The session terminates when the command or shell on the remote machine |
| exits and all X11 and TCP connections have been closed. |
| |
| ESCAPE CHARACTERS |
| When a pseudo-terminal has been requested, ssh supports a number of |
| functions through the use of an escape character. |
| |
| A single tilde character can be sent as ~~ or by following the tilde by a |
| character other than those described below. The escape character must |
| always follow a newline to be interpreted as special. The escape |
| character can be changed in configuration files using the EscapeChar |
| configuration directive or on the command line by the -e option. |
| |
| The supported escapes (assuming the default M-bM-^@M-^X~M-bM-^@M-^Y) are: |
| |
| ~. Disconnect. |
| |
| ~^Z Background ssh. |
| |
| ~# List forwarded connections. |
| |
| ~& Background ssh at logout when waiting for forwarded connection / |
| X11 sessions to terminate. |
| |
| ~? Display a list of escape characters. |
| |
| ~B Send a BREAK to the remote system (only useful for SSH protocol |
| version 2 and if the peer supports it). |
| |
| ~C Open command line. Currently this allows the addition of port |
| forwardings using the -L, -R and -D options (see above). It also |
| allows the cancellation of existing port-forwardings with |
| -KL[bind_address:]port for local, -KR[bind_address:]port for |
| remote and -KD[bind_address:]port for dynamic port-forwardings. |
| !command allows the user to execute a local command if the |
| PermitLocalCommand option is enabled in ssh_config(5). Basic |
| help is available, using the -h option. |
| |
| ~R Request rekeying of the connection (only useful for SSH protocol |
| version 2 and if the peer supports it). |
| |
| ~V Decrease the verbosity (LogLevel) when errors are being written |
| to stderr. |
| |
| ~v Increase the verbosity (LogLevel) when errors are being written |
| to stderr. |
| |
| TCP FORWARDING |
| Forwarding of arbitrary TCP connections over the secure channel can be |
| specified either on the command line or in a configuration file. One |
| possible application of TCP forwarding is a secure connection to a mail |
| server; another is going through firewalls. |
| |
| In the example below, we look at encrypting communication between an IRC |
| client and server, even though the IRC server does not directly support |
| encrypted communications. This works as follows: the user connects to |
| the remote host using ssh, specifying a port to be used to forward |
| connections to the remote server. After that it is possible to start the |
| service which is to be encrypted on the client machine, connecting to the |
| same local port, and ssh will encrypt and forward the connection. |
| |
| The following example tunnels an IRC session from client machine |
| M-bM-^@M-^\127.0.0.1M-bM-^@M-^] (localhost) to remote server M-bM-^@M-^\server.example.comM-bM-^@M-^]: |
| |
| $ ssh -f -L 1234:localhost:6667 server.example.com sleep 10 |
| $ irc -c '#users' -p 1234 pinky 127.0.0.1 |
| |
| This tunnels a connection to IRC server M-bM-^@M-^\server.example.comM-bM-^@M-^], joining |
| channel M-bM-^@M-^\#usersM-bM-^@M-^], nickname M-bM-^@M-^\pinkyM-bM-^@M-^], using port 1234. It doesn't matter |
| which port is used, as long as it's greater than 1023 (remember, only |
| root can open sockets on privileged ports) and doesn't conflict with any |
| ports already in use. The connection is forwarded to port 6667 on the |
| remote server, since that's the standard port for IRC services. |
| |
| The -f option backgrounds ssh and the remote command M-bM-^@M-^\sleep 10M-bM-^@M-^] is |
| specified to allow an amount of time (10 seconds, in the example) to |
| start the service which is to be tunnelled. If no connections are made |
| within the time specified, ssh will exit. |
| |
| X11 FORWARDING |
| If the ForwardX11 variable is set to M-bM-^@M-^\yesM-bM-^@M-^] (or see the description of the |
| -X, -x, and -Y options above) and the user is using X11 (the DISPLAY |
| environment variable is set), the connection to the X11 display is |
| automatically forwarded to the remote side in such a way that any X11 |
| programs started from the shell (or command) will go through the |
| encrypted channel, and the connection to the real X server will be made |
| from the local machine. The user should not manually set DISPLAY. |
| Forwarding of X11 connections can be configured on the command line or in |
| configuration files. |
| |
| The DISPLAY value set by ssh will point to the server machine, but with a |
| display number greater than zero. This is normal, and happens because |
| ssh creates a M-bM-^@M-^\proxyM-bM-^@M-^] X server on the server machine for forwarding the |
| connections over the encrypted channel. |
| |
| ssh will also automatically set up Xauthority data on the server machine. |
| For this purpose, it will generate a random authorization cookie, store |
| it in Xauthority on the server, and verify that any forwarded connections |
| carry this cookie and replace it by the real cookie when the connection |
| is opened. The real authentication cookie is never sent to the server |
| machine (and no cookies are sent in the plain). |
| |
| If the ForwardAgent variable is set to M-bM-^@M-^\yesM-bM-^@M-^] (or see the description of |
| the -A and -a options above) and the user is using an authentication |
| agent, the connection to the agent is automatically forwarded to the |
| remote side. |
| |
| VERIFYING HOST KEYS |
| When connecting to a server for the first time, a fingerprint of the |
| server's public key is presented to the user (unless the option |
| StrictHostKeyChecking has been disabled). Fingerprints can be determined |
| using ssh-keygen(1): |
| |
| $ ssh-keygen -l -f /etc/ssh/ssh_host_rsa_key |
| |
| If the fingerprint is already known, it can be matched and the key can be |
| accepted or rejected. Because of the difficulty of comparing host keys |
| just by looking at fingerprint strings, there is also support to compare |
| host keys visually, using random art. By setting the VisualHostKey |
| option to M-bM-^@M-^\yesM-bM-^@M-^], a small ASCII graphic gets displayed on every login to a |
| server, no matter if the session itself is interactive or not. By |
| learning the pattern a known server produces, a user can easily find out |
| that the host key has changed when a completely different pattern is |
| displayed. Because these patterns are not unambiguous however, a pattern |
| that looks similar to the pattern remembered only gives a good |
| probability that the host key is the same, not guaranteed proof. |
| |
| To get a listing of the fingerprints along with their random art for all |
| known hosts, the following command line can be used: |
| |
| $ ssh-keygen -lv -f ~/.ssh/known_hosts |
| |
| If the fingerprint is unknown, an alternative method of verification is |
| available: SSH fingerprints verified by DNS. An additional resource |
| record (RR), SSHFP, is added to a zonefile and the connecting client is |
| able to match the fingerprint with that of the key presented. |
| |
| In this example, we are connecting a client to a server, |
| M-bM-^@M-^\host.example.comM-bM-^@M-^]. The SSHFP resource records should first be added to |
| the zonefile for host.example.com: |
| |
| $ ssh-keygen -r host.example.com. |
| |
| The output lines will have to be added to the zonefile. To check that |
| the zone is answering fingerprint queries: |
| |
| $ dig -t SSHFP host.example.com |
| |
| Finally the client connects: |
| |
| $ ssh -o "VerifyHostKeyDNS ask" host.example.com |
| [...] |
| Matching host key fingerprint found in DNS. |
| Are you sure you want to continue connecting (yes/no)? |
| |
| See the VerifyHostKeyDNS option in ssh_config(5) for more information. |
| |
| SSH-BASED VIRTUAL PRIVATE NETWORKS |
| ssh contains support for Virtual Private Network (VPN) tunnelling using |
| the tun(4) network pseudo-device, allowing two networks to be joined |
| securely. The sshd_config(5) configuration option PermitTunnel controls |
| whether the server supports this, and at what level (layer 2 or 3 |
| traffic). |
| |
| The following example would connect client network 10.0.50.0/24 with |
| remote network 10.0.99.0/24 using a point-to-point connection from |
| 10.1.1.1 to 10.1.1.2, provided that the SSH server running on the gateway |
| to the remote network, at 192.168.1.15, allows it. |
| |
| On the client: |
| |
| # ssh -f -w 0:1 192.168.1.15 true |
| # ifconfig tun0 10.1.1.1 10.1.1.2 netmask 255.255.255.252 |
| # route add 10.0.99.0/24 10.1.1.2 |
| |
| On the server: |
| |
| # ifconfig tun1 10.1.1.2 10.1.1.1 netmask 255.255.255.252 |
| # route add 10.0.50.0/24 10.1.1.1 |
| |
| Client access may be more finely tuned via the /root/.ssh/authorized_keys |
| file (see below) and the PermitRootLogin server option. The following |
| entry would permit connections on tun(4) device 1 from user M-bM-^@M-^\janeM-bM-^@M-^] and on |
| tun device 2 from user M-bM-^@M-^\johnM-bM-^@M-^], if PermitRootLogin is set to |
| M-bM-^@M-^\forced-commands-onlyM-bM-^@M-^]: |
| |
| tunnel="1",command="sh /etc/netstart tun1" ssh-rsa ... jane |
| tunnel="2",command="sh /etc/netstart tun2" ssh-rsa ... john |
| |
| Since an SSH-based setup entails a fair amount of overhead, it may be |
| more suited to temporary setups, such as for wireless VPNs. More |
| permanent VPNs are better provided by tools such as ipsecctl(8) and |
| isakmpd(8). |
| |
| ENVIRONMENT |
| ssh will normally set the following environment variables: |
| |
| DISPLAY The DISPLAY variable indicates the location of the |
| X11 server. It is automatically set by ssh to |
| point to a value of the form M-bM-^@M-^\hostname:nM-bM-^@M-^], where |
| M-bM-^@M-^\hostnameM-bM-^@M-^] indicates the host where the shell runs, |
| and M-bM-^@M-^XnM-bM-^@M-^Y is an integer M-bM-^IM-% 1. ssh uses this special |
| value to forward X11 connections over the secure |
| channel. The user should normally not set DISPLAY |
| explicitly, as that will render the X11 connection |
| insecure (and will require the user to manually |
| copy any required authorization cookies). |
| |
| HOME Set to the path of the user's home directory. |
| |
| LOGNAME Synonym for USER; set for compatibility with |
| systems that use this variable. |
| |
| MAIL Set to the path of the user's mailbox. |
| |
| PATH Set to the default PATH, as specified when |
| compiling ssh. |
| |
| SSH_ASKPASS If ssh needs a passphrase, it will read the |
| passphrase from the current terminal if it was run |
| from a terminal. If ssh does not have a terminal |
| associated with it but DISPLAY and SSH_ASKPASS are |
| set, it will execute the program specified by |
| SSH_ASKPASS and open an X11 window to read the |
| passphrase. This is particularly useful when |
| calling ssh from a .xsession or related script. |
| (Note that on some machines it may be necessary to |
| redirect the input from /dev/null to make this |
| work.) |
| |
| SSH_AUTH_SOCK Identifies the path of a UNIX-domain socket used to |
| communicate with the agent. |
| |
| SSH_CONNECTION Identifies the client and server ends of the |
| connection. The variable contains four space- |
| separated values: client IP address, client port |
| number, server IP address, and server port number. |
| |
| SSH_ORIGINAL_COMMAND This variable contains the original command line if |
| a forced command is executed. It can be used to |
| extract the original arguments. |
| |
| SSH_TTY This is set to the name of the tty (path to the |
| device) associated with the current shell or |
| command. If the current session has no tty, this |
| variable is not set. |
| |
| TZ This variable is set to indicate the present time |
| zone if it was set when the daemon was started |
| (i.e. the daemon passes the value on to new |
| connections). |
| |
| USER Set to the name of the user logging in. |
| |
| Additionally, ssh reads ~/.ssh/environment, and adds lines of the format |
| M-bM-^@M-^\VARNAME=valueM-bM-^@M-^] to the environment if the file exists and users are |
| allowed to change their environment. For more information, see the |
| PermitUserEnvironment option in sshd_config(5). |
| |
| FILES |
| ~/.rhosts |
| This file is used for host-based authentication (see above). On |
| some machines this file may need to be world-readable if the |
| user's home directory is on an NFS partition, because sshd(8) |
| reads it as root. Additionally, this file must be owned by the |
| user, and must not have write permissions for anyone else. The |
| recommended permission for most machines is read/write for the |
| user, and not accessible by others. |
| |
| ~/.shosts |
| This file is used in exactly the same way as .rhosts, but allows |
| host-based authentication without permitting login with |
| rlogin/rsh. |
| |
| ~/.ssh/ |
| This directory is the default location for all user-specific |
| configuration and authentication information. There is no |
| general requirement to keep the entire contents of this directory |
| secret, but the recommended permissions are read/write/execute |
| for the user, and not accessible by others. |
| |
| ~/.ssh/authorized_keys |
| Lists the public keys (DSA, ECDSA, Ed25519, RSA) that can be used |
| for logging in as this user. The format of this file is |
| described in the sshd(8) manual page. This file is not highly |
| sensitive, but the recommended permissions are read/write for the |
| user, and not accessible by others. |
| |
| ~/.ssh/config |
| This is the per-user configuration file. The file format and |
| configuration options are described in ssh_config(5). Because of |
| the potential for abuse, this file must have strict permissions: |
| read/write for the user, and not writable by others. |
| |
| ~/.ssh/environment |
| Contains additional definitions for environment variables; see |
| ENVIRONMENT, above. |
| |
| ~/.ssh/identity |
| ~/.ssh/id_dsa |
| ~/.ssh/id_ecdsa |
| ~/.ssh/id_ed25519 |
| ~/.ssh/id_rsa |
| Contains the private key for authentication. These files contain |
| sensitive data and should be readable by the user but not |
| accessible by others (read/write/execute). ssh will simply |
| ignore a private key file if it is accessible by others. It is |
| possible to specify a passphrase when generating the key which |
| will be used to encrypt the sensitive part of this file using |
| 3DES. |
| |
| ~/.ssh/identity.pub |
| ~/.ssh/id_dsa.pub |
| ~/.ssh/id_ecdsa.pub |
| ~/.ssh/id_ed25519.pub |
| ~/.ssh/id_rsa.pub |
| Contains the public key for authentication. These files are not |
| sensitive and can (but need not) be readable by anyone. |
| |
| ~/.ssh/known_hosts |
| Contains a list of host keys for all hosts the user has logged |
| into that are not already in the systemwide list of known host |
| keys. See sshd(8) for further details of the format of this |
| file. |
| |
| ~/.ssh/rc |
| Commands in this file are executed by ssh when the user logs in, |
| just before the user's shell (or command) is started. See the |
| sshd(8) manual page for more information. |
| |
| /etc/hosts.equiv |
| This file is for host-based authentication (see above). It |
| should only be writable by root. |
| |
| /etc/shosts.equiv |
| This file is used in exactly the same way as hosts.equiv, but |
| allows host-based authentication without permitting login with |
| rlogin/rsh. |
| |
| /etc/ssh/ssh_config |
| Systemwide configuration file. The file format and configuration |
| options are described in ssh_config(5). |
| |
| /etc/ssh/ssh_host_key |
| /etc/ssh/ssh_host_dsa_key |
| /etc/ssh/ssh_host_ecdsa_key |
| /etc/ssh/ssh_host_ed25519_key |
| /etc/ssh/ssh_host_rsa_key |
| These files contain the private parts of the host keys and are |
| used for host-based authentication. If protocol version 1 is |
| used, ssh must be setuid root, since the host key is readable |
| only by root. For protocol version 2, ssh uses ssh-keysign(8) to |
| access the host keys, eliminating the requirement that ssh be |
| setuid root when host-based authentication is used. By default |
| ssh is not setuid root. |
| |
| /etc/ssh/ssh_known_hosts |
| Systemwide list of known host keys. This file should be prepared |
| by the system administrator to contain the public host keys of |
| all machines in the organization. It should be world-readable. |
| See sshd(8) for further details of the format of this file. |
| |
| /etc/ssh/sshrc |
| Commands in this file are executed by ssh when the user logs in, |
| just before the user's shell (or command) is started. See the |
| sshd(8) manual page for more information. |
| |
| EXIT STATUS |
| ssh exits with the exit status of the remote command or with 255 if an |
| error occurred. |
| |
| SEE ALSO |
| scp(1), sftp(1), ssh-add(1), ssh-agent(1), ssh-keygen(1), ssh-keyscan(1), |
| tun(4), ssh_config(5), ssh-keysign(8), sshd(8) |
| |
| STANDARDS |
| S. Lehtinen and C. Lonvick, The Secure Shell (SSH) Protocol Assigned |
| Numbers, RFC 4250, January 2006. |
| |
| T. Ylonen and C. Lonvick, The Secure Shell (SSH) Protocol Architecture, |
| RFC 4251, January 2006. |
| |
| T. Ylonen and C. Lonvick, The Secure Shell (SSH) Authentication Protocol, |
| RFC 4252, January 2006. |
| |
| T. Ylonen and C. Lonvick, The Secure Shell (SSH) Transport Layer |
| Protocol, RFC 4253, January 2006. |
| |
| T. Ylonen and C. Lonvick, The Secure Shell (SSH) Connection Protocol, RFC |
| 4254, January 2006. |
| |
| J. Schlyter and W. Griffin, Using DNS to Securely Publish Secure Shell |
| (SSH) Key Fingerprints, RFC 4255, January 2006. |
| |
| F. Cusack and M. Forssen, Generic Message Exchange Authentication for the |
| Secure Shell Protocol (SSH), RFC 4256, January 2006. |
| |
| J. Galbraith and P. Remaker, The Secure Shell (SSH) Session Channel Break |
| Extension, RFC 4335, January 2006. |
| |
| M. Bellare, T. Kohno, and C. Namprempre, The Secure Shell (SSH) Transport |
| Layer Encryption Modes, RFC 4344, January 2006. |
| |
| B. Harris, Improved Arcfour Modes for the Secure Shell (SSH) Transport |
| Layer Protocol, RFC 4345, January 2006. |
| |
| M. Friedl, N. Provos, and W. Simpson, Diffie-Hellman Group Exchange for |
| the Secure Shell (SSH) Transport Layer Protocol, RFC 4419, March 2006. |
| |
| J. Galbraith and R. Thayer, The Secure Shell (SSH) Public Key File |
| Format, RFC 4716, November 2006. |
| |
| D. Stebila and J. Green, Elliptic Curve Algorithm Integration in the |
| Secure Shell Transport Layer, RFC 5656, December 2009. |
| |
| A. Perrig and D. Song, Hash Visualization: a New Technique to improve |
| Real-World Security, 1999, International Workshop on Cryptographic |
| Techniques and E-Commerce (CrypTEC '99). |
| |
| AUTHORS |
| OpenSSH is a derivative of the original and free ssh 1.2.12 release by |
| Tatu Ylonen. Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos, Theo |
| de Raadt and Dug Song removed many bugs, re-added newer features and |
| created OpenSSH. Markus Friedl contributed the support for SSH protocol |
| versions 1.5 and 2.0. |
| |
| OpenBSD 5.7 March 3, 2015 OpenBSD 5.7 |