Могу ли я каким-то образом настроить зеркало (это лучшее слово, которое я получил) сервера, доступного в Интернете, на определенный порт моего маршрутизатора?

Вот что у меня есть:

  • Интернет-провайдер предоставляет мне статический IP-адрес (я смог настроить переадресацию портов на моем маршрутизаторе, чтобы разрешить доступ к веб-серверу в моей локальной сети из Интернета).
  • У меня есть роутер D-LINK DIR-628 с оригинальной прошивкой, если это поможет.
  • Есть интернет-сервер, который я хочу отразить. В частности, это сервер Ventrilo, который я арендую.

Чего я хочу достичь: подключение к маршрутизатору с использованием его общедоступного IP-адреса должно перенаправить подключение к серверу Ventrilo. Мне не нужен какой-либо дополнительный защищенный слой, как, например, никакая авторизация для использования этого прокси.

Причина, по которой мне это нужно: один парень не может подключиться к серверу Ventrilo (у всех остальных нет проблем с подключением). Я не знаю точную причину этого, но его провайдер не сотрудничает и не помогает ему. Поэтому я хочу настроить какое-либо зеркало / прокси на моем маршрутизаторе, чтобы он подключался с использованием IP-адреса моего маршрутизатора, и это подключение будет перенаправлено на сервер Ventrilo.

Я попытался настроить переадресацию портов, но это не позволяет перенаправлять соединения на внешние IP-адреса. Только для IP-адресов в моей локальной сети.


Основываясь на информации, предоставленной @fdmillion, я смог решить свою проблему.

Общий ответ (на случай, если вам нужно переслать только TCP):

  1. Я создал правило переадресации портов в моем маршрутизаторе, как было предложено.
  2. Я добавил маршрут в Windows с помощью команды netsh: netsh interface portproxy add v4tov4 listenport=PORT listenaddress=LAN_IP_of_Windows_Machine connectport=PORT connectaddress=Internet_IP_of_Server

Однако оказалось, что Ventrilo использует как TCP, так и UDP. К сожалению, netsh не поддерживает UDP, поддерживается только TCP. Я использовал отдельный инструмент для пересылки UDP (http://sourceforge.net/projects/pjs-passport/) и netsh для пересылки TCP. Pjs-паспорт не может пересылать TCP и UDP одновременно. Вы можете создать только одно правило для одного и того же адреса и порта для TCP или UDP.

1 ответ1

0

Вы не можете делать такие вещи только с маршрутизатором потребительского уровня.

Если вы хотите установить Linux-компьютер где-то внутри вашей сети и перенаправить на него порт, вы можете заставить Linux использовать NAT для перенаправления соединения. В то время как NAT обычно используется, чтобы разрешить нескольким машинам в сети совместно использовать один публичный IP-адрес, NAT не ограничен этим использованием и может использоваться для всех видов интересных приемов маршрутизации.

Вы также можете, если ваш маршрутизатор поддерживает его, установить альтернативную прошивку (например, OpenWRT) на своем маршрутизаторе и сделать это в маршрутизаторе. Тем не менее, даже в этом случае некоторый Linux-фон почти необходим.

Очевидно, что если вы не очень хорошо знакомы с Linux, это будет довольно значительная кривая обучения только для этой установки. Я не знаю приложений в Windows, которые могли бы сделать это, если вы не используете Windows Server; Mac OS X может сделать это с помощью встроенного брандмауэра, но я опять не уверен.

Для справки всех, кто смотрит на это, вы могли бы реализовать это следующим образом:

Public IP: 12.34.56.78
IP of destination server: 87.65.43.21
Local area NAT range: 192.168.1.0/24
IP of Linux box on LAN: 192.168.1.200
Port that should be forwarded: 1234

1. Use router controls to direct port 1234 of incoming traffic to 192.168.1.200.

2. On the Linux box, issue this command:

    iptables -t nat -A PREROUTING -p tcp -d 192.168.1.200 --dport 1234 -j DNAT --to 87.65.43.21:1234

Side note: If you are using OpenWRT or similar on a router, you would not need to forward the port as in step 1. Step 2's command would become:
    iptables -t nat -A PREROUTING -p tcp -d 12.34.56.78 --dport 1234 -j DNAT --to 87.65.43.21:1234

3. Ensure port forwarding is on:

    sysctl net.ipv4.ip_forward=1

Обратите внимание, что вы, конечно, можете возиться с вещами. Если вы хотите принимать соединения, скажем, через порт 4321, но все еще подключаться к порту 1234, вы должны изменить параметр --dport чтобы он соответствовал порту, к которому ваши клиенты должны подключаться. Аналогично, чтобы изменить порт назначения, вы должны соответствующим образом изменить параметр --to .

Если вы запутаетесь с правилами брандмауэра, iptables -t nat -F восстановит все правила, связанные с NAT, до их (пустых) значений по умолчанию.

iptables - огромный предмет, и об этом можно написать библиотеку книг. Если у вас есть опыт работы с Linux, и вы заинтересованы, https://wiki.archlinux.org/index.php/iptables и http://www.netfilter.org/documentation/HOWTO/packet-filtering-HOWTO-7.html некоторые хорошие ресурсы.

Есть и другие способы сделать то же самое - на ум приходят более классические методы проксирования. Вы можете, например, настроить SOCKS5 прокси внутри вашей сети. Конечно, в этом случае вы должны быть очень прилежны с безопасностью, так как злоупотребление открытым прокси-сервером SOCKS5 очень распространено (люди используют открытые SOCKS-серверы, чтобы победить запреты на основе IP, просто чтобы назвать один неприятный трюк.)

Надеюсь это поможет!

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .