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