Нештатное применение TCP TTL
Представим что у нас есть сервер с серым 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 по умолчанию в исходниках ядра.