В настоящее время у меня настроена сеть OpenVPN в режиме «tap», в которой виртуальная машина Google выступает в качестве сервера, а клиент Raspberry Pi 3 запускает сервер Minecraft.
В настоящее время пользователи могут подключиться к серверу Minecraft, запустив клиент OpenVPN на своих компьютерах и введя OpenVPN IP Pi в клиент Minecraft (например, 10.8.0.2).
Однако я хочу иметь возможность разрешить пользователям получать доступ к серверу Minecraft, используя внешний IP Google VM (без необходимости установки OpenVPN). Пользователи не могут использовать адрес Pi напрямую из-за двухслойного NAT провайдера.
Я пробовал следоватьэтот ответ. В частности я выполнил:
iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 25565 -j DNAT --to-destination 10.8.0.2:25565
iptables -A FORWARD -p tcp -d 10.8.0.2 --dport 25565 -j ACCEPT
iptables -A POSTROUTING -t nat -s 10.8.0.2 -o eth0 -j MASQUERADE
Интерфейсы ВМ — eth0 и tap0. Переадресация IP включена в консоли.
Брандмауэр сервера настроен на разрешение трафика с 0.0.0.0/0 TCP:25565 и UDP:25565
Однако при попытке подключения с использованием внешнего IP-адреса виртуальной машины Google я получаю сообщение «Время ожидания соединения истекло». NMAP сообщает мне, что порт 25565 «отфильтрован».
Дополнительная информация, iptables-save
:
# Generated by iptables-save v1.6.0 on Thu Sep 26 11:42:02 2019
*nat
:PREROUTING ACCEPT [106:35257]
:INPUT ACCEPT [75:15902]
:OUTPUT ACCEPT [111:6692]
:POSTROUTING ACCEPT [6:328]
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -i eth0 -p udp -m udp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -i eth0 -p udp -m udp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -d 35.197.47.71/32 -p tcp -m tcp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -d 35.197.47.71/32 -p udp -m udp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A PREROUTING -i eth0 -p tcp -m tcp --dport 25565 -j DNAT --to-destination 10.8.0.3:25565
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.8.0.3/32 -o eth0 -j MASQUERADE
-A POSTROUTING -s 10.8.0.2/32 -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Sep 26 11:42:02 2019
# Generated by iptables-save v1.6.0 on Thu Sep 26 11:42:02 2019
*filter
:INPUT ACCEPT [1822:367429]
:FORWARD ACCEPT [13:700]
:OUTPUT ACCEPT [1610:231716]
-A FORWARD -d 10.8.0.2/32 -p tcp -m tcp --dport 25565 -j ACCEPT
COMMIT
# Completed on Thu Sep 26 11:42:02 2019
--list-rules
:
-P INPUT ACCEPT
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A FORWARD -d 10.8.0.3/32 -p tcp -m tcp --dport 25565 -j ACCEPT
решение1
Я думаю, проблема может быть в том, что вы не маскируете пакеты, которые направляются на Pi, и не весь трафик с Pi направляется в туннель.
Это означает, что пакеты из внешнего мира могут достигать Pi, но когда Pi отвечает им, ответные пакеты не направляются сначала в виртуальную машину Google (а, вероятно, напрямую отправляются клиентам (например, через его интернет-шлюз), что, следовательно, не будет распознано клиентами).
Кроме того, если на Pi установлен брандмауэр, фильтрующий входящие пакеты из туннеля (таким образом, что принимаются только пакеты от других хостов VPN), пакеты, которые не замаскированы под пакеты от виртуальной машины, будут отфильтрованы.
Поэтому вам может понадобиться:
iptables -t nat -A POSTROUTING -d 10.8.0.x -o tap0 -j MASQUERADE
решение2
Вы можете открыть порт в меню облака брандмауэра Google. И после проверки, если это не сработает, я скажу вам другой вариант.
С уважением