Назад | Перейти на главную страницу

Как направить исходящий трафик через другой сервер?

Я пытаюсь достичь http (s) запросов, исходящих с машины А кажется, что целевой сервер исходит с машины B.

Чтобы проиллюстрировать это на примере:
Допустим, у меня две виртуальные машины А и B работает Ubuntu и живет в одной VPN, машине А имеет публичный IP 1.1.1.1 и частный IP 10.1.0.1 пока машина B имеет публичный IP 2.2.2.2 и частный IP 10.1.0.2, диапазон IP-адресов VPN составляет 10.1.0.0/20.
Учитывая вышеизложенное, я хотел бы иметь возможность сделать это:

ssh root@1.1.1.1
root@1.1.1.1:~# curl ifconfig.me
2.2.2.2
root@1.1.1.1:~#

Обратите внимание, что я ищу решение для маршрутизации только исходящий traffic, я бы хотел, чтобы маршрутизация любого входящего трафика не менялась.

Я смог пройти половину пути, сделав следующее:

  1. на машине B включение переадресации IP с помощью sysctl -w net.ipv4.ip_forward=1
  2. на машине B обновление iptables с помощью iptables -t nat -A POSTROUTING -s 10.1.0.0/20 -o eth0 -j MASQUERADE
  3. на машине А обновление маршрутизации с помощью ip route change default via 10.1.0.2

Однако этот подход прерывает весь входящий трафик. в прямо к 1.1.1.1 включая ssh, например подключиться к 1.1.1.1 Мне бы теперь пришлось сделать это ssh -o ProxyCommand="ssh -W %h:%p root@2.2.2.2" root@10.1.0.1, что неприемлемо для моего варианта использования.

Насколько я понимаю, используя iptables на машине А (скорее, чем ip route change default ...) Я должен иметь возможность направлять исходящий трафик через машину BОднако пока что мне это не удалось.

Одна из вещей, которые я пробовал, - это обновить OUTPUT цепь с DNAT на машине А (с машиной B setup, как указано выше), но это приводит к тому, что для всех запросов истекает время ожидания.

ssh root@1.1.1.1
root@1.1.1.1:~# curl -m 5 ifconfig.me
1.1.1.1
root@1.1.1.1:~# iptables -t nat -A OUTPUT -p tcp -m multiport --dports 80,443 -j DNAT --to-destination 10.1.0.2
root@1.1.1.1:~# curl -m 5 ifconfig.me
curl: (28) Failed to connect to ifconfig.me port 80: Connection timed out

Пока я не замужем за iptables решение Я бы хотел по возможности избегать решений, требующих загрузки нестандартных инструментов.


В случае, если это имеет значение, конкретная платформа, которую я использую, - это Digital Ocean, поэтому виртуальные машины - это капли, а VPN - это то, что они называют виртуальным частным облаком.

Самое простое решение для доступа по SSH с настройкой MASQUERADE - добавить правило переадресации портов на 2.2.2.2:

iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 222 -j DNAT --to-destination 1.1.1.1:22

Тогда вы можете использовать ssh -p 222 user@2.2.2.2 подключиться к 1.1.1.1.

Если этого решения недостаточно, то вам потребуется более сложная настройка.

Приведенное выше решение MASQUERADE нарушает входящее соединение SSH из-за изменения маршрута по умолчанию в 1.1.1.1.

В этой настройке входящие пакеты для SSH-соединения поступают из интерфейса с выходом в Интернет. Тем не мение, 1.1.1.1 отправляет ответные пакеты через 2.2.2.2, который отбрасывает их, поскольку они не связаны с подключением.

Чтобы обойти это, вам нужно отметить пакеты, принадлежащие SSH-соединению:

iptables -t mangle -A PREROUTING -i eth0 -p tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m connmark --mark 1 -j CONNMARK --restore-mark
iptables -t mangle -A POSTROUTING -m mark --mark 1 -j CONNMARK --save-mark

Первое правило применяет метку пакета 1 ко всем пакетам, предназначенным для порта SSH.

Второе правило восстанавливает существующие метки соединений до меток пакетов для обработки маршрутизации в обоих направлениях.

Третье правило сохраняет существующую метку пакета в метку подключения для последующих пакетов подключения.

Следующим шагом является создание настраиваемой таблицы маршрутизации для пакетов, связанных с SSH-соединениями:

редактировать /etc/iproute2/rt_tables и добавьте следующую строку:

100    ssh

Затем добавьте настраиваемую таблицу маршрутизации:

sudo ip rule add priority 1000 fwmark 0x1 table ssh

Затем добавьте маршрут в настраиваемую таблицу маршрутизации:

sudo ip route add table ssh 0.0.0.0/0 via <original default route> dev eth0 src 1.1.1.1