Как сделать httpd доступным только через VPN?

У меня есть сервер с запущенным PPTP, который должен запускать httpd (nginx), доступный только через VPN. Я также использую несколько других httpds, которые не должны работать в VPN.

таблица маршрутизации

Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         x.x.x.x         0.0.0.0         UG    0      0        0 bond0
x.x.x.x         x.x.x.x         255.255.255.255 UGH   0      0        0 bond0
x.x.x.x         0.0.0.0         255.255.255.255 UH    0      0        0 ppp0
x.x.x.x         0.0.0.0         255.255.255.248 U     0      0        0 bond0
x.x.x.x         0.0.0.0         255.255.0.0     U     1008   0        0 bond0

когда я пингую mydomain.com (это должно работать с VPN)

ping mydomain.com
PING mydomain.com (x.x.x.x) 56(84) bytes of data.
^C
--- mydomain.com ping statistics ---
32 packets transmitted, 0 received, 100% packet loss, time 31248ms

но я могу видеть пакеты в tcpdump -vv -i ppp0

15:21:09.543764 IP (tos 0x0, ttl 52, id 37313, offset 0, flags [DF], proto ICMP (1), length 84)
    cable-x.x.x.x.dynamic.provider.com > anon-60-160.vpn.ipredator.se: ICMP echo request, id 4652, seq 8, length 64

2 ответа

Вероятно, вы можете настроить этот конкретный экземпляр nginx для прослушивания только на интерфейсе PPTP.

В документации для модуля http_core указана директива listen, позволяющая nginx прослушивать только определенный адрес и / или порт.

listen <IP of VPN>:<port> на примере nginx, который должен работать на VPN должен быть в порядке

Самый простой способ сделать это - запустить сервер на выделенном порту и отклонить запросы от интерфейсов, отличных от ppp для этого порта:

iptables -A INPUT -i ! ppp+ -p tcp --dport <protected-port> -j REJECT

Главный недостаток вышеуказанного подхода - ваш сервер все равно может стать случайно открытым.


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

Выберите любой бесплатный выделенный частный адрес, скажем 10.255.255.1,

Настройте внутренний интерфейс виртуального крана, используя этот адрес.

# cat > ifcfg-tap0
DEVICE=tap0
TYPE=Tap
IPADDR=10.255.255.1
NETMASK=255.255.255.255
ONBOOT=yes

При желании отключите proxy-arp в /etc/sysctl.conf если не нужно:

net.ipv4.conf.default.proxy_arp=0

Выберите выделенный порт для запуска вашего http-сервера, скажем 8888,

Свяжите свой сервер с выделенным IP / портом:

listen 10.255.255.1:8888

Ограничить доступ к 10.255.255.1 (локально или только из VPN):

-I INPUT -p ip -s 10.255.255.1 -j ACCEPT
-I INPUT -i ! ppp+ -p ip -d  10.255.255.1 -j REJECT

Основная работа была проделана. Все приложения, связанные исключительно с 10.255.255.1, доступны только для внутреннего использования или с использованием VPN.

Но теперь вам нужно позаботиться о маршрутизации до 10.255.255.1 на стороне клиента. Вы можете избежать этого и сделать свой http-сервер доступным через VPN с любым IP-адресом, который вы обычно используете для доступа к хосту:

iptables -t nat -A PREROUTING -i ppp+ -p tcp --dport 8888 -d <normal_server_address> -j DNAT --to 10.255.255.1:8888
Другие вопросы по тегам