Please also see the workflow documentation: workflow.md.
# insecure
Host insecure insecure.example.com
HostName insecure.example.com
# bastion
Host bastion bastion.example.com
HostName bastion.example.com
ControlPersist 8h
# production
Host prod production prod*.example.com
HostName production.example.com
ControlPersist 2h
ProxyCommand ssh -q bastion nc -w30 %h %p
# global defaults
Host *
ControlMaster auto
ControlPath ~/.ssh/cp_%r_%h
ControlPersist 5m
ServerAliveCountMax 60
ServerAliveInterval 30
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
# insecureis a comment. It helps provide context for for the line that follows it.Host insecure insecure.example.comindicates the host patterns that the subsequent parameters apply to. All of the following will work to connect to the configured HostName:ssh insecuressh insecure.example.com
HostName insecure.example.comspecifies the real host name to log into.
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
ControlPersist 8h
# bastionis a comment. It helps provide context for for the line that follows it.Host bastion bastion.example.comindicates the host patterns that the subsequent parameters apply to. All of the following will work to connect to the configured HostName:ssh bastionssh bastion.example.com
HostName bastion.example.comspecifies the real host name to log into.ControlPersist 8hspecifies that the master connection should remain open and idle in the background for up to 8 hours. This is especially convenient when the bastion server requires Multifactor authentication (MFA).ControlPersistis available as of OpenSSH 5.6. For previous versions, simply omit it.
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
ControlPersist 2h
ProxyJump bastion
# productionis a comment. It helps provide context for for the line that follows it.Host prod production prod*.example.comindicates the host patterns that the subsequent parameters apply to. All of the following will work to connect to the configured HostName:ssh prodssh productionssh prod.example.comssh production.example.com
HostName production.example.comspecifies the real host name to log into.ControlPersist 2hspecifies that the master connection should remain open and idle in the background for up to 2 hours.ControlPersistis available as of OpenSSH 5.6. For previous versions, simply omit it.
ProxyJump bastionspecifies that SSH host to proxy connections through. Any SSH client (ex. ssh command line, git, Transmit app) will see the production session as a single connection. It just works!ProxyJumpis available as of OpenSSH 7.3- For OpenSSH versions 5.4 through 7.2 use:
ProxyCommand ssh bastion -W %h:%p - For OpenSSH versions 5.3 and below use:
ProxyCommand ssh -q bastion nc -w30 %h %pi
- For OpenSSH versions 5.4 through 7.2 use:
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 *
ControlMaster auto
ControlPath ~/.ssh/cp_%r_%h
ControlPersist 5m
ServerAliveCountMax 60
ServerAliveInterval 30
TCPKeepAlive no
User arthur
# global defaultsis a comment. It helps provide context for for the line that follows it.Host *indicates this is the global defaults section.ControlPath ~/.ssh/cp_%r_%hsupports the ControlMaster parameter. The path given here supports longer host names which can otherwise cause issues.ControlPersist 5mspecifies that the master connection should remain open and idle in the background for up to 5 minutes. This will speedup version control commands while also being a good conservative default.ControlPersistis available as of OpenSSH 5.6. For previous versions, simply omit it.
ServerAliveCountMax 60helps ensure robust proxied sessions.ServerAliveInterval 30helps ensure robust proxied sessions.- A
ServerAliveIntervalof 30s combined with aServerAliveCountMaxof 60 will result in disconnections of unresponsive clients after half an hour. - The relatively short
ClientAliveIntervalshould ensure aggressive TTLs do not severe connections. The largerClientAliveCountMaxshould allow brief interruptions without disrupting work.
- A
TCPKeepAlive noallows connections to weather short network outages (especially useful when connected via WiFi).User arthurspecifies 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 OpenSSH default value is appropriate. It should be acknowledged so that it is not unintentionally superseded by a configured parameter:
ForwardAgent nospecifies 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.