Proxy with SSH

Teerayut Hiruntaraporn
2 min readFeb 23, 2021

--

เนื่องด้วยมีเหตุให้ ต้องทำการเขียน API เพื่อเชื่อมต่อเข้ากับ Server ราชการที่หนึ่ง ซึ่งมีการควบคุม Access Control แบบเข้มงวด คือ สามารถเชื่อมต่อกับกับ Server ของเราบน Data Center เพียงเครื่องเดียวเท่านั้น ​โดยที่เครื่องที่ Data Center เป็น เครื่อง server ที่ไม่มี GUI ดังนั้นก็จะทำการทดสอบ API แบบสบายๆ โดยการใช้อุปกรณ์อย่าง Postman ไม่ได้สักเท่าไหร่

จริงก็มีทางเลือกแบบง่ายๆ คือการไปลง Proxy Server สักตัวที่ เครื่องใน Data Center แต่ปัญหาคือ เราต้องมาปรับระบบความปลอดภัยต่างๆ กับพื้นที่ที่ไม่ค่อยจะเพียงพอสำหรับลงโปรแกรมนัก

ดังนั้นจากคำแนะนำจากรุ่นน้องและการไปค้นๆ หน่อยนึง คิดว่าวิธีการ “บ๋อย” ผ่าน Ssh น่าจะเป็นท่าที่น่าสนใจ

โดยในครั้งนี้จะเป็นการบ๋อยโดยใช้ความสามารถที่มีอยู่แล้วใน Secure Shell คือการสร้าง Sock Server ผ่าน ssh แล้วนำเอา Sock Server นั้นมาปรับเป็น Proxy Server ภายในเครื่องตัวเอง

การทำงานของ Sock Server

คิดง่ายๆ ว่า Sock Server คือผู้แทนที่ทำงานแทนเราก็ได้ครับ โดยสิ่งที่ทำคือ รับคำสั่งจากเรา แล้วส่งไปให้กับ server ปลายทาง โดยใช้ IP ของตัวเอง ฝั่ง Server ปลายทางเมื่อได้ผลลัพธ์ก็จะคืนมาที่ Sock Server แล้วทาง Sock Server ก็จะคืนข้อมูลกลับมาหาเรานั่นเอง

ซึ่งในมุมมองของ Server ปลายทางจะเห็นแต่ ตัว Sock Server เท่านั้น ไม่จำเป็นต้องทราบว่า Laptop ของเรา ที่เป็นผู้สั่งอยู่ที่ไหน

ภาพประกอบสถานการณ์

Sock Server vs Proxy Server

จริงๆ แล้วหลักการทำงานของ Proxy Server หรือชื่อยาวๆ ที่ควรจะเป็นคือ HTTP proxy server นี่ แทบไม่ต่างกับ Sock Server เลยครับ คือเป็นผู้แทนในการส่งข้อมูลให้กับ Server ปลายทางเหมือนกัน

แต่ Proxy Server นั้นจะดูแลเฉพาะ HTTP Protocol เท่านั้น ขณะที่ Sock Server จะดูแล Protocol TCP ซึ่ง เป็น Protocol ที่อยู่ในระดับต่ำกว่า ดังนั้น Sock Server จะสนับสนุนหลายหลาย Application Layer protocol มากกว่า เช่น เราสามารถใช้ sock ในการตั้งค่าเวลาเล่นเกมส์ Online ได้

ขั้นตอนการเชื่อมต่อ Proxy ผ่าน SSH

เนื่องจาก ssh มีความสามารถพิเศษคือการที่ตัวมันเองสามารถเปิด sock server ไปหา Server ที่คุยอยู่ได้ เราจึงเอามันมาประยุกต์ใช้ในการเปิด Proxy ไปหา server ปลายทางดังนี้ครับ

1 เชื่อมต่อ ssh และเปิด sock server

$ ssh -D 12345 user@5.6.7.8

โดยที่ -D 12345 หมายถึง การเปิด TCP Port หมายเลข 12345 เพื่อให้สำหรับ Sock Server ในเครื่องของเราเอง

ซึ่งเมื่อต่อสำเร็จ เครื่องคอมพิวเตอร์ของเราจะเปิด port 12345 tcp ในเครื่องของตัวเอง เราสามารถทดสอบเชื่อมต่อ sock server ที่พึ่งสร้างมาใหม่ได้โดย พิมพ์

telnet/nc 5.6.7.8 12345

ถ้าการเชื่อมต่อค้างอยู่ตรงนั้น ก็น่าจะใจชื้นได้ว่าสามารถเปิด service ก้าวแรกไปได้ด้วยดี

2 ติดตั้ง http-proxy-to-socks เพื่อแปลง procotol ให้เป็น proxy

ต่อมา ถ้าใครมีการใช้งาน javascript อยู่แล้ว แนะนำให้ลง http-proxy-to-socks ซึ่งเป็นโปรแกรมสำหรับแปลงข้อมูลระหว่าง proxy กับ sock นั่นเอง

โดยการลงโปรแกรมสามารถทำได้ตามคำสั่งข้างล่าง

npm install -g http-proxy-to-socks

เมื่อลงโปรแกรมเรียบร้อยแล้วให้ลองสั่งตามนี้

hpts -s 127.0.0.1:12345 -p 8080

คำสั่งที่ส่งไป มีความหมายว่า เปิด proxy server ที่ port 8080 แล้วทำการเชื่อมต่อ sock protocol ไปยัง 127.0.0.1:12345

สิ่งที่อยากให้สังเกตคือ Proxy Server จะถูกเปิดให้ใช้งานอยู่ที่ port 8080 ภายในเครื่องของเรา เช่นเดียวกัน

3 เชื่อมต่อกับระบบ

ทีนี้ในการทดสอบ ถ้าเป็น Postman เราก็สามารถที่จะตั้งค่า proxy ให้เป็น 127.0.0.1:12345 ได้แล้ว

ตัวอย่างการตั้งค่า proxy server ภายใน Postman

หรือถ้าเป็นการเขียนโปรแกรม Library ส่วนใหญ่ก็สามารถใช้งาน Proxy ได้อย่างง่ายๆ ไม่เหมือนกับ Sock เช่น ตัวอย่าง Code Ruby ที่จะทำการสร้าง NetHTTP Object

net = Net::HTTP.new('www.target.com', 8080, '1.2.3.4', 12345)
response = net.post('/test')

เมื่อสั่งรันโปรแกรม ก็จะทำให้ไปทำการเรียก www.target.com ผ่าน proxy ที่ 1.2.3.4:12345 นั่นเอง

ข้อดีคือ เราสามารถควบคุมการเปิดปิดของ Sock Server ได้ภายในเครืองของเรา ซึ่งสามารถควบคุมความปลอดภัยได้ดีกว่า และสามารถปิดได้ง่ายเมื่อไม่ต้องการที่จะใช้งาน

ก็หวังว่าจะมีประโยชน์ครับ

--

--

Teerayut Hiruntaraporn
Teerayut Hiruntaraporn

No responses yet