LINUX.ORG.RU

разрешить доступ к сайту только при OpenVPN

 ,


0

1

Сейчас сайт снаружи доступен по http://ip-address:8080. Как можно разрешить к нему доступ только при подключении через OpenVPN?

Текущие правила iptables:

# iptables -L -n
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain FORWARD (policy DROP)
target     prot opt source               destination        
DOCKER-ISOLATION  all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            ctstate RELATED,ESTABLISHED
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0          

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

Chain DOCKER (3 references)
target     prot opt source               destination        
ACCEPT     tcp  --  0.0.0.0/0            172.19.0.3           tcp dpt:80

Chain DOCKER-ISOLATION (1 references)
target     prot opt source               destination        
DROP       all  --  0.0.0.0/0            0.0.0.0/0          
DROP       all  --  0.0.0.0/0            0.0.0.0/0          
DROP       all  --  0.0.0.0/0            0.0.0.0/0          
DROP       all  --  0.0.0.0/0            0.0.0.0/0          
DROP       all  --  0.0.0.0/0            0.0.0.0/0          
DROP       all  --  0.0.0.0/0            0.0.0.0/0          
RETURN     all  --  0.0.0.0/0            0.0.0.0/0       

Не проще ли сделать это в настройках веб-сервера (апач, нджинкс — что там у тебя?), нежели блокировать целые подсети?

XMs ★★★★★ ()

Я не очень понял, как и для чего у Вас туннель поднят. Но по поводу Вашего вопроса - просто оставляете доступ из сети VPN, остальным запрещаете.

Serge10 ★★ ()

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

bvn13 ★★★★★ ()
Ответ на: комментарий от Serge10

туннель поднят для того, чтобы доступ к сайту был разрашен только через него, снаружи запрещен. «просто оставляете доступ из сети VPN, остальным запрещаете.»

Имеется в виду с помощью iptables?

gigantischer ()
Ответ на: комментарий от gigantischer

Имеется в виду с помощью iptables?

Да, конечно.

туннель поднят для того, чтобы доступ к сайту был разрашен только через него, снаружи запрещен.

Я имел ввиду подробности - между какими машинами поднят туннель? Какие адреса внутри него и какие сети по обе стороны от туннеля? Как маршрутизация настроена?

Serge10 ★★ ()
Ответ на: комментарий от bvn13

OpenVPN в docker контейнере:

# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
5eeb8d1226e9        kylemanna/openvpn   "ovpn_run"          2 hours ago         Up 2 minutes        0.0.0.0:1194->1194/udp   openvpn

И при старте контейнера появляется такой интерфейс

124: vethe00be94@if123: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master br-01bd8ae1015f state UP group default 
    link/ether 8a:3b:8b:6d:5a:33 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::883b:8bff:fe6d:5a33/64 scope link 
       valid_lft forever preferred_lft forever

Но он без айпишника. Т.е. нет возможности указать в настройках апача айпишник интерфейса с OpenVPn.

gigantischer ()
Ответ на: комментарий от Serge10

Туннель поднят между основным сервером, на котором крутится апач внутри docker контейнера и удаленными vpn клиентами.

Маршрутизация:

# netstat -nr
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
0.0.0.0         10.255.255.1    0.0.0.0         UG        0 0          0 eth0
10.255.255.1    0.0.0.0         255.255.255.255 UH        0 0          0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U         0 0          0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U         0 0          0 br-4dc510063f2a
172.19.0.0      0.0.0.0         255.255.0.0     U         0 0          0 br-01bd8ae1015f

gigantischer ()
Ответ на: комментарий от gigantischer
# ip route
default via 10.255.255.1 dev eth0 
10.255.255.1 dev eth0  scope link 
172.17.0.0/16 dev docker0  proto kernel  scope link  src 172.17.0.1 linkdown 
172.18.0.0/16 dev br-4dc510063f2a  proto kernel  scope link  src 172.18.0.1 linkdown 
172.19.0.0/16 dev br-01bd8ae1015f  proto kernel  scope link  src 172.19.0.1 

gigantischer ()
Ответ на: комментарий от gigantischer

VPN клиенты получают адреса из сети 10.4.54.0

Сейчас они имеют доступ к apache? А то я не увидел у Вас маршрутов в эту сеть.

По поводу ограничения доступа - в цепи FORWARD разрешите доступ к apache из сети 10.4.54.0. Политика по умолчанию - DROP. Этого будет достаточно.

Serge10 ★★ ()
Ответ на: комментарий от gigantischer

а можно наглядный пример?

Я по-прежнему не до конца понимаю структуру Вашей сети. Но как-то так:

iptables -A FORWARD -i $VPN_iface -s 10.4.54.0/$netmask -d $apache_IP -j ACCEPT
iptables -A FORWARD -s $apache_IP -d 10.4.54.0/$netmask -j ACCEPT
iptables -P FORWARD DROP

Это должно запретить доступ ко всем внутренним сервисам кроме apache, к которому доступ будут иметь машины из сети 10.4.54.0.

$VPN_iface здесь - интерфейс, на котором туннель работает, $apache_IP - адрес докера с apache, $netmask - маска сети для VPN-клиентов.

Serge10 ★★ ()
Последнее исправление: Serge10 (всего исправлений: 1)
Ответ на: комментарий от Serge10

А как узнать $apache_IP - адрес докера с apache? Внутри контейнера owncloud:

root@DCA0C03:~# docker exec -it 47f10a40e1a4 bash

root@47f10a40e1a4:/var/www/html# ip a
bash: ip: command not found

root@47f10a40e1a4:/var/www/html# /sbin/ifconfig
bash: /sbin/ifconfig: No such file or directory

Или имеется в виду адрес одного из bridge интерфейсов на хост системе?

gigantischer ()
Ответ на: комментарий от gigantischer

А как узнать $apache_IP - адрес докера с apache? Внутри контейнера owncloud

Я не знаю, как у Вас сеть организована в докере. Там разные варианты могут быть. В любом случае, apache должен слушать какой-то IP-адрес.

No such file or directory

Ну так кто мешает поставить в контейнер одну из этих утилит? Много места они не занимают.

Ну и возвращаемся к исходному вопросу - как это работает (и работает ли вообще) сейчас? Напомню, что исходно Вы задавали вопрос, как ограничить доступ к apache, оставив его только для VPN-клиентов. Что предполагает, что сам доступ уже есть. Если это так, то по какому адресу Вы к apache обращаетесь?

Перечитал Ваше первое письмо - похоже, что адрес apache - 172.19.0.3.

Единственное, что я не понимаю, где у Вас идет смена порта с 80 на 8080. По идее, должен быть DNAT задействован, но я не вижу его в Ваших правилах iptables.

Serge10 ★★ ()
Ответ на: комментарий от Serge10

сеть докер организована так: 2 bridge интерфейса и 1 docker0

4: br-4dc510063f2a: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:d7:aa:86:60 brd ff:ff:ff:ff:ff:ff
    inet 172.18.0.1/16 scope global br-4dc510063f2a
       valid_lft forever preferred_lft forever
    inet6 fe80::42:d7ff:feaa:8660/64 scope link 
       valid_lft forever preferred_lft forever
и
102: br-01bd8ae1015f: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:a0:60:c4:af brd ff:ff:ff:ff:ff:ff
    inet 172.19.0.1/16 scope global br-01bd8ae1015f
       valid_lft forever preferred_lft forever
    inet6 fe80::42:a0ff:fe60:c4af/64 scope link 
       valid_lft forever preferred_lft forever
и
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:c4:84:9c:ef brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:c4ff:fe84:9cef/64 scope link 
       valid_lft forever preferred_lft forever

gigantischer ()

Вариант №1 (простой но корявый)

Заблокировать входящий трафик с непотребного интерфейса на порт апача:

iptables -I INPUT -i eth0 -p tcp --dport 8080 -j REJECT

Где eth0 внешний интерфейс. Опенвпн трафик будет приходить с интерфейса tun0 или вроде того.

Вариант №2 (правильный надежный но посложнее)

Настроить апач на прослушивание адреса который не доступен из интернетов.

Важно чтобы подсеть в которую входит в этот адрес анонсировалась опенвпн клиенту.

Например что то вроде

push route 10.20.30.0 255.255.255.0

в конфиге опенвпн сервера

Дальше настроить апач на этот адрес. Что то вроде

Listen 10.20.30.1:8080

в конфиге виртуалхоста апача или вроде того

Естественно этот адрес должен быть на каком-нибудь интерфейсе.

Если на сервере нету никаких дополнительных внутренних подсетей, то можно добавить его на тот самый lo.

ip addr add 10.20.30.1/24 dev lo

Как это правильно прописать в конфигах чтобы не слетело при ребуте — зависит от дистрибутива.

В принципе можно использовать адрес бриджа докера. Обычно это 192.168.122.1.

redixin ★★★★ ()
Ответ на: комментарий от gigantischer

Так апач у меня внутри docker контейнера owncloud находится.

Так даже проще. Настрой контейнер на внутренний адрес. Контейнер как запускается? Там небось какой-нибудь --network=host.

redixin ★★★★ ()
Ответ на: комментарий от gigantischer

В конфиге докер композа можно указать не только порт, но и хост который слушать.

ports:
  - "0.0.0.0:8080:8080"

Вместо нулей нужно выставить любой доступный локальный адрес (кроме 127.0.0.1)

Этот адрес должен быть доступен с опенвпн клиента (push route вот это всё)

redixin ★★★★ ()
Ответ на: комментарий от gigantischer

т.е. нужно внутри контейнера openvpn добавить в openvpn.conf:

push route ip_address

где ip_address 192.168.255.1

т.е. адрес интерфейса tun0 внутри докер контейнера openvpn?

bash-4.4# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
2: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none 
    inet 192.168.255.1 peer 192.168.255.2/32 scope global tun0
       valid_lft forever preferred_lft forever
20: eth0@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:13:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.19.0.3/16 scope global eth0
       valid_lft forever preferred_lft forever

gigantischer ()
Ответ на: комментарий от gigantischer

можно сделать так?

Насколько я в курсе, iptables не поддерживает wildcards.

Но вы можете вызывать скрипт при каждом рестарте vpn-сервера, который будет присваивать текущий номер интерфейса переменной, используемой iptables.

Serge10 ★★ ()
Ответ на: комментарий от gigantischer

можно поподробнее?

У этого твоего деплоймента есть конфиг файл где описано какой контейнер как запускать и какие порты куда пробрасывать.

Что такое у тебя eth0@if21?

redixin ★★★★ ()
Ответ на: комментарий от redixin

нет, все запускается 1 командой:

# docker run --privileged --name pritunl --restart unless-stopped --net=host -d -t andrey0001/pritunl

eth0@if21-не знаю, его уже нет))

CK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq portid ac1f6b4db9fa state UP group default qlen 1000
    link/ether ac:1f:6b:4d:b9:fa brd ff:ff:ff:ff:ff:ff
    inet внешний_ip/32 brd внешний_ip scope global eth0
       valid_lft forever preferred_lft forever
    inet6 2001:8d8:1801:61::1/128 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::ae1f:6bff:fe4d:b9fa/64 scope link 
       valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST> mtu 1500 qdisc noop portid ac1f6b4db9fb state DOWN group default qlen 1000
    link/ether ac:1f:6b:4d:b9:fb brd ff:ff:ff:ff:ff:ff
60: veth0768d5a@if59: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 52:92:58:d8:c9:29 brd ff:ff:ff:ff:ff:ff link-netnsid 2
    inet6 fe80::5092:58ff:fed8:c929/64 scope link 
       valid_lft forever preferred_lft forever
62: veth4aa70af@if61: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether da:a3:d9:53:e1:f1 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet6 fe80::d8a3:d9ff:fe53:e1f1/64 scope link 
       valid_lft forever preferred_lft forever
64: veth205e942@if63: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 4a:ad:39:e4:d0:d4 brd ff:ff:ff:ff:ff:ff link-netnsid 4
    inet6 fe80::48ad:39ff:fee4:d0d4/64 scope link 
       valid_lft forever preferred_lft forever
67: tun0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UNKNOWN group default qlen 100
    link/none 
    inet 192.168.223.1/24 brd 192.168.223.255 scope global tun0
       valid_lft forever preferred_lft forever
    inet6 fd00:c0a8:df00::1/64 scope global 
       valid_lft forever preferred_lft forever
    inet6 fe80::c164:5cff:f307:770c/64 scope link flags 800 
       valid_lft forever preferred_lft forever
gigantischer ()
Ответ на: комментарий от gigantischer

не получится, у меня openvpn сервис стартует через web-интерфейс (а не через установленный deb-пакет openvpn), там нет возможности исп-ть дополнительный скрипт

Я не знаю, причем тут способ запуска, но в openVPN предусмотрена возможность запуска скриптов сразу же после установки соединения (параметр up в конфиге). Вот этим механизмом я и предлагаю Вам воспользоваться.

Serge10 ★★ ()
Ответ на: комментарий от gigantischer

да, такой возможности нет...

Хм, может, уже настало время пообщаться с админом сервера, который все это настраивал, и у кого есть полный доступ ко всем файлам?

Serge10 ★★ ()
Ответ на: комментарий от gigantischer

этот админ -я))

Извините, но чем дальше, тем меньше я понимаю Вашу конфигурацию :(. Если Вы админ, то почему у Вас нет прямого доступа к файловой системе контейнера? И почему Вы ограничены исключительно web-интерфейсом в управлении системой?

Serge10 ★★ ()
Ответ на: комментарий от gigantischer

Уж простите за грубость, но по вашим темам, вспомнилось только одно


Головка от магнитофона.

Вы развели кучу тем по докер контейнерам. Имхо, надо все последовательно делать. Читаем документацию (долго и нудно). Проверяем на живых/виртуалках, а только потом начинать разбираться с системой контейнеров.

anc ★★★★★ ()
Последнее исправление: anc (всего исправлений: 1)