У меня есть сервер с 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
Главный недостаток описанного выше подхода - ваш сервер все равно может случайно открыться.
Выберите любой бесплатный выделенный частный адрес, например 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