If %{proxy_host} is set, all connections will go through a proxy server (firewall) defined by %proxy_host and %proxy_port. Note that %{proxy_host} should usually not be set if TF has been compiled to use SOCKS.
When the connection to
%proxy_host
%proxy_port
is made, only the PROXY
hook is called; the CONNECT and LOGIN
hooks which are normally called after
making a connection are not called when a proxy is used.
A PROXY hook defined in the standard
library calls /proxy_command, which by
default sends "telnet
${world_host}
${world_port}", and
then invoke the CONNECT and LOGIN hooks
(which, by default, bring the
world into the
foreground
and perform an automatic login).
Before the connection to the proxy server is made, ${world_host}, ${world_port}, error messages, and /listsockets all refer to the proxy server; after the connection is made, they refer to the target server defined in /addworld.
The proxy connection command is done with this standard macro:
/def -i proxy_connect = telnet ${world_host} ${world_port}
If your proxy server requires a different command, you should redefine
proxy_connect. That will be sufficient for most proxy servers.
(Before version 5.0, a custom connect command required you to redefine
proxy_command. This should be avoided now if possible.)
If your proxy server has more complex requirements, or you want better
error detection, you will need to redefine the proxy_command
macro. By default,
proxy_command immediately calls /proxy_connect,
enables localecho, and invokes the
CONNECT and LOGIN hooks.
There are several reasons you might want to redefine
proxy_command:
proxy_command can not detect when
proxy_connect fails, so it will always send your login
command even if the proxy server did not connect to the target server.
proxy_command should wait for some indication that the
proxy server is ready before sending commands.
For example, say you use a Gauntlet telnet proxy that leaves localecho off; prints a "tn-gw->" prompt; requires you to send "telnet hostname port" to connect; after a successful connection, prints "Connected to hostname"; and after a failed connection prints an error message and prints another prompt. So, you could use this definition:
/def proxy_command =\
/def -p10000 -w -1 -h'PROMPT tn-gw->' =\
/proxy_connect%%; \
/localecho on%%; \
/def -p10002 -w -1 -h'PROMPT tn-gw->' proxy_error_$${world_name} =\
/undef proxy_success_$$${world_name}%%%;\
/dc%%;\
/def -p10002 -w -1 -t'Connected to *' proxy_success_$${world_name} =\
/undef proxy_error_$$${world_name}%%%;\
/trigger -hCONNECT $$${world_name}%%%;\
/if ($$${world_character} !~ "" & $$${world_login}) \
/trigger -hLOGIN ${world_name}%%%;\
/endif
The first /def waits for the first
prompt
before doing anything. It then sends the connection command,
turns localecho back on,
and sets up macros
to catch the results of the connection command.
The success trigger
undefines the error hook,
and invokes the CONNECT and LOGIN hooks.
The error hook
undefines the success trigger
and disconnects from the proxy.
See: /addworld, %proxy_host, %proxy_port