Назад | Перейти на главную страницу

Как сделать 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

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

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

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

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

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

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


If you are looking for stable and reliable solution for protected special-purpose server staff then I recommend the following way:

Выберите любой бесплатный выделенный частный адрес, например 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