Переадресация портов на Mac Pro с macOS Sierra

Я хотел бы выполнить перенос с моего компьютера с macOS Sierra с IP-адресом 152.1.2.3 на мой NAS с адресом 192.168.2.3. В частности, я хотел бы получить доступ к веб-серверу HTTP на моем NAS по адресу 192.168.2.3/Photos. Весь трафик NAS, поступающий по HTTP, направляется в правильную папку (фотографии).

У меня включен общий доступ к Интернету, и я делюсь Ethernet-подключением моего компьютера с macOS (152.1.2.3 в Ethernet 2) к моему NAS (192.168.2.3 в Ethernet 1)

Мой NAS может видеть Интернет и получать обновления.

Я могу получить доступ к веб-серверу локально со своего компьютера, введя 192.168.2.3, и он направит меня на страницу веб-сервера по адресу 192.168.2.3/Photos.

Я просто не могу получить к нему доступ из-за пределов локальной сети.

Простое решение — подключить NAS напрямую к сети, но я не могу этого сделать из-за локальных политик.

В заключение: я хотел бы ввести следующее и быть перенаправленным на веб-сервер в NAS --> 152.1.2.3:9999

будет ли команда терминала:

rdr pass on en2 inet proto tcp from any to any port 9999 -> 198.168.2.3 port 80
Я голосую за то, чтобы закрыть этот вопрос как не по теме, потому что это проблема сети, а не проблема Apple.
@Rob - ОП использует MacPro в качестве брандмауэра / маршрутизатора - это определенно по теме.
Однако переадресация портов обсуждалась здесь, в AD, поэтому это возможный дубликат переадресации портов в macOS Sierra.
@Allan Это не (точная) копия, потому что задействован Apple Internet Sharing .

Ответы (1)

Общий доступ к Интернету в macOS (внутренне) осуществляется путем создания устройства-моста, содержащего два или более интерфейсов, активации DHCP-сервера, настройки различных правил pf и включения pf.

Чтобы распечатать все правила, необходимо выполнить следующий сценарий оболочки:

pfdump.sh:

#!/bin/bash

function pfprint() {
  if [ -n "$1" ];then
    sudo pfctl -a "$2" -s"$1" 2>/dev/null
  else
    sudo pfctl -s"$1" 2>/dev/null
  fi
}

function print_all() {

  local p=$(printf "%-40s" $1)
  (
    pfprint r "$1" | sed "s,^,r     ,"
    pfprint n "$1" | sed "s,^,n     ,"
    pfprint A "$1" | sed "s,^,A     ,"
  ) | sed "s,^,$p,"

  for a in `pfprint A "$1"`; do
    print_all "$a"
  done
}

print_all

По умолчанию pf отключен со следующим дампом pf:

                                        r     scrub-anchor "com.apple/*" all fragment reassemble
                                        r     anchor "com.apple/*" all
                                        n     nat-anchor "com.apple/*" all
                                        n     rdr-anchor "com.apple/*" all
                                        A       com.apple
com.apple                               r     anchor "200.AirDrop/*" all
com.apple                               r     anchor "250.ApplicationFirewall/*" all
com.apple                               A       com.apple/200.AirDrop
com.apple                               A       com.apple/250.ApplicationFirewall

После активации Internet Sharing pf включается и дамп выглядит так:

                                        r     scrub-anchor "com.apple/*" all fragment reassemble
                                        r     scrub-anchor "com.apple.internet-sharing" all fragment reassemble
                                        r     anchor "com.apple/*" all
                                        r     anchor "com.apple.internet-sharing" all
                                        n     nat-anchor "com.apple/*" all
                                        n     nat-anchor "com.apple.internet-sharing" all
                                        n     rdr-anchor "com.apple/*" all
                                        n     rdr-anchor "com.apple.internet-sharing" all
                                        A       com.apple
                                        A       com.apple.internet-sharing
com.apple                               r     anchor "200.AirDrop/*" all
com.apple                               r     anchor "250.ApplicationFirewall/*" all
com.apple                               A       com.apple/200.AirDrop
com.apple                               A       com.apple/250.ApplicationFirewall
com.apple.internet-sharing              r     scrub-anchor "base_v4" all fragment reassemble
com.apple.internet-sharing              r     anchor "base_v4" all
com.apple.internet-sharing              n     nat-anchor "base_v4" all
com.apple.internet-sharing              n     rdr-anchor "base_v4" all
com.apple.internet-sharing              A       com.apple.internet-sharing/base_v4
com.apple.internet-sharing/base_v4      r     scrub on en1 all no-df fragment reassemble
com.apple.internet-sharing/base_v4      r     scrub on bridge100 all no-df max-mss 1460 fragment reassemble
com.apple.internet-sharing/base_v4      r     scrub on bridge100 proto esp all no-df fragment reassemble
com.apple.internet-sharing/base_v4      r     pass on en1 all flags any keep state
com.apple.internet-sharing/base_v4      r     pass on en1 proto esp all no state
com.apple.internet-sharing/base_v4      r     pass on bridge100 all flags any keep state rtable 6
com.apple.internet-sharing/base_v4      n     nat on en1 inet from 192.168.2.0/24 to any -> (en1:0) extfilter ei
com.apple.internet-sharing/base_v4      n     no nat on bridge100 inet from 192.168.2.1 to 192.168.2.0/24
com.apple.internet-sharing/base_v4      n     rdr on bridge100 inet proto tcp from 192.168.2.0/24 to any port = 21 -> 127.0.0.1 port 8021

Здесь en1 — это внешний интерфейс (тот, который используется для вашей внутренней сети), а 192.168.2.0/24 — внутренняя сеть, предоставляемая DHCP-сервером. Оба могут отличаться в вашей среде.

Чтобы открыть общий доступ к внутреннему серверу с включенным Internet Sharing, вам необходимо перенаправить порт внешнего интерфейса на IP-адрес и служебный порт сервера:

Создайте правило rdr на маршрутизаторе (ваш Mac Pro), введя в Terminal.app:

sudo nano /private/etc/pf-rdr.rule

и содержание:

rdr on en1 inet proto tcp from any to 152.1.2.3 port = 9999 -> 192.168.2.3 port 80

предполагая, что en1 — это внешний интерфейс, 152.1.2.3:9999 — его IP-порт и 192.168.2.3:80 — IP-порт внутреннего сервера. Чтобы получить идентификатор устройства (и IP) вашего внешнего интерфейса, войдите ifconfigв свой Mac Pro.

Затем создайте демон запуска:

sudo nano /Library/LaunchDaemons/org.user.pfrdr.plist

с содержанием:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>Label</key>
    <string>org.user.pfrdr</string>
    <key>ProgramArguments</key>
    <array>
        <string>/sbin/pfctl</string>
        <string>-a</string>
        <string>com.apple/portforwarding</string>
        <string>-f</string>
        <string>/private/etc/pf-rdr.rule</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>/Library/Logs/org.usr.pfrdr.log</string>
    <key>StandardOutPath</key>
    <string>/Library/Logs/org.usr.pfrdr.log</string>
</dict>
</plist>

Запустите демон командой:

sudo launchctl load /Library/LaunchDaemons/org.user.pfrdr.plist

Это добавит второе правило rdr в привязку com.apple к pf и перенаправит внешний порт на внутренний хост.

Поскольку DHCP назначает IP-адреса динамически, также полезно определить фиксированный IP-адрес для внутреннего сервера:

Создайте файл bootptab на маршрутизаторе (ваш Mac Pro):

sudo nano /etc/bootptab

с содержанием:

# Bootptab file
# Section 1 -- ignored
%%
# Section 2 -- used
# Hardware types: 1=Ethernet, 6=Wireless
#                 See http://www.ietf.org/rfc/rfc1700.txt
#
# machine entries have the following format:
#
# hostname         hwtype     hwaddr         ipaddr   bootfile
your-nas-ethernet     1 c4:2c:03:3a:7f:65 192.168.2.3 boot
a-wireless-machine    6 60:33:4b:27:6c:62 192.168.2.4 boot
another-ethernet      1 00:0d:93:72:e7:96 192.168.2.2 boot

Замените MAC-адреса (hwaddr) и типы оборудования (hwtype) на подходящие для вашей среды здесь. Вы можете получить MAC-адреса, введя ifconfigсоответствующий хост. После этого перезагрузите маршрутизатор (Mac Pro).


Последствия для безопасности:

При использовании вашего Mac Pro в качестве маршрутизатора он подвергается воздействию Интернета и как таковой уязвим. Pf в том виде, в каком он запускается после включения общего доступа к Интернету, не имеет абсолютно никаких блокирующих правил . Вы должны добавить целую кучу дополнительных правил, чтобы сделать его более безопасным (и работающим).


Опубликованный вами IP-адрес принадлежит 152.1.0.0/16 — блоку IP-адресов, присвоенному Университету штата Северная Каролина (NCSU). Ваш университет мог применить меры безопасности в этой сети, которые предотвратят доступ из других сетей (или «всего» Интернета).