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

Прозрачный прокси, который сохраняет Mac-адрес клиента

У меня есть клиент, который хочет перехватить SSL-трафик, когда он покидает их сеть. Мое предлагаемое решение состоит в том, чтобы настроить прокси-сервер, который будет прозрачным, и на уровне 2, и на уровне 3, чтобы его можно было просто добавить в их сеть без каких-либо изменений в конфигурации. Прокси-сервер имеет два сетевых адаптера, один из которых подключен к серверу, а другой - к клиенту. Клиент, прокси и шлюз находятся под контролем клиента, сервер - нет.

Например:

client --- Proxy --- gateway -|- server

Моя прокси-программа настроена с опцией сокета IP_TRANSPARENT, чтобы она могла отвечать на соединения, предназначенные для удаленного IP.

Я использую следующую настройку:

iptables -t mangle -A PREROUTING -p tcp --dport 80 -j TPROXY --on-port 3128 --tproxy-mark 1/1
iptables -t mangle -A PREROUTING -p tcp -j MARK --set-mark 1
ip rule add fwmark 1/1 table 1
ip route add local 0.0.0.0/0 dev lo table 1

Рассматриваемый клиент находится в своей собственной подсети и настроен таким образом, что прокси-сервер является шлюзом по умолчанию.

Результат:

  1. Клиент отправляет фрейм на прокси; исходный IP-адрес - клиент, исходный Mac - клиент, целевой IP-адрес - сервер, целевой Mac - прокси
  2. Прокси-сервер пересылает этот кадр на шлюз; исходный IP-адрес - прокси, исходный Mac - прокси, целевой IP-адрес - сервер, целевой Mac - шлюз
  3. Шлюз пересылает это на сервер и получает ответ.
  4. Шлюз отправляет ответ прокси; исходный IP-адрес - сервер, исходный Mac - шлюз, целевой IP-адрес - прокси, целевой Mac - прокси
  5. Прокси-сервер пересылает этот ответ клиенту; исходный IP-адрес - сервер, исходный Mac - прокси, целевой IP-адрес - клиент, целевой Mac - клиент. Конфигурация tproxy и iptables позволяет прокси-серверу отправлять пакеты с нелокальным IP-адресом.

Есть ли способ сделать что-то прозрачным на уровне MAC-адреса? То есть поместите клиента в ту же подсеть, что и шлюз. Шлюз видит исходный IP-адрес и Mac как клиентские, даже если они исходят от прокси. Можно ли это сделать, настроив прокси как мост, а затем использовать ebtables для увеличения трафика, который будет обрабатываться iptables?

Когда я использую ebtables для передачи чего-либо в iptables, оказывается, что моя прокси-программа не отвечает на пакеты, поскольку они предназначены для MAC-адреса шлюза, а не прокси-сервера.

Какие еще потенциальные возможности я мог бы изучить?

РЕДАКТИРОВАТЬ: когда клиент и шлюз находятся в разных подсетях (и клиент установил прокси-сервер в качестве шлюза), он работает, как описано в пунктах 1-5. Но я хочу знать, можно ли иметь клиент и шлюз на одном и том же подсеть и сделать прокси полностью прозрачным (т.е. клиент не знает о прокси). Заказчик не хочет перемещать некоторых клиентов в другую подсеть, он просто хочет получить решение. Спасибо!

РЕДАКТИРОВАТЬ 2: я могу настроить прокси-сервер как мост с помощью brctl, но не могу найти способ направить этот трафик в мою прокси-программу - спрашивается здесь Может ли мост Linux перехватить трафик?. В настоящее время с описанием от 1 до 5 он работает на уровне 3; он прозрачен на стороне клиента (клиент думает, что он обращается к IP-адресу сервера), но не на стороне шлюза (шлюз обращается к IP-адресу прокси). Я хочу узнать, можно ли заставить это работать на уровне 2, чтобы он был полностью прозрачным? Какие доступные варианты мне следует изучить? Спасибо

РЕДАКТИРОВАТЬ 3: более подробно прояснил ситуацию.

Если машины находятся в одной подсети, ответ отрицательный. Внутри подсети протокол Ethernet доставляет пакеты от машины к машине, а на уровне Ethernet MAC-адрес является истинным адресом источника, а IP-адреса неизвестны.