
Я хочу настроить свою систему OSX таким образом, чтобы весь сетевой трафик проходил через туннель SSH.
Для этой цели я написал небольшой скрипт, и вот команды, которые он выполняет:
# setup tunnel
ssh -fN -D 1080 -p 22 user@remote
# start up redsocks
sudo redsocks -c /tmp/redsocks.conf -p /tmp/redsocks.pid
# forward all tcp traffic to tunnel
sudo ipfw add 0010 \
fwd 127.0.0.1,12345 \
tcp from me \
to any not dst-port 12345 \
not dst-port 1080 \
not dst-ip REMOTE_IP
Я использую redsocks для создания http-прокси для моего ssh-туннеля (чтобы я мог пересылатьвсеtcp-трафик к нему через ipfw), redsocks.conf выглядит так:
base {
log_debug = on;
log_info = on;
log = "file:/tmp/redsocks.log";
redirector = generic;
}
redsocks {
local_ip = 127.0.0.1;
local_port = 55660;
ip = 127.0.0.1;
port = 1080;
type = socks4;
}
Пока что все работает, весь TCP-трафик в моей системе OSX проходит через туннель ssh, но проблема в UDP-трафике, и из-за этого DNS-запросы не работают.
Как мне заставить DNS на моем локальном компьютере работать через SSH-туннель?
решение1
Ваша ipfw …
линия пересылает только TCP-трафик. Может быть, добавить следующую строку?
sudo ipfw add 0011 fwd 127.0.0.1,12345 \
udp from me \
to any not dst-port 12345 \
not dst-port 1080 \
not dst-ip REMOTE_IP
Также хорошей идеей будет добавить set -x
(для отладки) и set -e
(для немедленного завершения работы в случае сбоя любой из команд).
- Обычно термин «SSH-туннелирование» следует использовать для обозначения
tun
SSHtap
. - Переадресация портов — это особая форма туннелирования, но в данном контексте ее следует называть только «переадресацией портов».
- Не используйте SSH-туннелирование (как в
-oTunnel
и-oTunnelDevice
), за исключением быстрых специальных задач.- TCP через TCP — очень плохая идея:
- UDP через TCP чрезмерно увеличивает задержку для приложений, которые обычно его используют. Программы, которые используют UDP, должны иметь полный контроль над своей собственной надежностью и контролем перегрузки, как в случае RTP.
- DNS может использовать TCP как транспорт. Он не ограничен UDP, хотя этопредпочитаемыйтранспорт.
решение2
Использоватьшаттлвместо этого? sshuttle утверждает, что правильно обрабатывает DNS и TCP, без такого количества манипуляций — просто --dns
вариант.
IME SOCKS показался немного старым и нелюбимым. И я не очень понимаю это использование ipfw и redsocks.
Однако я хотел бы отметить, что SOCKS4 не поддерживает туннелирование DNS, поэтому я не удивлен, что у вас проблемы. Последующие версии SOCKS поддерживают его, так что вы можете рассмотреть это. И, судя по всему, SSH может поддерживать SOCKS5..
решение3
Помимо того, что вы уже используете, sSH позволяет туннелировать весь IP-трафик, независимо от используемого протокола уровня 4. Ваш удаленный сервер должен иметь PermitTunnel yes
, а клиент должен запросить туннель с помощью Tunnel
директивы. Затем вы можете использовать эту новую ссылку в качестве шлюза по умолчанию. СмотритеПодробная инструкция по туннелю здесь.