Layer of Abstraction and Level of Indirection are distinct concepts. Abstraction is the aggregation and meaningful naming of a number of elements such as pieces of data or program instructions, for instance the concept of a file or method call, whereas indirection is the decoupling of entities to facilitate the postponement of the realisation of their relationship, for example, the use of JNDI to separate the identification of a resource within a program from the actual resource which may eventually be provided by an application container.
Frequently the concepts go hand in hand and which one applies to a particular construct depends on what exercise or discussion is in progress. For instance, the abstract nature of an interface is important when learning or documenting an API; its property of indirection is important when adding extensibility to or creating tests for an application.
A layer of abstraction is the aggregation of abstractions and giving them a conceptual integrity and consistency of usage. CreateProcess is the win32 API name for a bunch of code that builds and executes a process. The "name" is significant to this context because if we called the function something like DoAllocMemThenMakeEnvThenFindEntryPoint... it really would not be very abstract. A layer such as the Win32 API provides a barrier across which a programmer may be advised not to venture. It removes complexity from the caller's viewpoint at the cost of reduced power (flexibility, performance etc). This trade-off is highlighted by frequent discussion of leaky abstractions: we may still need to make direct SQL calls when using Hibernate or make Win32 calls when using .NET.
Regarding indirection, most non-trivial programs operate with some form of user coded indirection, witness COBOL's INPUT-OUTPUT section from before the ark. When accessing a resource such as a database we may see the embedding of a JDBC connection string in the code as Level 0 indirection, a JNDI connection (which delegates the choice of resource to an application container) as Level 1 and some Spring construct that maps the application JNDI identifier to one of many container resources as Level 2. Multiple levels allow a number of parties external to the relationship (in this case a relationship between executing code and a database) to manipulate that relationship. This applies equally to internal program components such as interfaces and events.
We see that, no matter what their other qualities, abstraction reduces complexity whereas indirection increases it. Abstraction reduces power whereas indirection increases it. Indirection can be used to restore the power of abstraction by allowing default behaviour to be overridden by custom callbacks.