З'єднання лише через IPv6, служба на IPv4: нехай SOCKS-проксі стане мостом
SOCKS-проксі приймає одне з'єднання і відкриває інше, тож клієнт лише з IPv6 досягає служби на IPv4. Це пересилання, а не рідний доступ до IPv4.
Вам не потрібна адреса з родини призначення, щоб досягти її, якщо щось на шляху готове пересилати. Застосунок підключається до проксі, а проксі відкриває друге з'єднання до призначення. Це два сокети з незалежними родинами адрес, і ніщо в жодному з протоколів не вимагає, щоб вони збігалися. Це пересилання на рівні застосунку, а не рідний шлях IPv4, і саме ця різниця визначає, що працюватиме, а що ні. Плутанина між ними — це те, через що ноутбук описують як такий, що має підключення IPv4, хоча все, що він має, — це проксі.
Два сокети, дві родини адрес
Запит SOCKS5 називає призначення в одній із трьох форм: буквальна адреса v4, буквальна адреса v6 або ім'я, яке проксі має розв'язати. Запит описує, куди проксі слід підключитися, а не як виглядає з'єднання клієнта з проксі.
Читайте ці типи адрес як три незалежні вибори в одному повідомленні. Проксі, доступний через IPv6, може відкрити сокет призначення IPv4, коли має робочий вихід IPv4 і його політика дозволяє запит. Специфікація SOCKS5 визначає їх взагалі без посилання на транспорт клієнта.
Контрольований приклад із SSH
Візьміть SSH-хост, який вам дозволено використовувати, що відповідає через IPv6 і сам може досягти служби HTTPS, яка існує лише на v4. Динамічне перенаправлення OpenSSH ставить локальний SOCKS-слухач на вашій машині, поки сеанс входу йде через v6.
ssh -6 -N -D 127.0.0.1:1081 -o ExitOnForwardFailure=yes [email protected]Хост і обліковий запис вище — приклади, а прив'язка до loopback утримує слухач на цьому комп'ютері. Не замінюйте її прив'язкою до шаблонної адреси, щоб офіс міг спільно використовувати проксі без автентифікації. ExitOnForwardFailure=yes існує для того, щоб невдале перенаправлення завершувало сеанс, а не залишало тихо працюючу команду у фоні.
Коли сеанс запущено, запит виглядає так:
curl --proxy socks5h://127.0.0.1:1081 https://v4-only.example/З'єднання через loopback не є інтернет-шляхом IPv4. З вашої машини виходить сеанс входу через v6, і саме віддалена сторона відкриває сокет призначення. Форма socks5h також передає розв'язання імен тій стороні, що важливо, коли клієнт не має власного шляху до резолвера IPv4.
Що насправді бачить призначення
Призначення бачить вихідну адресу пересилача. Жодна адреса, що належить вашому ноутбуку, там не з'являється. Список дозволених джерел на цій службі має називати пересилача. Її журнали також припишуть трафік пересилачу. Запишіть це в журнал змін до аудиту, бо список дозволених, побудований навколо адрес клієнтів, зазнає невдачі вже на першому запиті.
Пересилач — це також місце, де видно обидві половини розмови, що є корисною властивістю під час діагностики і тягарем, якщо пересилач спільний без політики.
Це не DNS64 і не NAT64
DNS64 відповідає синтезованими записами, що замінюють призначення v4, а NAT64 переписує пакети вздовж налаштованого шляху. Жодне не описує те, що відбувається тут, де одна транспортна розмова закінчується і починається інша, і жодна синтезована адреса не пояснює результат. Тому успішний запит нічого не говорить про те, які служби перекладу експлуатує ваш провайдер, а проксі може виконувати звичайний NAT на власному виході.
Обидва механізми можуть існувати в одній мережі, тому опишіть той, який ви справді перевірили, а не той, що звучить найближче.
Знайте межі, перш ніж обіцяти їх
Динамічне перенаправлення OpenSSH переносить TCP-з'єднання, а не довільний IP-трафік, тому UDP, ICMP і будь-який протокол, що ігнорує проксі, потребують іншого підтримуваного рішення. Зберігайте перевірку ключа хоста SSH, обмеження перенаправлення сервера і перевірку сертифіката HTTPS, бо проксі — це додатковий довірений учасник, а не привід послаблювати перевірку особи. Якщо мета — пронести зовнішній транспорт VPN через проксі, перевірте, що обидва кінці підтримують цей транспорт, замість припускати, що будь-який SOCKS-слухач може його переслати.
Ніщо з цього не робить клієнт двостековим, і нічого з цього не потрібно. Це дає змогу одному застосунку досягти однієї служби через один пересилач, що є скромнішим твердженням і значно легше перевіряється.