#JavaScript (ES6), 35 bytes
JavaScript (ES6), 35 bytes
Saved 1 byte thanks to @Shaggy
a=>a.every((v,i)=>v<0|v!=i&a[v]==i)
###Commented
Commented
a => // a[] = input array
a.every((v, i) => // for each value v at position i in a[]:
v < 0 | // force the test to succeed if v is negative (non-tunnel position)
v != i & // make sure that this cell is not pointing to itself
a[v] == i // check the other end of the tunnel
) // end of every()