У меня есть ситуация, когда мне нужно общаться с API, который разрешает соединения только с одного определенного IP-адреса.
Итак, api.example.com принимает соединения на порт 443 от белого списка ip.
Я хочу иметь возможность подключаться отовсюду к порту 443 ip из белого списка, перенаправлять пакеты на api.example.com на порт 443 и отправлять ответы обратно на подключающуюся машину.
Я предполагаю, что есть какой-то способ сделать это, похожий на прозрачный прокси-сервер squid, но я не могу этого понять.
Я пробовал следовать приведенным здесь примерам (http://www.tldp.org/HOWTO/TransparentProxy-6.html), используя приведенные ниже инструкции, но безуспешно.
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 443 -j DNAT --to api.example.com:443
iptables -t nat -A POSTROUTING -o eth1 -d api.example.com -j SNAT --to whitelisted-ip
Любая помощь будет оценена.
Обновить:
Я также пробовал следующее, но безрезультатно:
iptables -t nat -A PREROUTING -p tcp -d whitelisted-ip --dport 443 -j DNAT --to api.example.com:443
iptables -t nat -A POSTROUTING -p tcp -s api.example.com --sport 443 -j SNAT --to whitelisted-ip:443
Спасибо
Я только что понял, что это дубликат другого вопроса:
Как сделать переадресацию портов с одного ip на другой в той же сети?
Я заставил его работать с:
iptables -t nat -A PREROUTING -p tcp --dport 443 -j DNAT --to-destination api.example.com:443
iptables -t nat -A POSTROUTING -p tcp -d api.example.com --dport 443 -j SNAT --to-source whitelisted-ip
Вместе с sysctl переадресации ip:
echo 1 > /proc/sys/net/ipv4/ip_forward
В оболочке whitelisted-ip вы можете попробовать использовать netcat для таких задач.
Выполнив команду ниже в оболочке whitelisted-ip, вы собираетесь привязать порт 4443 и перенаправить соединение на api.example.com:443.
nc -l -p 4443 -c "nc api.example.com 443"
Таким образом, вы можете подключиться к whitelisted-ip: 4443 с любых других конечных точек.
Напоминание: я не рекомендую привязывать это к любому общедоступному интерфейсу без какой-либо защиты, вы могли бы скорее привязать порт к интерфейсу обратной связи, добавив -s 127.0.0.1
аргумент.
Насколько я понимаю, вы хотите получить доступ к серверу из любого места с одним IP-адресом (белый список-IP), который не является клиентским IP-адресом, который вы используете. Вы не можете этого сделать, потому что вы можете связаться с сервером с белым списком-ip, но сервер не сможет ответить, потому что это просто не ваш IP-адрес в сети.