SELECT x.id1, x.id2
FROM tbl x
WHERE EXISTS (
SELECT *
FROM tbl y
WHERE (y.id1, y.id2) = (x.id2, x.id1)
);
Assuming that the combination of (id1, id2) is unique, so no DISTINCT. This would still allow (1,2) and (2,1) to coexist (and both will be returned), but no two rows with (1,2).
Also assuming id1 != id2 for every row (deriving from your test data and question). A unique entry (1,1) without doppelganger would be returned by this query. If my first assumption is true, you can exclude id1 = id2 right away. Else, you'd need something like row_number() to identify duplicates ...
A multicolumn index would greatly speed up such a query:
CREATE UNIQUE INDEX tbl_id1_id2_idx ON tbl (id1, id2);
Use it without UNIQUE keyword, should (id1, id2) not be unique after all.
Or, you can use those other techniques discussed under your prequel question, accordingly modified.