วิธีการเปลี่ยนพอร์ต sshd บน Mac OS X


53

ฉันต้องการเปลี่ยนพอร์ตที่sshdใช้บนเซิร์ฟเวอร์ Mac ตัวอย่างเช่นสมมุติจากพอร์ต 22 ถึงพอร์ต 32

การแก้ไข/etc/sshd_configดูเหมือนจะไม่ทำงาน ไม่มีใครรู้วิธีการเปลี่ยนหรือไม่ ฉันต้องการวิธีที่เข้ากันได้กับ OSX ทุกรุ่น (อย่างน้อยก็มากที่สุด)


นอกจากนี้โปรดทราบว่า/usr/libexec/sshd-keygen-wrapper(แสดงใน plists ด้านล่าง) สามารถเริ่ม SSH ที่แตกต่างจากที่ระบุไว้ใน plist เอง /usr/sbin/sshdหากคุณแมวมันจะเริ่มต้น

คำตอบ:


61

ทุกคำตอบก่อนหน้านี้ใช้งานได้ (ตามที่ Google แนะนำเช่นกัน) แต่คำเหล่านั้นสกปรกและไม่เหมาะสม

วิธีที่ถูกต้องในการเปลี่ยนพอร์ตการรับฟังสำหรับบริการที่จัดการกับ launchd บน Mac OS X คือการทำให้การเปลี่ยนแปลงคีย์เฉพาะพร้อมใช้งาน ssh.plist

ดังนั้นการแก้ปัญหาจึงเป็นเรื่องง่ายเหมือนการใช้หมายเลขพอร์ตแทนชื่อบริการ

ข้อความที่ตัดตอนมาจากการแก้ไขของฉัน/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>

หมายเหตุ:เพื่อให้สามารถแก้ไขไฟล์นี้ใน El Capitan, Sierra และเวอร์ชันในอนาคตได้เช่นกันคุณต้องปิดการใช้งาน SIP (การป้องกันความสมบูรณ์ของระบบ) ดูฉันจะปิดการใช้งานการป้องกันความสมบูรณ์ของระบบ (SIP) [... ]ได้อย่างไร

การแก้ไขข้างต้นจะบังคับ sshd ให้ฟังผ่าน IPV4 เท่านั้น

หลังจากทำการเปลี่ยนแปลงใด ๆssh.plistแล้วไฟล์จะต้องโหลดใหม่ดังต่อไปนี้:

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

โปรดทราบว่าการใช้launchctl stop ...และlaunchctl start ...จะไม่โหลดไฟล์นี้อีกครั้ง

สามารถดู man page ที่มีข้อมูลเพิ่มเติมโดยการพิมพ์man launchd.plistหรือใช้ลิงค์นี้


3
@Yar launchd.plist เป็นชื่อของคู่มือ การเปลี่ยนแปลงอยู่ในไฟล์ ssh.plist ใน / ระบบ / ห้องสมุด / LaunchDaemons
Martijn Pieters

1
ฉันทราบว่าคุณต้องรีสตาร์ทเครื่องหรือเริ่มบริการ ssh ใหม่ด้วย launchctl
Danny Staple

5
Grr ... การอัปเกรด OS X ทุกครั้ง (โยเซมิตีในกรณีนี้) ยกเลิกการเปลี่ยนแปลงนี้ทำให้ฉันต้องจำสิ่งที่ฉันทำครั้งสุดท้ายเพื่อแก้ไขและที่ฉันพบข้อมูลนี้ ขอบคุณสำหรับการแก้ไข!
Michael

2
@Hassan คุณต้องเริ่มต้นสอง ssh อินสแตนซ์ .. เช่นเพิ่ม Listener อื่นที่มีชื่อและค่า SockServiceName ที่แตกต่างกัน
drAlberT

5
โปรดสังเกตว่าในเวอร์ชัน El Capitan (และอาจเป็นรุ่นในอนาคตเช่นกัน) คุณต้องปิดใช้งาน SIP (การป้องกันความสมบูรณ์ของระบบ) ก่อนที่คุณจะสามารถแก้ไขไฟล์ได้โปรดดู: apple.stackexchange.com/a/208481
jcfrei

17

หากคุณต้องการ sshd เพื่อฟังพอร์ตเพิ่มเติมคุณสามารถเพิ่มหลายรายการในพจนานุกรม Sockets

ตัวอย่าง:

<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>

1
เพื่อความชัดเจน @Raim หมายถึง:/System/Library/LaunchDaemons/ssh.plist
Mike Causer

จุดประสงค์ของกุญแจ Bonjour คืออะไร?

ฉันก็ชอบที่จะรู้เช่นกันจุดประสงค์ของกุญแจ Bonjour คืออะไร?
ดึง

อะไรคือ 20022
Jamie Hutber

1
วัตถุประสงค์ของคีย์ Bonjour: คีย์ทางเลือกนี้สามารถใช้เพื่อขอให้บริการลงทะเบียนกับระบบย่อย Bonjour man launchd.plistอย่างที่บอกว่าโดย
Scott Willeke

6

จากสิ่งที่ฉันอ่าน (และมีประสบการณ์) จนถึงมีสามวิธีหลักที่สามารถใช้:

  1. เปลี่ยนการตั้งค่าในไฟล์ ssh.plist
  2. เปลี่ยนการตั้งค่าในไฟล์ / etc / services
  3. เปลี่ยนการตั้งค่าในไฟล์ /etc/sshd.conf

อีกวิธีในการทำซึ่งโดยส่วนตัวแล้วฉันชอบวิธีการเหล่านี้ทั้งหมดเพราะหลีกเลี่ยงการสับสนกับไฟล์ระบบ Mac OS X คือการใช้ socat เพื่อเปลี่ยนเส้นทางพอร์ต 22 ไปยังพอร์ตที่คุณต้องการ

  1. ดาวน์โหลด socat: http://www.dest-unreach.org/socat/download/socat-1.7.3.2.tar.gz
  2. ย้ายไฟล์ tar.gz ไปยัง / usr / local / directory ( sudo mv ./socat-1.7.3.2.tar.gz /usr/local/bin/socat-1.7.3.2.tar.gz)
  3. ไปที่ไดเรกทอรี / usr / local / bin ของคุณ ( cd /usr/local/bin)
  4. ยกเลิกการบีบอัด: sudo tar -xvzf socat-1.7.3.2.tar.gz
  5. ย้ายไปยังไดเรกทอรีไฟล์ที่ไม่บีบอัด: cd ./socat-1.7.3.2
  6. เรียกใช้การกำหนดค่าปกติสร้างและทำการติดตั้งเพื่อติดตั้ง socat ( sudo ./configure && sudo make && sudo make install)
  7. Redirect port 22 (default ssh) ไปยังพอร์ตใด ๆ ที่คุณต้องการ (ในตัวอย่างต่อไปนี้, 2222) โดยใช้ตัวเลือกที่ถูกต้องโดยการส่ง socat call ( sudo socat TCP-LISTEN:2222,reuseaddr,fork TCP:localhost:22)

เสร็จแล้วไฟล์ระบบ mac os x ของคุณจะไม่มีการเปลี่ยนแปลง นอกจากนี้วิธีนี้ใช้ได้กับ Snow Leopard เท่านั้น แต่ใช้ได้กับ Mac OS X ทุกรุ่นและในทุกเครื่องที่ socat อาจทำงาน

สิ่งสุดท้ายที่คุณต้องทำถ้าคุณใช้เราเตอร์ / ไฟร์วอลล์คือการรวมคำสั่งเปลี่ยนเส้นทางที่ถูกต้องในเราเตอร์ / ไฟร์วอลล์ของคุณ

นอกจากนี้ยังหลีกเลี่ยงการติดอยู่ในการอภิปรายไม่ว่าจะเป็นวิธีการ ssh.plist วิธีการบริการหรือวิธีการใด ๆ ที่ดีกว่าสง่างามหรือแย่กว่าอีก

คุณยังสามารถเตรียมสคริปต์ที่ทำงานเมื่อเริ่มต้นเพื่อสร้างการเปลี่ยนเส้นทาง socat ได้อย่างง่ายดายแต่ละครั้งที่คุณรีสตาร์ทเครื่อง วางสิ่งนี้ใน/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>

ใช้sudo launchctl load -w /Library/LaunchDaemons/com.serverfault.sshdredirect.plistในการโหลด มันจะโหลดโดยอัตโนมัติเมื่อเริ่มต้นระบบใหม่ในอนาคต

นอกจากนี้คุณยังสามารถปรับปรุงการรักษาความปลอดภัยโดย (i) การตั้งค่าไฟร์วอลล์ของคุณเพื่อบล็อกการเชื่อมต่อกับพอร์ต 22 ของคุณจากอินเทอร์เฟซอื่นนอกเหนือจากลูปแบ็ค (127.0.0.1) และ (ii) ทำการเปลี่ยนแปลงที่คล้ายกันในไฟล์ sshd.conf ของคุณ มีฟัง ssh บนลูปแบ็คเท่านั้น

สนุก.


2
การแก้ไข/etc/servicesไฟล์เป็นความคิดที่ไม่ดี - มันจะส่งผลต่อสิ่งต่าง ๆ เช่นการเข้าสู่ระบบคีย์ SSH ไปยังบัญชี github หรือ bitbucket ของคุณซึ่งจะพยายามเชื่อมต่อกับพอร์ตใหม่และล้มเหลว
ccpizza

1
คุณควรสร้างในไดเรกทอรีเริ่มต้น จากนั้นใช้sudoเพื่อติดตั้ง คุณไม่ควรสร้างด้วยสิทธิ์ระดับสูง

นอกจากนี้ยังทำงานบน El Capitan ที่ SIP ทำให้การเปลี่ยน /System/Library/LaunchDaemons/ssh.plist เป็นเรื่องยาก แต่ใน El Capitan คีย์ "NetworkState" ถูกคัดค้าน <key>KeepAlive</key><true/>ผมขอแนะนำให้
RTS - อ่านเกี่ยวกับ Monica Cellio

ด้วย osx sierra ล่าสุดรุ่นที่ใช้งานได้คือ: gist.github.com/shanmuha/d97e9f1abdaf1c9b804f748f332a3ffd
Shanmu

1

ฉันไม่เห็นเอกสารนี้ที่ใดก็ได้อย่างเหมาะสมในหน้าคน แต่ถ้าคุณไม่ต้องการทำอะไรมากไปกว่าการเพิ่มผู้ฟังคนพิเศษคุณสามารถใช้อาร์เรย์ของผู้ฟังและมีพจน์พิเศษ สิ่งนี้ไม่ต้องการการแก้ไข / etc / services หากคุณใช้พอร์ตโดยตรง (แต่อย่าลืมเปิดพอร์ตบนไฟร์วอลล์ของคุณ!)

    <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>

1
จุดประสงค์ของกุญแจ Bonjour คืออะไร?

@ jww ฉันคิดว่านั่นเป็นข้อผิดพลาดในการคัดลอกวางเมื่อฉันแก้ไขสิ่งนี้ด้วยกันจากผู้ฟังคนอื่น
Adam Prescott

ฉันก็ชอบที่จะรู้เช่นกันจุดประสงค์ของกุญแจ Bonjour คืออะไร?
ดึง

1
วัตถุประสงค์ของคีย์ Bonjour: คีย์ทางเลือกนี้สามารถใช้เพื่อขอให้บริการลงทะเบียนกับระบบย่อย Bonjour man launchd.plistอย่างที่บอกว่าโดย
Scott Willeke
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.