To be able to access Machine A (behind firewall) from Machine C via intermediate Machine B (outside firewall), do this:
On Machine A:
ssh -2 -N -l [acct on B] -g -R 4001:localhost:22 MachineB
'-g' may or may not be required. That is what I use.
You can pick any port besides '4001'.
Then on Machine B:
ssh -p4001 -g -L 9999:machineA:22 localhost
Note that 'machineA' could also be '127.0.0.1'. Not 100% sure - experiment.
'-g' makes port 9999 also available to other machines external to Machine B.
Omitting '-g' makes port 9999 available only to other processes on Machine B.
Then on Machine C:
ssh -p9999 me@MachineB
Voila!
You could also access another machine, D, on A's network from C. Do this on MachineB:
ssh -p4001 -g -L 9999:[some machine on MachineA's network]:[some port] localhost
This allows you to access a port on some other machine on MachineA's network.
So, if there exists a machine D, also behind the firewall on the same network that sits beside Machine A, you can access it from Machine C as if you were sitting at Machine A.
For example, if Machine D is a Windows Server box and you want to use Remote Desktop from Machine C, which is also a Windows Box, to Machine D, do this:
Machine A:
ssh -2 -N -l [acct on B] -g -R 4001:localhost:22 MachineB
(this is same)
Machine B:
ssh -p4001 -g -L 9999:machineD:3389 localhost
Machine C: Fire up RDP client and connect to MachineB:9999
BAM! You're connected to the Windows Server Box (Machine D) from Machine C.