ป้องกันการเชื่อมต่อ SSH สูญหายหลังจากเข้าสู่ VPN บนเครื่องเซิร์ฟเวอร์


14

ฉันพบปัญหาที่ไม่สามารถจัดการได้ เมื่อฉันเข้าสู่ VPS ผ่าน SSH และพยายามสร้างการเชื่อมต่อ VPN ใน VPS นั้นการเชื่อมต่อ SSH ระหว่าง VPS และเครื่องของฉันจะสูญหาย ฉันคิดว่าเป็นเพราะการกำหนดเส้นทางเปลี่ยนไปโดยการตั้งค่า VPN จะป้องกันได้อย่างไร


สิ่งที่เกี่ยวกับการเชื่อมต่อกับ SSH หลังจากก่อตั้ง VP? : p คุณถูกต้องที่สิ่งนี้เกิดขึ้นเนื่องจาก VPN เขียนทับเส้นทางการจัดเส้นทาง สิ่งที่คุณสามารถทำได้คือทำให้เส้นทางเดิมไม่ถูกแตะต้องและเพิ่มเส้นทาง VPN พิเศษ (เว้นแต่คุณต้องการใช้ VPS เป็นพร็อกซีนั่นเป็นอีกเรื่องหนึ่ง) ลูกค้าใดที่คุณใช้
Nikolaidis Fotis

คุณหมายถึงอะไรด้วย "พยายามสร้างการเชื่อมต่อ VPN บน VPS นั้น" คุณกำลังเชื่อมต่อจากเครื่องของคุณไปยังเซิร์ฟเวอร์ Openvpn ใน VPS หรือไม่ VPS ของคุณเชื่อมต่อกับเซิร์ฟเวอร์ Openvpn ที่ทำงานบนโฮสต์ที่สามหรือไม่ ในกรณีนี้การเชื่อมต่อ VPN ดังกล่าวกำลังส่งคืนเส้นทางบางเส้นทางหรือไม่ นอกจากนี้โปรดยืนยันว่าไม่มีการแปล NAT เพื่อเข้าถึง VPS ของคุณ (ที่อยู่ IP ที่กำหนดค่าบนอินเทอร์เฟซเหมือนกันกับที่คุณระบุในการเชื่อมต่อ SSH หรือไม่
Damiano Verzulli

@NikolaidisFotis ฉันไม่สามารถเชื่อมต่อได้เนื่องจาก VPN กำลังทำงาน ฉันใช้ไคลเอนต์ openvpn มี--route-noexecตัวเลือกในการข้ามเส้นทางที่เซิร์ฟเวอร์ผลัก แต่อย่างที่คุณพูดถึงมันไม่ได้ช่วยอะไรเมื่อฉันต้องการใช้ VPN เป็นพร็อกซี ...
mic22

@DamianoVerzulli ตัวเลือกที่สองใช่มีการผลักดันเส้นทาง (แต่ฉันคิดว่าจะต้องทำเพราะฉันต้องการให้ VPN ทำตัวเหมือนพร็อกซีเพื่อปิดบังที่อยู่ IP ดั้งเดิมของเครื่อง) และไม่มี NAT
mic22

คำตอบ:


6

คุณต้องเพิ่มroute-nopullตัวเลือก (และลบredirect-gatewayถ้ามี) ไปยังไฟล์กำหนดค่าของไคลเอนต์ OpenVPN ของคุณใน VPS ของคุณ

วิธีนี้จะเชื่อมต่อกับเซิร์ฟเวอร์ VPN จะไม่แก้ไขเส้นทางใด ๆ ใน VPS ของคุณดังนั้นคุณจะสามารถตั้งค่าเส้นทางที่คุณต้องการได้ด้วยตัวเอง


เฮ้ขอบคุณสำหรับคำแนะนำนี้ แต่ตอนนี้ฉันไม่สามารถเข้าถึงอินเทอร์เน็ตผ่าน tun0 ได้ ฉันคิดว่าฉันไม่มีเกตเวย์ ความคิดใด ๆ วิธีการเพิ่มเกตเวย์สำหรับ tun0? ส่วนที่เกี่ยวข้องของ ifconfig:inet addr:10.56.10.6 P-t-P:10.56.10.5 Mask:255.255.255.255
Housemd

คุณต้องเพิ่มเส้นทางไปยังเซิร์ฟเวอร์ VPN ด้วยตัวเองผ่านเกตเวย์ ISP เริ่มต้นของคุณจากนั้นเพิ่มเกตเวย์เริ่มต้นผ่าน 10.56.10.5 สำหรับการรับส่งข้อมูลอื่น ๆ ทั้งหมด
Anubioz

ฉันขอโทษอะไร ฉันไม่รู้ว่าคุณเพิ่งพูดอะไร คุณยกตัวอย่างได้ไหม
Housemd

ให้ฉันชี้แจง - ฉันไม่ต้องการเส้นทางเริ่มต้นที่จะผ่าน tun0 แต่ฉันต้องการ tun0 เพื่อให้สามารถเข้าถึงอินเทอร์เน็ตได้
Housemd

@Housemd hm คุณจำเป็นต้องเชื่อมต่ออินเทอร์เน็ตผ่าน tun0 ด้วยตัวคุณเองหรือคุณต้องการให้ลูกค้าเชื่อมต่อผ่าน tun0 จากที่อื่นเพื่อให้สามารถใช้อินเทอร์เน็ตได้?
Anubioz

4

ลองพิจารณาสถานการณ์ต่อไปนี้:

  1. VPS ของคุณมีอินเตอร์เฟซอีเธอร์เน็ตเดียวกำหนดค่าด้วยที่อยู่ IP 4.3.2.1/24;
  2. VPS ของคุณสามารถเข้าถึงอินเทอร์เน็ตผ่านเกตเวย์เริ่มต้น 4.3.2.254
  3. VPS ของคุณยังไม่ได้เปิดใช้งานการเชื่อมต่อ OpenVPN ดังนั้นจึงไม่มีอินเตอร์เฟสอินเตอร์เฟส tun ที่ใช้งานอยู่

ในสถานการณ์ดังกล่าวจากเครื่องของคุณ (สมมติว่าเครื่องของคุณคือ 9.8.7.6/24 พร้อม def-gw 9.8.7.254) คุณสามารถสร้างการเชื่อมต่อ SSH เป็น 4.3.2.1 ได้สำเร็จ ดังนั้นทั้งโฮสต์ 4.3.2.1 และ 9.8.7.6 สามารถเข้าถึงซึ่งกันและกันได้สำเร็จ

ตอนนี้ด้วยการเชื่อมต่อ SSH ที่จัดตั้งขึ้นมาสมมุติว่า:

  1. คุณเรียกใช้การเชื่อมต่อ OpenVPN จาก VPS 4.3.2.1 ของคุณ
  2. ดังนั้นอินเทอร์เฟซ tun0 ใหม่จะได้รับการกำหนดค่าแบบ Dinamically (สมมติว่ามันจะถูกกำหนด 10.10.10.2 IP พร้อม 10.10.10.1 PTP)

ที่เวทีนี้:

  • หากไม่มีการส่งเส้นทางจากเซิร์ฟเวอร์ OpenVPN ระยะไกลไปยัง VPS ในพื้นที่ของคุณจะไม่มีการเปลี่ยนแปลงใด ๆ ในแง่ของการกำหนดเส้นทางและการเชื่อมต่อ SSH ของคุณจะอยู่รอดได้โดยไม่มีปัญหาเลย ในกรณีนี้การรับส่งข้อมูลภายใน VPN เพียงอย่างเดียวคือสิ่งที่ส่งไปยังเซิร์ฟเวอร์ OpenVPN ระยะไกล (10.10.10.1)

  • ถ้า OpenVPN เซิร์ฟเวอร์ระยะไกลจะผลักดันกลับเส้นทางบางส่วนและโดยเฉพาะถ้า VPS เริ่มต้นเกตเวย์จะถูกแทนที่ด้วย 10.10.10.1 (ระยะไกลปลายทาง OpenVPN) แล้วคุณจะมีปัญหา ในกรณีนี้คุณกำลังทำการรับส่งข้อมูล IP ทั้งหมดที่ส่งออก (ยกเว้น OpenVPN เอง) ภายใน VPN

ในกรณีที่สองนี้ (แทนที่ def-gw ทันทีหลังจากสร้างการเชื่อมต่อ VPN) การเชื่อมต่อ SSH ก่อนหน้าของคุณจะ "หยุด" เนื่องจากการกำหนดเส้นทางแบบอสมมาตร:

  • การรับส่งข้อมูลจากเครื่องของคุณ (9.8.7.6) ไปยัง VPS (4.3.2.1) จะไหลผ่านเส้นทางก่อนหน้าไม่เคยเปลี่ยนเส้นทาง
  • การรับส่งข้อมูลจาก VPS (4.3.2.1) ไปยังเครื่องของคุณ (9.8.7.6):
    • หากไม่มี VPN (ตอนแรก) จะถูกส่งผ่านเกตเวย์ 4.3.2.254
    • หลังจากการสร้างลิงก์ VPN พร้อมการเปลี่ยน def-gw ที่เกี่ยวข้องแล้วจะถูกส่งผ่าน VPN (10.10.10.1)

กล่าวอีกนัยหนึ่ง: ทันทีที่มีการสร้างลิงก์ VPN เส้นทางการส่งคืนของคุณจาก VPS ไปยังเครื่องของคุณกำลังจะเปลี่ยนและ ... มันไม่ได้เป็นสิ่งที่ดี เส้นทางและเพียงวางแพ็กเก็ต)

นอกจากนี้มีโอกาสสูงที่เซิร์ฟเวอร์ OpenVPN ระยะไกลของคุณทำหน้าที่เป็น NAT-box: ทราฟฟิกทั้งหมดที่มาจาก VPN จะถูก NATted ด้วย IP-Address สาธารณะของ OpenVPN Server ระยะไกล หากสิ่งนี้เป็นจริงมากกว่าสิ่งไม่มีอีกแล้ว ... "ไม่ดี" แต่แน่นอนว่า "ไม่ดี" สำหรับการเชื่อมต่อ SSH ของคุณ: ส่งคืนการรับส่งข้อมูลนอกเหนือจากการกลับไปตามเส้นทางอื่นกำลังกลับมาที่เครื่องของคุณด้วย IP ต้นทางอื่น (หนึ่งในอินเตอร์เฟสสาธารณะของเซิร์ฟเวอร์ VPN)

วิธีแก้ปัญหานี้

ค่อนข้างง่ายอย่างแน่นอน

เพียงแค่สั่งให้เซิร์ฟเวอร์ VPS ของคุณไม่กำหนดเส้นทางการรับส่งข้อมูลไปยังเครื่องของคุณตาม VPN แต่ให้ใช้เส้นทางก่อนหน้าแทน มันควรจะง่ายพอ ๆ กับการเพิ่มก่อนเริ่ม OpenVPN:

     route add -host 9.8.7.6 gw 4.3.2.254

ที่อยู่:

  • 9.8.7.6 เป็นที่อยู่ IP สาธารณะของเครื่องของคุณ
  • 4.3.2.254 เป็นเกตเวย์เริ่มต้นดั้งเดิมของ VPS ของคุณ

ป.ล. : โดยการให้คำถามที่ละเอียดมากขึ้นคุณจะได้คำตอบที่รวดเร็วกว่า :-)


ขอบคุณสำหรับคำตอบของคุณ @DamianoVerzulli! เกตเวย์เริ่มต้นไม่ได้ระบุไว้ route addคำสั่งด้วยผลตอบแทน 0.0.0.0 gw ดังกล่าวSIOCADDRT: Invalid argument
mic22

นั่นคือสิ่งที่ฉันได้รับหลังจากการเชื่อมต่อ openvpn[server] Peer Connection Initiated with [AF_INET]64.251.27.139:443; TUN/TAP device tun0 opened; do_ifconfig, tt->ipv6=0, tt->did_ifconfig_ipv6_setup=0; /sbin/ip link set dev tun0 up mtu 1500; /sbin/ip addr add dev tun0 10.200.1.251/22 broadcast 10.200.3.255; ERROR: Linux route add command failed: external program exited with error status: 2
mic22

@ mic22: ฉันสงสัยว่าจะไม่ระบุ def-gw ใน VPS ของคุณอย่างไรในกรณีนี้ VPS ดังกล่าวไม่สามารถเข้าถึงสิ่งใดนอกซับเน็ตท้องถิ่น (และนี่หมายความว่าทั้งสองเครื่องของคุณ - สามารถเชื่อมต่อผ่าน SSH - และเซิร์ฟเวอร์ OpenVpn - หากสามารถสร้าง VPN ได้ควรเป็น "ระดับท้องถิ่น" และไร้ประโยชน์เช่นนี้!) BTW: เมื่อคุณเชื่อมต่อผ่าน SSH คุณสามารถรับ def-gw ด้วย "netstat -rn" (บรรทัดที่เริ่มต้นด้วย 0.0.0.0 คอลัมน์ที่สอง)
Damiano Verzulli

netstat -rnผล0.0.0.0 0.0.0.0 0.0.0.0 U 0 0 0 venet0VPS ที่ฉันใช้เป็นตัวเลือกพื้นฐาน OVH กับเซิร์ฟเวอร์ Ubuntu 14.04 บนเครื่อง
mic22

ifconfigและnetstat -rnเอาท์พุท: goo.gl/TEZ61q
mic22

0

สิ่งนี้สามารถช่วย:

ใส่TCPKeepAlive=yesในของคุณ/etc/ssh/sshd_config

จาก

man sshd_config | less +/'^ *TCPKeepAlive'

TCPKeepAlive

ระบุว่าระบบควรส่งข้อความ TCP keepalive ไปอีกด้านหนึ่งหรือไม่ หากพวกเขาถูกส่งตายของการเชื่อมต่อหรือความผิดพลาดของหนึ่งในเครื่องจะสังเกตเห็นได้อย่างถูกต้อง อย่างไรก็ตามนี่หมายความว่าการเชื่อมต่อจะตายหากเส้นทางหยุดชั่วคราวและบางคนพบว่ามันน่ารำคาญ ในทางตรงกันข้ามถ้า TCP keepalives ไม่ถูกส่งเซสชันอาจค้างบนเซิร์ฟเวอร์โดยไม่มีกำหนดปล่อยผู้ใช้ `` ghost '' และใช้ทรัพยากรเซิร์ฟเวอร์

ค่าเริ่มต้นคือyes'' (to send TCP keepalive messages), and the server will notice if the network goes down or the client host crashes. This avoids infinitely hanging sessions. To disable TCP keepalive messages, the value should be set to''


ฉันได้TCPKeepAliveตั้งค่าตัวเลือกไว้แล้วyesดังนั้นจึงไม่ใช่วิธีที่เหมาะสม
mic22

0

ฉันมีปัญหานี้และลองวิธีแก้ปัญหาที่แนะนำทั้งหมดและยังคงปัญหาของฉันไม่ได้รับการแก้ไข!

หลังจากการแก้ปัญหาด้วยความพยายามหลายครั้งฉันใช้screenคำสั่ง (ไคลเอนต์ VPN ของฉันคือ cisco-any-connect)

$ screen -R VPN
$ openconnect -b "your server"

หลังจากให้ข้อมูลประจำตัวของคุณกด ctrl + a + d ทันทีและกลับสู่เซสชันของคุณ


0

โดยส่วนตัวแล้วฉันต้องการเชื่อมต่อกับ SSH ทั้งหมดเพื่อกำหนดเส้นทางผ่าน VPN ในกรณีของการเชื่อมต่อ ssh ที่ใช้งานอยู่ก่อนที่ VPN จะถูกสร้างขึ้นมันจะต้องทำการเชื่อมต่อใหม่เนื่องจากการเปลี่ยนเส้นทาง

ฉันแนะนำให้ใช้autossh ภายใต้การกำหนดค่าไคลเอนต์ ssh ของคุณเพียงแค่เพิ่ม.ssh/config

Host *
   ServerAliveInterval 300
   ServerAliveCountMax 2
   BatchMode yes
  • BatchModeย่อมาจากการเชื่อมต่ออัตโนมัติ
  • ServerAliveย่อมาจาก Keeping Alive

-1

หลังจากเชื่อมต่อ VPN แล้วการยกเลิกการเชื่อมต่อ ssh จะเกิดขึ้นเนื่องจากปริมาณการใช้งาน ssh จากเซิร์ฟเวอร์ไปยังเซิร์ฟเวอร์ VPN ดังนั้นเพื่อหลีกเลี่ยงปัญหานี้ให้รันคำสั่งต่อไปนี้ก่อนเชื่อมต่อ VPN

เพิ่มเส้นทาง - โฮสต์ - เครื่องของคุณ - สาธารณะ - ip gw เซิร์ฟเวอร์ - gatway-ip dev eth0

your-machine-public-ip: IP ของเครื่องของคุณจากที่ที่คุณกำลังทำ SSH Server-gatway-ip: IP ของ Gatway / เราเตอร์ของเซิร์ฟเวอร์นั้น

คำสั่งดังกล่าวจะเปลี่ยนเส้นทางการรับส่งข้อมูลผ่านเกตเวย์ที่กำหนดไม่ใช่ผ่านเซิร์ฟเวอร์ VPN


นี่เป็นความสับสนและภาษาดูเหมือนจะย้อนกลับ คุณไม่ต้องการเพิ่มเส้นทางด้วยที่อยู่ IP ของเป้าหมาย SSH และเกตเวย์เริ่มต้นของเวิร์กสเตชันในเครื่องใช่หรือไม่
rmalayter
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.