Вопрос или проблема
Из-за некоторых проблем в моей стране (Иран) у меня возникли трудности с подключением к API, подобному этому:
https://api.another.website.com
Я знаю указанный выше URL, но он находится в закодированном PHP-файле с IonCube Loader, поэтому я не могу изменить URL.
Я собираюсь сделать следующее:
Если я выполню curl https://api.another.website.com, это должно измениться на curl https://api.another.website.com:9999
Что я сделал:
- Отредактировал
/etc/hosts
и добавил эту запись:1.1.1.1 api.another.website.com
(в этом случае1.1.1.1
— это IP моего сервера) - Выполнил эту SSH-команду для открытия локальной переадресации:
ssh -L 0.0.0.0:9999:api.another.website.com:443 root@remote_server
Другое, что я не знаю, это что делать в iptables
.
Я гуглил и понял, что мне нужно добавить что-то вроде этого в iptables
:
iptables -I OUTPUT -o lo -t nat -p tcp --dport 443 -j DNAT --to 1.1.1.1:9999
Но проблема, которую я вижу в коде выше (и что я понял), в том, что он перенаправляет все запросы на 443 на 9999, но я не знаю, как перенаправить порт 443 только для одного IP или одного домена.
Не могли бы вы помочь мне, как это сделать?
Используйте -d
, чтобы сопоставить IP-адрес назначения. В этом случае 1.1.1.1
— это оригинальный адрес назначения (как разрешено через /etc/hosts), поэтому используйте -d 1.1.1.1
.
Ответ или решение
Для того чтобы перенаправить запросы к определённому IP на другой порт, вы можете воспользоваться iptables для настройки NAT (сети с преобразованием адресов). В вашем случае, вы хотите перенаправить запросы к api.another.website.com
, которые по умолчанию поступают на порт 443
, на порт 9999
вашего сервера. Ниже приведены указания по выполнению этой задачи.
Шаги по перенаправлению:
-
Редактирование файла hosts:
Вы уже добавили запись в файл/etc/hosts
:echo "1.1.1.1 api.another.website.com" | sudo tee -a /etc/hosts
-
Настройка SSH-туннеля:
Вы правильно открываете SSH-туннель с параметрами:ssh -L 0.0.0.0:9999:api.another.website.com:443 root@remote_server
Это перенаправит локальные запросы на порт
9999
кapi.another.website.com
на порту443
черезremote_server
. -
Настройка iptables:
Теперь вам нужно настроить iptables, чтобы перенаправить трафик только для определённого IP-адреса. Используйте следующую команду:sudo iptables -t nat -A OUTPUT -d api.another.website.com -p tcp --dport 443 -j DNAT --to-destination 1.1.1.1:9999
Объяснение команды:
-t nat
: Указывает, что мы работаем с таблицей NAT.-A OUTPUT
: Добавляет правило к цепочке OUTPUT (исходящие пакеты).-d api.another.website.com
: Указывает, что правило будет применяться только к пакету, направленному на указанный домен.-p tcp
: Применяем правило только для TCP-протокола.--dport 443
: Указывает, что правила будут применяться только к запросам, направленным на порт 443.-j DNAT --to-destination 1.1.1.1:9999
: Задаёт новое направление, на которое будут перенаправляться пакеты (в вашем случае1.1.1.1:9999
).
-
Проверка правил iptables:
Убедитесь, что правило добавлено успешно, с помощью команды:sudo iptables -t nat -L -n -v
-
Сохранение настроек iptables (по желанию):
Если вы хотите, чтобы данное правило сохранялось после перезагрузки системы, используйте следующие команды:sudo iptables-save > /etc/iptables/rules.v4
Теперь, когда вы выполните curl https://api.another.website.com
, запрос будет перенаправлен на https://1.1.1.1:9999
, как вы и планировали.
Если у вас возникнут дальнейшие вопросы или проблемы, пожалуйста, дайте знать!