Здравствуйте!
Я пытаюсь создать свой Docker образ, который будет запускаться в виртуальной машине (VM) с установленной операционной системой Ubuntu. Управление этой VM осуществляется через гипервизор VirtualBox, который работает на основной ОС Windows 11.
VM настроена на подключение к сети в режиме сетевого моста. Я также предполагаю, что Docker контейнер подключен в режиме сетевого моста к моей VM (внутри Docker сети ему присваивается IP-адрес 172.18...., и, как я понимаю, работает NAT Docker).
Я пытаюсь подключиться к OpenVPN серверу из VM, где работает данный Docker контейнер, но также пробовал это сделать и из основной ОС Windows 11.
Суть проблемы заключается в том, что после успешного подключения к OpenVPN серверу я не вижу, чтобы весь трафик проходил через мой VPN сервер (то есть через его интерфейс).
Я постараюсь предоставить вывод любых команд максимально оперативно и выполнить любые действия для устранения проблемы. Возможно, кто-то уже сталкивался с подобной задачей и сможет подсказать, в чем может быть дело.
Вот мой файл docker-compose.yml:
<pre><code>version: '3.8'
services:
openvpn-webserver:
build:
context: .
dockerfile: ./openvpn-webserver/Dockerfile
image: openvpn-webserver
container_name: openvpn-webserver
cap_add:
- NET_ADMIN // даю права на управление сетевыми интерфейсами
devices:
- /dev/net/tun:/dev/net/tun
environment:
- ADMIN_USERNAME=admin
- ADMIN_PASSWORD=somepass
- USER_PASSWORD=somepass
- SECRET_KEY=somekey
- IP_ADDRESS_ASSIGNMENT_POOL=10.8.0.0
- SERVER_NETMASK=255.255.255.0
ports:
- "1194:1194/udp"
- "80:80
```
Проблемы с маршрутизацией при настройке OpenVPN сервера в Docker могут проявляться по нескольким причинам. Вот некоторые из основных моментов, на которые стоит обратить внимание:
1. **Маршрутизация трафика**:
- После подключения к OpenVPN серверу, необходимо установить правильные маршруты на клиентской стороне (в вашей VM или Windows). Убедитесь, что ваш VPN-сервер правильно настроен на отправку маршрутных обновлений клиентам. Это достигается с помощью директивы `push` в конфигурации OpenVPN. Например, чтобы направить весь трафик через VPN, используйте:
```
push "redirect-gateway def1"
```
Это заставит клиентов использовать VPN для доступа к интернету.
2. **Настройки IP-адреса**:
- Убедитесь, что ваш сервер OpenVPN имеет корректный IP-адрес. Проверьте, что ваш сервер назначает IP-адреса в указанном пуле (например, `10.8.0.0/24`), и что эти адреса не конфликтуют с адресами в вашей сети.
3. **Правила iptables**:
- Убедитесь, что у вас настроены правила iptables для разрешения трафика между интерфейсами. Если вы используете NAT, правило MASQUERADE может помочь. Например:
```bash
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
```
Это позволить пакета, выходящим из контейнера, иметь правильный адрес.
4. **Проброс портов**:
- Ваша конфигурация порта в docker-compose.yml выглядит правильно, но убедитесь, что на вашем VPN-сервере OpenVPN правильно настроены порты и протоколы (UDP/TCP).
5. **Проблемы с MTU**:
- Иногда проблемы с MTU (Maximum Transmission Unit) могут вызывать проблемы с маршрутизацией. Убедитесь, что MTU настроен правильно как на сервере, так и на клиенте.
6. **Настройка Docker**:
- Поскольку вы используете сетевой мост Docker, убедитесь, что Docker напрямую не блокирует трафик, отправленный через интерфейс с NAT.
7. **Настройки VirtualBox**:
- Если VM настроена для работы в режиме сетевого моста, убедитесь, что она действительно получает IP-адрес от вашей локальной сети, и что нет конфликтов IP с другими устройствами в этой сети.
8. **Логи OpenVPN**:
- Проверьте логи OpenVPN как на сервере, так и на клиенте. Они могут содержать подсказки о том, что может быть неправильно с вашим подключением или маршрутизацией.
На основе вышеизложенных пунктов, попробуйте внести изменения и провести дополнительные проверки. Если у вас будут возникать вопросы или проблемы при выполнении этих шагов, не стесняйтесь делиться логами или указывать, на каком этапе вы снова столкнулись с проблемами.
Логи подключения клиента к openvpn серверу(подключение удачно проходит, ip получает из нашего пула, dns тоже удачно приходят вроде как): <br/> <br/> Ниже в логах есть предупреждение интересное, но redirect-privat я вроде нигде не использовал а вот redirect-gateway опцию я использовал как в клиентском конфиге так и на сервере, так как это рекомендовалось в мануалах. <br/> 2024-09-08 19:54:52 WARNING: You have specified redirect-gateway and redirect-private at the same time (or the same option multiple times). This is not well supported and may lead to unexpected results <br/> <br/> <pre><code>root@tester-VirtualBox:/home/tester/Downloads# openvpn --config ./tester.ovpn Note: --data-cipher-fallback with cipher 'AES-256-CBC' disables data channel offload. OpenVPN 2.6.9 x86_64-pc-linux-gnu [SSL (OpenSSL)] [LZO] [LZ4] [EPOLL] [PKCS11] [MH/PKTINFO] [AEAD] [DCO] library versions: OpenSSL 3.0.13 30 Jan 2024, LZO 2.10 DCO version: N/A Enter Private Key Password: •••••••••• TCP/UDP: Preserving recently used remote address: [AF_INET]192.168.1.51:1194 Socket Buffers: R=[212992->212992] S=[212992->212992] UDPv4 link local: (not bound) UDPv4 link remote: [AF_INET]192.168.1.51:1194 TLS: Initial packet from [AF_INET]192.168.1.51:1194, sid=a97af0f4 b802a614 VERIFY OK: depth=1, CN=ChangeMe VERIFY KU OK Validating certificate extended key usage ++ Certificate has EKU (str) TLS Web Server Authentication, expects TLS Web Server Authentication VERIFY EKU OK VERIFY OK: depth=0, CN=server Control Channel: TLSv1.3, cipher TLSv1.3 TLS_AES_256_GCM_SHA384, peer certificate: 2048 bits RSA, signature: RSA-SHA256, peer temporary key: 253 bits X25519 [server] Peer Connection Initiated with [AF_INET]192.168.1.51:1194 TLS: move_session: dest=TM_ACTIVE src=TM_INITIAL reinit_src=1 TLS: tls_multi_process: initial untrusted session promoted to trusted PUSH: Received control message: 'PUSH_REPLY,redirect-gateway def1,dhcp-option DNS 8.8.8.8,dhcp-option DNS 8.8.4.4,route-gateway 10.8.0.1,topology subnet,ping 10,ping-restart 120,ifconfig 10.8.0.2 255.255.255.0,peer-id 0,cipher AES-256-GCM' WARNING: You have specified redirect-gateway and redirect-private at the same time (or the same option multiple times). This is not well supported and may lead to unexpected results OPTIONS IMPORT: --ifconfig/up options modified OPTIONS IMPORT: route options modified OPTIONS IMPORT: route-related options modified OPTIONS IMPORT: --ip-win32 and/or --dhcp-option options modified net_route_v4_best_gw query: dst 0.0.0.0 net_route_v4_best_gw result: via 192.168.1.254 dev enp0s3 ROUTE_GATEWAY 192.168.1.254/255.255.255.0 IFACE=enp0s3 HWADDR=08:00:27:ec:97:0a TUN/TAP device tun0 opened net_iface_mtu_set: mtu 1500 for tun0 net_iface_up: set tun0 up net_addr_v4_add: 10.8.0.2/24 dev tun0 net_route_v4_add: 192.168.1.51/32 via 192.168.1.254 dev enp0s3 table 0 metric -1 net_route_v4_add: 0.0.0.0/1 via 10.8.0.1 dev [NULL] table 0 metric -1 net_route_v4_add: 128.0.0.0/1 via 10.8.0.1 dev [NULL] table 0 metric -1 Initialization Sequence Completed Data Channel: cipher 'AES-256-GCM', peer-id: 0 Timers: ping 10, ping-restart 120</code></pre> <br/> <br/> Вот шаблон конфига .ovpn для пользователя: <br/> <pre><code>client dev tun // наш виртуальный интерфейс proto udp4 // Только IpV4 remote 192.168.1.51 1194 // ip нашего openvpn сервака(наша VM) resolv-retry infinite nobind persist-key persist-tun remote-cert-tls server data-ciphers AES-256-GCM data-ciphers-fallback AES-256-CBC auth SHA256 tun-mtu 1500 auth-nocache redirect-gateway def1 // Весь трафик через vpn сервер pull // Получать настройки(DNS итд) от сервера verb 3</code></pre> <br/> <br/> Конфиг openvpn сервера в нашем docker контейнере: <br/> <pre><code>port 1194 dev tun // наш виртуальный интерфейс topology subnet proto udp4 tun-mtu 1500 push "redirect-gateway def1" // отправляем клиенту что весь трафик должен идти через нас push "dhcp-option DNS 8.8.8.8" // задаем DNS push "dhcp-option DNS 8.8.4.4" tls-auth /etc/openvpn/ta.key 0 ca /etc/openvpn/easy-rsa/pki/ca.crt cert /etc/openvpn/easy-rsa/pki/issued/server.crt key /etc/openvpn/easy-rsa/pki/private/server.key dh /etc/openvpn/easy-rsa/pki/dh.pem crl-verify /etc/openvpn/easy-rsa/pki/crl.pem server 10.8.0.0 255.255.255.0 keepalive 10 120 data-ciphers AES-256-GCM data-ciphers-fallback AES-256-CBC auth SHA256 user nobody group nogroup persist-key persist-tun status openvpn-status.log 10 log-append /var/log/openvpn.log verb 5</code></pre> <br/> <br/> В логах openvpn сервера я вижу что он дропает мои пакеты так как ему не нравится ip(bad source address from client) <br/> <pre><code>ess from client [192.168.1.51], packet dropped R2024-09-08 18:04:21 us=982940 tester/192.168.1.51:56940 MULTI: bad source address from client [192.168.1.51], packet dropped</code></pre>