У меня есть внешние IPv4-IP на моем VPS. Я хочу направить один к VPN-клиенту OpenVPN (tun). Только один VPN-клиент должен использовать VPN, и я хочу направить весь трафик на мой второй внешний IP-адрес в эту VPN, чтобы получить статический адрес для некоторых служб, таких как домашний почтовый сервер. Итак, я сделал следующее:
iptables на сервере OpenVPN:
iptables -A FORWARD -s 10.8.0.0/24 -j ACCEPT # Allow forwarding for VPN
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE # Enable NAT for VPN
iptables -t nat -A PREROUTING -d 109.230.XXX.6 -j DNAT --to-destination 10.8.0.6 # route 109.230.XXX.6 to my server.home'
Если я попробую пинговать 109.230.XXX.6, tcpdump покажет:
$ tcpdump -ni tun0
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 65535 bytes
17:03:07.883564 IP 217.235.XXX.32 > 10.8.0.6: ICMP echo request, id 8969, seq 13, length 64
17:03:08.884923 IP 217.235.XXX.32 > 10.8.0.6: ICMP echo request, id 8969, seq 14, length 64
17:03:09.886750 IP 217.235.XXX.32 > 10.8.0.6: ICMP echo request, id 8969, seq 15, length 64
17:03:10.889176 IP 217.235.XXX.32 > 10.8.0.6: ICMP echo request, id 8969, seq 16, length 64
17:03:11.888974 IP 217.235.XXX.32 > 10.8.0.6: ICMP echo request, id 8969, seq 17, length 64
Ответ отправляется через eth0 - порт, подключенный к моему домашнему маршрутизатору. Выглядит это примерно так:
$ tcpdump -ni eth0 | grep reply
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
17:07:49.304936 IP 10.8.0.6 > 217.235.XXX.32: ICMP echo reply, id 8989, seq 1, length 64
17:07:50.302311 IP 10.8.0.6 > 217.235.XXX.32: ICMP echo reply, id 8989, seq 2, length 64
17:07:51.305998 IP 10.8.0.6 > 217.235.XXX.32: ICMP echo reply, id 8989, seq 3, length 64
17:07:52.302204 IP 10.8.0.6 > 217.235.XXX.32: ICMP echo reply, id 8989, seq 4, length 64
Конечно, мой домашний маршрутизатор отбрасывает пакет - его нет в таблице NAT. Итак, как настроить сервер и клиент (- мой домашний сервер), чтобы направить адрес на мой домашний сервер? У меня есть два IP-адреса с моим VPS, и я хочу использовать один для этой цели - чтобы не тратить впустую IP-адреса, не используя их.
Большое спасибо заранее!
Один из способов справиться с этим - изменить маршрут по умолчанию на VPN-клиенте, чтобы он использовал VPN-соединение в качестве шлюза по умолчанию вместо использования маршрутизатора. Если это единственное, что вы сделаете, он сильно сломается, поскольку сами инкапсулированные пакеты будут перенаправлены обратно в VPN. Поэтому, прежде чем заменить маршрут по умолчанию, вы создаете маршрут только до адреса VPN-сервера, используя свой маршрутизатор в качестве шлюза.
Еще одно улучшение, которое следует учитывать, - это устранение NAT на VPS при использовании этого конкретного общедоступного IP-адреса. Клиент VPN может сам знать свой публичный IP-адрес и не полагаться на NAT. Уловка для того, чтобы заставить это работать, заключается в том, что вместо назначения этого IP-адреса «физическому» интерфейсу на VPS он отображается только как адрес P-t-P на интерфейсе VPN. Затем вам нужно будет включить proxy_arp на «физическом» интерфейсе.