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

Как заставить Apache выводить пакеты через определенный сетевой интерфейс при подключении к VPN?

У меня есть сервер apache, который отлично работает, пока я не подключусь к VPN, а затем все подключения к серверу не истекут.

Теперь, насколько я понимаю, проблема в том, tun0 становится интерфейсом вывода по умолчанию, поэтому apache не понимает, как отправлять пакеты, поэтому я попытался исправить это с помощью групп управления, пометив пакеты, исходящие из apache, и перенаправив их через eth0 как описано в этом SU ответ, но она больше не работает после того, как я обновил свою ОС Ubuntu до версии 16.04. Это моя сетевая диаграмма:

А вот детали моей сети:

me@mypc:~$ ip route list
0.0.0.0/1 via 10.132.1.5 dev tun0 
default via 192.168.0.1 dev eth0  proto static  metric 100 
10.132.1.1 via 10.132.1.5 dev tun0 
10.132.1.5 dev tun0  proto kernel  scope link  src 10.132.1.6 
123.4.5.6 via 192.168.0.1 dev eth0 
234.5.6.7 via 192.168.0.1 dev eth0 
128.0.0.0/1 via 10.132.1.5 dev tun0 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.6  metric 100 

me@mypc:~$ ifconfig
eth0      Link encap:Ethernet  HWaddr 00:cc:a9:b3:c9:41  
          inet addr:192.168.0.6  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:864897 errors:0 dropped:0 overruns:0 frame:0
          TX packets:467142 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:1088053099 (1.0 GB)  TX bytes:220201868 (220.2 MB)
          Interrupt:17 

lo        Link encap:Local Loopback  
          inet addr:127.0.0.1  Mask:255.0.0.0
          ...

tun0      Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  
          inet addr:10.132.1.6  P-t-P:10.132.1.5  Mask:255.255.255.255
          UP POINTOPOINT RUNNING NOARP MULTICAST  MTU:1500  Metric:1
          RX packets:46622 errors:0 dropped:0 overruns:0 frame:0
          TX packets:14950 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:100 
          RX bytes:60587170 (60.5 MB)  TX bytes:1396546 (1.3 MB)

Я провел дополнительное тестирование и обнаружил, что если я добавлю это правило маршрутизации:

sudo route add -host 123.4.5.6 gw 192.168.0.1

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

И после настройки групп управления на apache и попытки следующей команды:

sudo cgexec -g net_cls:novpn wget http://www.whatsmyip.org/

и проверяя ip на загруженной веб-странице, это будет мой ip маршрутизатора 123.4.5.6 а не мой vpn ip 10.132.1.6.

Итак, я предполагаю, что решение контрольных групп работает как-то, но не с apache, и входящие пакеты успешно принимаются apache, но ничего не выходит.

Как я могу настроить apache для использования eth0 выводить пакеты вместо tun0?

Управление 2 маршрутами по умолчанию и получение некоторого трафика для прохождения через один, а часть для прохождения через другой - большая проблема, и я бы рекомендовал вам избегать этого, если это возможно. Если вы не хотите выходить в Интернет через VPN, ваша установка может быть значительно упрощена, что решит проблемы. Вам действительно нужен доступ в Интернет через VPN? также какое значение имеет 10.132.1.5. Я не понимаю, почему вы используете его для маршрутизации на другие хосты в 10.132.1.x? у вас уже есть IP-адрес в этой подсети 10.132.1.x, и вы должны быть подключены напрямую.

поэтому, ЕСЛИ вы не хотите выходить в Интернет через VPN и нет необходимости маршрутизировать через 10.32.1.5, вы можете упростить свою таблицу маршрутизации до:

default via 192.168.0.1 dev eth0  proto static  metric 100 
10.132.1.0/24 dev tun0  proto kernel  scope link  src 10.132.1.6 
169.254.0.0/16 dev eth0  scope link  metric 1000 
192.168.0.0/24 dev eth0  proto kernel  scope link  src 192.168.0.6     metric 100 

Что также решит проблему с apache. Почему только эти маршруты? во-первых:

10.132.1.0/24 dev tun0  proto kernel  scope link  src 10.132.1.6 

должен быть единственным маршрутом, который вам нужен, чтобы добраться до всех хостов на другой стороне VPN. Поскольку этот маршрут соответствует 10.232.1.0 - 10.232.1.254, если в сети vpn есть другой адрес 10.xxx, вы можете расширить маршрут до 10.0.0.0/8. Если вы не понимаете, что означают биты / 8/24, я очень предлагаю вам прочитать Что такое косая черта после IP? или Google для "обозначения CIDR". сделает бит / 32/1 более понятным.

эти старые маршруты вместе определяют ваш маршрут по умолчанию через VPN

0.0.0.0/1 via 10.132.1.5 dev tun0 
128.0.0.0/1 via 10.132.1.5 dev tun0

Разделение его на 2 маршрута (один для первой половины Интернета и второй, покрывающий остальные) означает, что они имеют более высокий приоритет, потому что они более конкретны, чем ваш маршрут по умолчанию:

default via 192.168.0.1 dev eth0  proto static  metric 100 

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

123.4.5.6 via 192.168.0.1 dev eth0 
234.5.6.7 via 192.168.0.1 dev eth0 

Без маршрута по умолчанию через VPN эти маршруты не нужны. Если вам действительно нужно маршрутизировать трафик через 10.232.1.5 и нужно придерживаться наборов маршрутов по умолчанию, я бы рекомендовал использовать правила маршрута вместо переопределения маршрута по умолчанию. Правила маршрутизации более гибкие, но, как правило, вы это делаете, чтобы сопоставить исходный IP-адрес со шлюзом по умолчанию, поэтому весь трафик, полученный с вашего IP-адреса VPN (10.1.232.6), идет по маршруту VPN по умолчанию, а весь трафик поступает с вашего локального IP-адреса (192.168.0.1). 0.6) использует вашего интернет-провайдера в качестве маршрута по умолчанию. видеть https://unix.stackexchange.com/questions/22770/two-interfaces-two-addresses-two-gateways для руководства, как это сделать.

Итак, вам нужны оба шлюза по умолчанию; то способ сделать это - с помощью правил маршрута:

1) Добавьте вторичный IP-адрес в eth0 - т.е. 192.168.1.7 и перезапустите apache (похоже, ваша конфигурация listen 0.0.0.0:80 поэтому вам просто нужно перезапустить apache, чтобы он прослушивал новый IP-адрес.

2) Измените правила Nat на вашем маршрутизаторе для перенаправления трафика на этот IP:

3) Создайте новый маршрут по умолчанию во вторичной таблице маршрутов и назовите таблицу apache:

echo "1 apache" >> /etc/iproute2/rt_tables

4) Добавьте в эту таблицу маршрут по умолчанию через локальный маршрутизатор.

ip route add default via 192.168.0.1 dev eth0 table apache

5) Наконец, вам нужно правило, чтобы определить, какой трафик должен использовать таблицу маршрутов apache.

ip rule add from 192.168.0.7 table apache

192.168.0.7 - это вторичный IP-адрес, и Apache - единственный процесс, использующий его, это правило должно соответствовать только трафику, выходящему из Apache в ответ на веб-запросы. Это гарантирует, что только этот конкретный трафик будет использовать новую таблицу маршрутов, и он не будет мешать вашему трафику VPN или его текущему поведению маршрутизации.

обратите внимание, что ip команды не сохраняются после перезагрузки. Чтобы сделать их постоянными, добавьте их в свой интерфейс сценариями, чтобы они запускались каждый раз при перезагрузке ноутбука.

P.S Оставив свой старый ответ и сделаю это как новый ответ, так как это совсем другое решение.

Просто скажите apache прослушивать несколько IP-адресов.

Я думаю, вы захотите включить эти строки в свою конфигурацию.

Listen 192.168.0.6:80
Listen 10.132.1.6:80

Это говорит apache «привязаться» к порту 80 на каждом из этих IP-адресов. Если вы используете виртуальные хосты, вам также придется добавить эти строки в их конфигурации.

Примечание

Если вы его не используете, я рекомендую использовать статический IP-адрес на eth0 а также на сервере VPN.

Если вы не можете настроить статический IP-адрес в VPN, вы можете найти обходные пути. Можно было бы создать соответствующие Listen записи после подключения к VPN. Или, может быть, есть чистое решение, использующее имена хостов (если у вас есть DNS-сервер).

Официальная документация: