# insecure Host insecure insecure.example.com HostName insecure.example.com # bastion Host bastion bastion.example.com HostName bastion.example.com ForwardAgent yes ControlMaster auto # production Host prod production prod*.example.com HostName production.example.com ForwardAgent yes ProxyCommand ssh -q bastion nc -w30 %h %p # global defaults Host * ControlPath ~/.ssh/master-%r@%h:%p ServerAliveCountMax 18 ServerAliveInterval 5 TCPKeepAlive no User arthur
This section is for a server on the Internet that we think is insecure (we do not trust the administrators--those with root access).
# insecure Host insecure insecure.example.com HostName insecure.example.com
# insecure
is a comment. It helps provide context for for the line that follows it.Host insecure insecure.example.com
indicates the host patterns that the subsequent parameters apply to. All of the following will work to connect to the configured HostName:ssh insecure
ssh insecure.example.com
HostName insecure.example.com
specifies the real host name to log into.
Additionally, the following defaults are important. The parameter is not in this section because the default value is appropriate. It should be acknowledged so that it is not unintentionally superseded by a configured parameter:
ForwardAgent no
specifies that the authentication agent will not be forwarded. This prevents administrators on untrusted remote servers from masquerading as you on any system on which you have your SSH public key. See SSH Agent Hijacking for more information.
This section is for a server on the Internet that acts as a SSH bastion. It provides access to servers behind a firewall.
# bastion Host bastion bastion.example.com HostName bastion.example.com ControlMaster auto ControlPath ~/.ssh/master-%r@%h:%p
# bastion
is a comment. It helps provide context for for the line that follows it.Host bastion bastion.example.com
indicates the host patterns that the subsequent paramters apply to. All of the following will work to connect to the configured HostName:ssh bastion
ssh bastion.example.com
HostName bastion.example.com
specifies the real host name to log into.ForwardAgent yes
specifies that the authentication agent will be forwarded to the remote server.- This is important for the bastion server as it allows public key sessions from the bastion to other servers (especially those behind the firewall). This means you will be able to connect to those servers without a password.
ControlMaster auto
indicates SSH should listen for connections on a control socket. Additional sessions can connect to this socket and reuse the master instances (bastion's) network connection rather than initiating a new one.
This section is for a server on the Internet that acts as a SSH production. It provides access to servers behind a firewall.
# production Host prod production prod*.example.com HostName production.example.com ForwardAgent yes ProxyCommand ssh -q bastion nc -w30 %h %p
# production
is a comment. It helps provide context for for the line that follows it.Host prod production prod*.example.com
indicates the host patterns that the subsequent parameters apply to. All of the following will work to connect to the configured HostName:ssh prod
ssh production
ssh prod.example.com
ssh production.example.com
HostName production.example.com
specifies the real host name to log into.ForwardAgent yes
specifies that the authentication agent will be forwarded to the remote server.- This is important for the production server as it allows public key sessions from the production server to other servers (especially source code repository servers).
ProxyCommand ssh -q bastion nc -w30 %h %p
specifies the command to use to connect to the server.- This allows the connections to servers behind the firewall using the bastion server as a proxy. Any SSH client (ex. ssh command line, svn, Transmit) will see the production session as a single connection. It just works!
The global defaults for all hosts is specified last. Its parameters apply if they are not previously defined (which is why it should be the last section of your SSH config).
# global defaults Host * ForwardAgent no ServerAliveCountMax 18 ServerAliveInterval 5 TCPKeepAlive no User arthur
# global defaults
is a comment. It helps provide context for for the line that follows it.Host *
indicates this is the global defaults section.ControlPath ~/.ssh/master-%r@%h:%p
supports the ControlMaster parameter. See ssh_config(5) OS X Manual Page if you are really curious.ServerAliveCountMax 18
helps ensure robust proxied sessions. See ssh_config(5) OS X Manual Page if you are really curious.ServerAliveInterval 5
helps ensure robust proxied sessions. See ssh_config(5) OS X Manual Page if you are really curious.TCPKeepAlive no
allows connections to weather short network outages (especially useful when connected via WiFi).User arthur
specifies the user to log in as (remember, in our example the local username is arthurdent).
Additionally, the following defaults are important. The parameter is not in this section because the default value is appropriate. It should be acknowledged so that it is not unintentionally superseded by a configured parameter:
ForwardAgent no
specifies that the authentication agent will not be forwarded. This prevents administrators on untrusted remote servers from masquerading as you on any system on which you have your SSH public key. See SSH Agent Hijacking for more information.