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       

Я не очень понял, как и для чего у Вас туннель поднят. Но по поводу Вашего вопроса - просто оставляете доступ из сети 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 ★★ ()