Представим что у нас есть сервер с серым IP (192.168...), который стоит за неким роутером, к которому у нас нет доступа, на какой сервер через какой роутер проброшен какой-нибудь один или два порта, пусть 80 и 443, которые какой-то администратор когда-то посчитал нужным пробросить.

А нам для сущего удобства хочется ходить на этот сервер по SSH извне. Что тут можно сделать?

Можно легко переадресовать любой из этих портов на 22 для конкретной сети или хоста:

iptables -t nat -A PREROUTING -p tcp -s our-ip.example.com \
--dport 80 -j REDIRECT --to-port 22

Но у этого способа есть очевидный недостаток. Любой человек из той же сети что и мы, зайдя на этот сервер по HTTP вместо нужной ему страницы увидит что угодно, но не страницу. Скорей он увидит там знакомое приглашение:

SSH-2.0-OpenSSH_...

Естественно, это не то, что нам нужно.

Но выход есть...

Стоит нам на той машине, с которой мы хотим ходить по SSH, увеличить TTL для всех пакетов в направлении того сервера:

iptables -t mangle -A POSTROUTING -p tcp \ 
-d public-server-ip.example.net -j TTL --ttl-set 234

А на сервере настроить переадресацию на 22 порт только для пакетов с TTL, заведомо большим типичного, например, 150:

iptables -t nat -A PREROUTING -p tcp -s our-ip.example.com \
--dport 80 -m ttl --ttl-gt 150 -j REDIRECT --to-port 22

Мы получим возможность туннелировать нужный нам трафик по шифрованному каналу, не мешая при этом обычным пользователям по тому же самому порту на том же самом сервере видеть какой-нибудь совершенно привычный им сайт.

Можно ли поменять значение TTL на постоянной основе?

TTL также можно завысить через sysctl временно:

echo 234 > /proc/sys/net/ipv4/ip_default_ttl

Или постоянно, добавив в /etc/sysctl.conf строчку:

net.ipv4.ip_default_ttl = 234

Наконец, можно изменить значение TTL по-умолчанию в исходниках ядра.