Jak zmienić port sshd w Mac OS X?

53

Chcę zmienić, którego portu sshdużywa na serwerze Mac. Na przykład, powiedzmy od portu 22 do portu 32.

Edycja /etc/sshd_configwydaje się nie działać. Czy ktoś wie jak to zmienić? Wolałbym metodę, która jest kompatybilna ze wszystkimi wersjami OSX (lub przynajmniej jak najwięcej).

Alexander Artemenko
źródło
Zauważ też, że /usr/libexec/sshd-keygen-wrapper(pokazane na listach poniżej) może rozpocząć inny SSH niż ten podany na liście. Jeśli to zrobisz, zawsze się zacznie /usr/sbin/sshd.

Odpowiedzi:

61

Każda poprzednia odpowiedź działa (jak sugerują również Google), ale są brudne i nieeleganckie .

Właściwym sposobem zmiany portu nasłuchiwania uruchomionej obsługiwanej usługi w systemie Mac OS X jest udostępnienie zmian dedykowanym kluczom w ssh.plist

Zatem rozwiązanie jest tak proste, jak użycie numeru portu zamiast nazwy usługi.

Fragment mojego zredagowanego /System/Library/LaunchDaemons/ssh.plist:

    <key>Sockets</key>
    <dict>
            <key>Listeners</key>
            <dict>
                    <key>SockServiceName</key>
                    <string>22022</string>
                    <key>SockFamily</key>
                    <string>IPv4</string>
                    <key>Bonjour</key>
                    <array>
                            <string>22022</string>
                    </array>
            </dict>
    </dict>

Uwaga: aby móc edytować ten plik na El Capitan, Sierra i prawdopodobnie także w przyszłych wersjach, musisz wyłączyć SIP (System Integrity Protection). Zobacz Jak wyłączyć ochronę integralności systemu (SIP) [...] .

Powyższa edycja zmusi także sshd do nasłuchiwania tylko przez IPV4.

Po wprowadzeniu jakichkolwiek zmian ssh.plistplik należy ponownie załadować w następujący sposób:

sudo launchctl unload /System/Library/LaunchDaemons/ssh.plist
sudo launchctl load /System/Library/LaunchDaemons/ssh.plist

Pamiętaj, że użycie launchctl stop ...i launchctl start ...NIE spowoduje ponownego załadowania tego pliku.

Stronę podręcznika użytkownika z większą ilością informacji można znaleźć, wpisując man launchd.plistlub korzystając z tego linku .

drAlberT
źródło
3
@ Yar launchd.plist to nazwa instrukcji. Zmiana znajduje się w pliku ssh.plist w katalogu / System / Library / LaunchDaemons
Martijn Pieters
1
Zauważ, że musisz albo zrestartować maszynę, albo zrestartować usługę ssh za pomocą launchctl.
Danny Staple
5
Grr ... każda aktualizacja OS X (w tym przypadku Yosemite) odrzuca tę zmianę, wymagając ode mnie zapamiętania tego, co zrobiłem ostatni raz, aby ją naprawić i gdzie znalazłem te informacje. Dzięki za poprawkę!
Michael,
2
@Hassan, musisz uruchomić dwie instancje ssh .. tj. Dodać kolejnego Listenera z inną nazwą i wartością
SockServiceName
5
Zauważ, że w wersji El Capitan (i prawdopodobnie także w przyszłych wersjach) musisz wyłączyć SIP (System Integrity Protection) przed edycją pliku, patrz: apple.stackexchange.com/a/208481
jcfrei
17

Jeśli chcesz, aby sshd nasłuchiwał na dodatkowym porcie, możesz dodać wiele pozycji do słownika gniazd.

Przykład:

<key>Sockets</key>
<dict>
        <key>Listeners</key>
        <dict>
                <key>SockServiceName</key>
                <string>ssh</string>
                <key>Bonjour</key>
                <array>
                        <string>ssh</string>
                        <string>sftp-ssh</string>
                </array>
        </dict>
        <key>Listeners2</key>
        <dict>
                <key>SockServiceName</key>
                <string>22022</string>
        </dict>
</dict>
raimue
źródło
1
Dla jasności @Raim odnosi się do:/System/Library/LaunchDaemons/ssh.plist
Mike Causer
Jaki jest cel klucza Bonjour?
Chciałbym też wiedzieć, jaki jest cel klucza Bonjour?
Drew
Co to do cholery jest 20022?
Jamie Hutber,
1
Cel klucza Bonjour: tego opcjonalnego klucza można użyć do żądania zarejestrowania usługi w podsystemie Bonjour. Jak powiedział man launchd.plist.
Scott Willeke,
6

Z tego, co dotychczas przeczytałem (i doświadczyłem), można korzystać z trzech głównych metod:

  1. zmień ustawienie w pliku ssh.plist;
  2. zmień ustawienie w pliku / etc / services;
  3. zmień ustawienie w pliku /etc/sshd.conf.

Innym sposobem na to, który osobiście zdecydowanie wolę wszystkie i każdą z tych metod, ponieważ pozwala uniknąć bałaganu przy plikach systemowych Mac OS X, jest użycie polecenia socat do przekierowania portu 22 na dowolny port, który chcesz.

  1. Pobierz socat: http://www.dest-unreach.org/socat/download/socat-1.7.3.2.tar.gz
  2. Przenieś plik tar.gz do katalogu / usr / local / katalogu ( sudo mv ./socat-1.7.3.2.tar.gz /usr/local/bin/socat-1.7.3.2.tar.gz)
  3. Przejdź do katalogu / usr / local / bin ( cd /usr/local/bin)
  4. Rozpakuj: sudo tar -xvzf socat-1.7.3.2.tar.gz
  5. Przejdź do nieskompresowanego katalogu plików: cd ./socat-1.7.3.2
  6. Uruchom zwykłą konfigurację, make i make install, aby zainstalować socat ( sudo ./configure && sudo make && sudo make install)
  7. Przekieruj port 22 (domyślny ssh) na dowolny port, który chcesz (w następującym przykładzie, 2222), używając właściwej opcji, wysyłając wywołanie socat ( sudo socat TCP-LISTEN:2222,reuseaddr,fork TCP:localhost:22)

Gotowe, a pliki systemowe Mac OS X pozostały niezmienione. Ponadto ta metoda działa nie tylko w systemie Snow Leopard, ale we wszystkich wersjach systemu Mac OS X, a także na każdym komputerze, na którym może działać socat.

Ostatnią rzeczą, którą musisz zrobić, jeśli używasz routera / zapory sieciowej, jest dołączenie prawidłowych poleceń przekierowania do routera / zapory ogniowej.

Ponadto pozwala uniknąć utknięcia w debacie, czy metoda ssh.plist, metoda usług lub inna metoda jest lepsza, bardziej elegancka lub gorsza od drugiej.

Możesz również łatwo przygotować skrypt, który uruchamia się przy uruchomieniu, aby odbudować przekierowanie socat przy każdym ponownym uruchomieniu komputera. Umieść to w /Library/LaunchDaemons/com.serverfault.sshdredirect.plist:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.serverfault.sshdredirect</string>
    <key>KeepAlive</key>
    <dict>
        <key>NetworkState</key>
        <true/>
    </dict>
    <key>RunAtLoad</key>
    <true/>
    <key>ProgramArguments</key>
    <array>
        <string>/usr/local/bin/socat</string>
        <string>TCP-LISTEN:2222,reuseaddr,fork</string>
        <string>TCP:localhost:22</string>
    </array>
</dict>
</plist>

Użyj, sudo launchctl load -w /Library/LaunchDaemons/com.serverfault.sshdredirect.plistaby go załadować. Będzie automatycznie ładował się przy kolejnych restartach.

Ponadto można także poprawić bezpieczeństwo, ustawiając (i) zaporę sieciową tak, aby blokowała wszelkie połączenia do portu 22 z dowolnego interfejsu innego niż sprzężenie zwrotne (127.0.0.1) i (ii) wprowadziła podobną zmianę w pliku sshd.conf, aby Ssh nasłuchuje tylko w pętli zwrotnej.

Cieszyć się.

Cedric
źródło
2
Edycja /etc/servicespliku jest złym pomysłem - wpłynie to na takie rzeczy, jak logowanie za pomocą klucza SSH na konta github lub bitbucket, które będą próbowały połączyć się z nowym portem i nie powiedzie się.
ccpizza
1
Powinieneś zbudować w katalogu scratch. Następnie użyj, sudoaby zainstalować. Nie powinieneś budować z podwyższonymi uprawnieniami.
Działa to również w El Capitan, gdzie SIP utrudnia zmianę /System/Library/LaunchDaemons/ssh.plist. Ale w El Capitan klucz „NetworkState” jest przestarzały; Sugeruję <key>KeepAlive</key><true/>.
RTS - poczytaj o Monice Cellio
z najnowszą wersją osx sierra działająca wersja to: gist.github.com/shanmuha/d97e9f1abdaf1c9b804f748f332a3ffd
Shanmu
1

Nie widziałem tego dobrze udokumentowanego na stronie podręcznika, ale jeśli nie chcesz nic więcej robić niż dodać dodatkowego słuchacza, możesz użyć tablicy słuchaczy i mieć dodatkowy dyktand. Nie wymaga to edytowania / etc / services, jeśli używasz portu bezpośrednio (ale pamiętaj, aby otworzyć port w zaporze!)

    <key>Listeners</key>
    <array>
    <dict>
        <key>Bonjour</key>
        <array>
            <string>ssh</string>
            <string>sftp-ssh</string>
        </array>
        <key>SockServiceName</key>
        <string>ssh</string>
    </dict>
    <dict>
        <key>SockServiceName</key>
        <string>22222</string>
    </dict>
    </array>
Adam Prescott
źródło
1
Jaki jest cel klucza Bonjour?
@ jww Myślę, że to błąd kopiowania i wklejania od czasu, gdy składałem to razem od innych słuchaczy.
Adam Prescott,
Chciałbym też wiedzieć, jaki jest cel klucza Bonjour?
Drew
1
Cel klucza Bonjour: tego opcjonalnego klucza można użyć do żądania zarejestrowania usługi w podsystemie Bonjour. Jak powiedział man launchd.plist.
Scott Willeke,