VPN-сервер на Google Compute Engine с OpenVPN

13

Я пытаюсь использовать сервер Google Compute Engine в качестве VPN-сервера для всего своего трафика (я живу в России, у нас есть некоторые проблемы с цензурой здесь).

Существует мини-учебник по VPN на GCE , но он касается сети между двумя серверами внутри GCE, а не с OpenVPN.

Я сделал все шаги из другого урока, о настройке VPN с OpenVPN на Debian , я могу подключиться к VPN с клиента, но потом я не могу открыть соединения (даже не могу пропинговать Google). На сервере я могу пинговать и скачивать все как обычно.

У меня есть VPN на Linode с той же настройкой, и он работает нормально. Так что проблема в правилах сетевой маршрутизации или межсетевого экрана GCE.

Я перепробовал много вариантов, но ничего не работает. Пожалуйста, посмотрите на настройки и скажите, что мне следует изменить.

// строки конфигурации удалены, потому что проблема решена //

OZ_
источник
Есть ли способ включить пересылку IP? echo 1> / proc / sys / net / ipv4 / ip_forward
Алек Истомин
@ AlecIstomin, да, все готово. У меня есть VPN на Linode с той же настройкой, и он работает нормально. Так что проблема в правилах сетевой маршрутизации или межсетевого экрана GCE.
OZ_
Может быть, попросить поддержку GCE? Это похоже на то, что они могли бы ответить быстро.
Билл Вайс,
Цена @BillWeiss для их планов поддержки начинается от 150 долларов в месяц, но если эта проблема не будет решена в течение недели, я думаю, что заплачу им. Также я постараюсь найти кого-то на oDesk, чтобы исправить это, а затем напишу учебник в моем блоге.
OZ_
odesk.com/jobs/~01c4b1438a64f31fdd - не стесняйтесь обращаться, если можете, ребята.
OZ_

Ответы:

7

Прежде всего, спасибо @Shivox за его ответ .

И вот быстрые инструкции:

  • Я рекомендую вам создать дополнительную сеть (см вкладку «Сети» ") В сети предпочтения, добавить разрешающие правила для: TCP: 22 (если не существует), TCP: 9700, TCP:. 17619 . 17619 здесь переменная - изменить на любой порт, который вам нравится (диапазон 9075-65534). Вам нужно только 3 правила и 2 маршрута по умолчанию, больше ничего.
  • Перейдите в «Создать экземпляр Compute Engine», нажмите «Показать дополнительные параметры», разрешите переадресацию портов, выберите местоположение сервера.
  • Теперь (когда вы выбрали местоположение), добавьте статический IP на сервер.
  • Выберите образ Ubuntu 14.04 (именно эту версию).
  • Создать экземпляр
  • Подключение через SSH (самый простой способ - использовать инструмент в браузере с панели GCE)
  • sudo su
  • apt-key update && apt-get update && apt-get -y upgrade && apt-get -y install python-software-properties && apt-get -y install software-properties-common && add-apt-repository -y ppa:pritunl && apt-get update && apt-get -y install pritunl
  • В браузере открой https://instance_ip:9700
  • На вопрос о БД, нажмите «Сохранить»
  • В окне входа используйте pritunlимя пользователя и пароль
  • Теперь измените имя пользователя и пароль администратора
  • Добавить организацию, затем 2 пользователя (для ПК и мобильных устройств)
  • Нажмите «Добавить сервер» на вкладке «Серверы»
  • Используйте номер порта с первого шага ( 17619 в качестве примера) и протокол TCP.
  • Присоединить организацию к серверу
  • Запустить сервер
  • На вкладке «Пользователи» загружаются ключи для обоих пользователей (tar-архивы с файлами ovpn внутри).

В качестве клиентов я использую Visidity для OS X и OpenVPN connect для iOS. В программе «Вязкость» включите параметр «Отправить весь трафик через VPN-соединение» на вкладке «Сеть».

OZ_
источник
На заметку: Google Cloud Platform предоставляет бесплатную пробную версию с 300 долларов США на 60 дней.
OZ_
1
Изменения в руководстве по установке Pritunl на Ubuntu 14.04: github.com/pritunl/pritunl#ubuntu-trusty
motobói
6

Вы можете решить проблему невозможности просмотра веб-страниц через VPN, несмотря на то, что вы можете пропинговать, traceroute ... одним из двух следующих способов:

Во-первых, вы можете использовать протокол TCP вместо UDP, изменив «proto udp» на «proto tcp» в клиентских и серверных файлах conf.

Во-вторых, вы можете использовать устройство tap вместо tun, изменив «dev tun» на «dev tap» в клиентских и серверных файлах conf.

Не уверен, что проблема, хотя, кажется, это проблема с конца Google.

Shivox
источник
1
Ты мой герой! Большое спасибо! Переключиться на TCP сделал свое дело. Я раскрою полное "как" в отдельном ответе. Это чувство, когда давняя мечта сбылась ... Спасибо!
OZ_
4

Помните, что Google VPC отбрасывает пакеты, которые имеют source_ipне внутренний IP-адрес виртуальной машины, имеющей внешний IP-адрес.

Этот документ https://cloud.google.com/compute/docs/vpc/advanced-vpc гласит:

Сеть VPC перезаписывает IP-заголовок, чтобы объявить внешний IP-адрес экземпляра в качестве источника. Если экземпляр не имеет внешнего IP-адреса, вызов не разрешается, и сеть VPC отбрасывает пакет, не сообщая об этом отправителю.

Таким образом, если ваше openVPN просто пересылает пакеты из другой сети, то пакеты на общедоступные внутренние будут отбрасываться, поскольку source_ipне соответствуют внутренним IP- адресам существующих виртуальных машин . По этой причине вам нужно NAT пакеты, выходящие из вашей локальной сети, например, на вашем узле VPN.

Chain POSTROUTING (policy ACCEPT)
target      prot opt source              destination         
MASQUERADE  all  --  192.168.0.0/16      !192.168.0.0/16

«Pritunl», упомянутый в ответе OZ_, работает, потому что он настраивает NAT автоматически.

Петр Табор
источник
3

Это не совсем ответ, но сайт не позволил мне добавить его в качестве комментария к вашему вопросу.

Тем не менее, у меня есть почти та же конфигурация, что вы подробно описали выше (я не настроил dnsmaq на жестком сервере)

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

Может быть, кто-то из Google может помочь нам узнать, что происходит.

PS 1. Как уже предлагали другие люди, можете ли вы проверить, включена ли пересылка ip? Для меня единственный способ убедиться, что значение net.ipv4.ip_forward было правильно восстановлено после перезагрузки, было после того, как я использовал пользовательское правило в /etc/sysctl.d

Например, вы можете добавить правило, используя следующую команду:

$ sudo echo "net.ipv4.ip_forward = 1" > /etc/sysctl.d/90-useroverrides.conf

PS 2. Если переадресация работает для вас, можете ли вы проверить маршрут трассировки к внешнему хосту при подключении к VPN ?. Вывод, который я получаю, когда я делаю это, немного странный (почему на одном и том же IP-адресе несколько прыжков):

$ sudo traceroute www.yahoo.com -T -p 80 -N 1 -z 0.5 -q 1
traceroute to www.yahoo.com (98.139.183.24), 30 hops max, 60 byte packets
 1  209.85.241.26 (209.85.241.26)  0.764 ms
 2  209.85.241.34 (209.85.241.34)  0.668 ms
 3  209.85.241.26 (209.85.241.26)  0.966 ms
 4  209.85.241.36 (209.85.241.36)  0.702 ms
 5  209.85.241.28 (209.85.241.28)  0.865 ms
 6  209.85.241.36 (209.85.241.36)  0.642 ms
 7  209.85.241.26 (209.85.241.26)  0.921 ms
 8  209.85.241.28 (209.85.241.28)  18.837 ms
 9  72.14.238.107 (72.14.238.107)  13.378 ms
10  72.14.237.131 (72.14.237.131)  38.275 ms
11  209.85.254.131 (209.85.254.131)  13.349 ms
12  *
13  ae-8.pat1.bfz.yahoo.com (216.115.101.231)  44.903 ms
14  ae-4.msr1.bf1.yahoo.com (216.115.100.25)  45.323 ms
15  xe-10-3-1.clr1-a-gdc.bf1.yahoo.com (98.139.232.101)  47.382 ms
16  et18-25.fab6-1-sat.bf1.yahoo.com (98.139.128.103)  45.793 ms
17  po-13.bas1-7-prd.bf1.yahoo.com (98.139.129.209)  41.143 ms
18  ir2.fp.vip.bf1.yahoo.com (98.139.183.24)  42.451 ms

PS 3. Единственное, что, кажется, работает должным образом, это то, что VPN использует внешний IP от моего хоста для доступа в Интернет.

$ sudo curl --interface tun0 checkip.dyndns.org
<html><head><title>Current IP Check</title></head><body>Current IP Address: 107.178.XXX.XXX</body></html>
Марио
источник
@OZ_ Рад слышать, что теперь вы можете пинговать и отслеживать маршрут при подключении к VPN. Теперь вы можете опубликовать результат одного из ваших трассировок? Мне любопытно узнать о первых строках вывода, потому что кажется, что пакет маршрутизируется в цикле, по крайней мере, для первых 8 прыжков (хотя я не эксперт по сети)
Mario
извините, вот оно: gist.github.com/jamm/028ae858a03e40495740 . И да, это выглядит странно. Может быть, нам нужен какой-то конкретный маршрут.
OZ_
1

Редактировать /etc/sysctl.conf, комментируя#net.ipv4.ip_forward=1

Это должно позволить OpenVPN направлять ваш трафик.

Джастин миллер
источник
Хороший учебник по этому вопросу по следующему адресу: ducea.com/2006/08/01/how-to-enable-ip-forwarding-in-linux
MFT,
это было упомянуто в первом комментарии serverfault.com/questions/590530/…
OZ_
1

Вам необходимо включить IP-пересылку для вашего экземпляра виртуальной машины в облаке Google, иначе пакеты не будут доставлены к вашей виртуальной машине Обратите внимание, что это отдельно от того, net.ipv4.ip_forward = 1что вы можете установить в своей виртуальной машине.

Переадресация IP может быть установлена ​​только один раз перед созданием виртуальной машины и не может быть изменена впоследствии. Чтобы включить его для новой виртуальной машины, нажмите Management, security, disks, networking, sole tenancy: введите описание изображения здесь

Затем на Networkingвкладке нажмите Network Interfaceи установите IP Forwarding в ON:

введите описание изображения здесь

Павел П
источник
0

Вам нужно добавить правило, разрешающее трафик для самого OpenVPN:

iptables -A INPUT -p udp --dport 1194 -j ACCEPT
Павел Рудницкий
источник
существует как правило № 4
OZ_
0

О сети.

1) Включить весь трафик из подсети OpenVPN (например, 10.8.0.0/24) на консоли

2) Я настоятельно рекомендую Вам добавить Маскарад в свою сеть.

firewall-cmd --zone=trusted --add-masquerade --permanent
firewall-cmd --reload-all

3) Не забудьте включить маршрутизацию пакетов в ядре

а) один раз

 echo 1 > /proc/sys/net/ipv4/ip_forward

б) навсегда в /etc/sysctl.conf:

 net.ipv4.ip_forward = 1
Миколас Панский
источник