# การติดตั้งบริการ OpenVPN

อิมเมจนี้รับประกันเพียงฟังก์ชันพื้นฐานเท่านั้น หากคุณมีความสามารถในการกำหนดค่าด้วยตนเอง ขอแนะนำให้สร้างขึ้นเองหรืออ้างอิงวิธีการใช้งานของอิมเมจนี้เพื่อดำเนินการให้เสร็จสิ้น ก่อนใช้งาน คุณจำเป็นต้องมีความรู้พื้นฐานเกี่ยวกับ Linux และ Docker อิมเมจนี้ผ่านการทดสอบบน Debian 9 แล้ว ที่นี่จะอธิบายวิธีการใช้งานบน Debian 9 ซึ่งโดยปกติแล้วสามารถนำไปใช้กับระบบอื่น ๆ เช่น Ubuntu ได้ บริการนี้ใช้พอร์ตเริ่มต้นที่ 1190/UDP โปรดตรวจสอบให้แน่ใจว่าได้อนุญาตการเข้าถึงพอร์ตนี้ในไฟร์วอลล์ของคุณแล้ว

## การเตรียมการ

คุณยังต้องทำการแก้ไขต่อไปนี้บนเซิร์ฟเวอร์ของคุณ โดยรันคำสั่ง

```bash
echo net.ipv4.ip_forward=1 >>/etc/sysctl.conf
sysctl -p
```

หากเซิร์ฟเวอร์ของคุณ**มีการติดตั้ง `ufw`** คุณจะต้องเพิ่มเนื้อหาต่อไปนี้ที่บรรทัดแรกๆ ของไฟล์ `/etc/ufw/before.rules` โดยที่ eth0 และช่วงของเครือข่าย (network segment) จะต้องแก้ไขตามอินเทอร์เฟซและการตั้งค่าจริงของเซิร์ฟเวอร์ของคุณ โปรดทราบว่าต้องเพิ่มก่อนกฎ *filter (ถ้ามี)

```bash
*nat
:POSTROUTING ACCEPT [0:0]
-A POSTROUTING -s 172.27.27.0/24 -o eth0 -j MASQUERADE
COMMIT
```

แก้ไขการตั้งค่าต่อไปนี้ในไฟล์ `/etc/default/ufw` ให้เป็น ACCEPT

```bash
DEFAULT_FORWARD_POLICY="ACCEPT"
```

สุดท้าย รันคำสั่งต่อไปนี้เพื่อรีสตาร์ทบริการไฟร์วอลล์ ufw บนเซิร์ฟเวอร์

```bash
ufw reload
```

หากเซิร์ฟเวอร์ของคุณ**ไม่ได้ติดตั้ง `ufw`** โปรดตรวจสอบให้แน่ใจว่ากฎ FORWARD ของ iptables เป็น ACCEPT โดยรันคำสั่งต่อไปนี้

```{attention}
หลังจากรีสตาร์ทเซิร์ฟเวอร์ คุณอาจต้องใช้กฎนี้อีกครั้ง แนะนำให้ติดตั้ง ufw
```

```bash
iptables -P FORWARD ACCEPT
```

## การเริ่มต้นการตั้งค่า

ตอนนี้ เราจะสร้างไดเรกทอรีเพื่อบันทึกการตั้งค่าบริการ OpenVPN ของเรา

```bash
mkdir -p ~/lamda-openvpn-server
```

จากนั้น รันคำสั่งต่อไปนี้เพื่อเริ่มต้นการตั้งค่าบริการ OpenVPN

```bash
docker run -it --rm --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn ovpn-server-new
```

รอให้คำสั่งทำงานเสร็จสิ้น ตอนนี้คุณจะเห็นไฟล์การตั้งค่าของบริการในไดเรกทอรี `~/lamda-openvpn-server` ไฟล์การตั้งค่าคือ `config.ovpn` คุณสามารถใช้เอดิเตอร์เพื่อเปิดไฟล์นี้ แนะนำให้แก้ไขเฉพาะฟิลด์ต่อไปนี้

```ini
# ช่วงของเครือข่ายและซับเน็ตมาสก์ของ VPN
server 172.27.27.0 255.255.255.0
# พอร์ตบริการ VPN
port 1190

# หรือหากคุณต้องการให้ไคลเอนต์ VPN สามารถเข้าถึงอินเทอร์เฟซเครือข่ายบางตัวบนเซิร์ฟเวอร์ได้
# คุณสามารถเพิ่มเส้นทาง (route) ได้ แต่โปรดทราบว่าในกรณีนี้คุณจะสามารถเข้าถึงได้เฉพาะ IP ของโฮสต์ปัจจุบันในเครือข่ายนี้เท่านั้น
# หากต้องการให้ไคลเอนต์เข้าถึงเครือข่ายนี้ได้อย่างสมบูรณ์ คุณจะต้องทำการตั้งค่าเพิ่มเติม
push "route 192.168.68.0 255.255.255.0"

# แก้ไข 114 เป็น DNS Server ที่คุณต้องการ
push "dhcp-option DNS 114.114.114.114"
```

## การสร้างข้อมูลรับรองการเชื่อมต่อสำหรับไคลเอนต์

หลังจากแก้ไขเสร็จสิ้น ตอนนี้เราจะเริ่มสร้างไคลเอนต์ `myname` สามารถเปลี่ยนเป็นชื่ออื่นที่คุณต้องการได้ แต่ต้องไม่ซ้ำกัน

```bash
docker run -it --rm --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn ovpn-client-new myname
```

หลังจากสร้างเสร็จสิ้น ใช้คำสั่งต่อไปนี้เพื่อรับข้อมูลรับรองการเข้าสู่ระบบสำหรับไคลเอนต์นี้

```bash
# หมายเหตุ: IP ในการตั้งค่าจะถูกดึงมาจาก Public IP ปัจจุบันโดยอัตโนมัติ หากไม่ถูกต้อง โปรดแก้ไขด้วยตนเอง
#
# สร้างไฟล์ตั้งค่า ovpn และบันทึกไปยังไฟล์ myname.ovpn ไฟล์นี้สามารถใช้กับแอปพลิเคชันเช่น OpenVPN-Connect ได้
docker run -it --rm --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn ovpn-client-profile ovpn myname >myname.ovpn
# สร้าง OpenVPNProfile สำหรับใช้งานกับ lamda ซึ่งสามารถใช้ใน lamda ได้โดยตรง
# ภายในจะมีส่วนคอมเมนต์ properties.local ซึ่งคุณสามารถคัดลอกการตั้งค่า openvpn.*
# ไปยัง /data/usr/properties.local เพื่อให้สามารถเชื่อมต่อ VPN ได้โดยอัตโนมัติ
docker run -it --rm --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn ovpn-client-profile lamda myname
```

## การเพิกถอนข้อมูลรับรองของไคลเอนต์

หากต้องการเพิกถอนข้อมูลรับรองของไคลเอนต์ใด ๆ โปรดรันคำสั่งต่อไปนี้ หลังจากเพิกถอนแล้ว อาจจำเป็นต้องรีสตาร์ทบริการ OpenVPN

```bash
docker run -it --rm --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn ovpn-client-revoke myname
```

## การเริ่มบริการ OpenVPN

ตอนนี้คุณสามารถรันคำสั่งต่อไปนี้เพื่อเริ่มบริการ OpenVPN ในโหมด foreground ซึ่งคุณจะสามารถเห็นบันทึกการเชื่อมต่อของไคลเอนต์และแก้ไขข้อผิดพลาดได้โดยตรง

```bash
docker run -it --rm --name openvpn-server --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn run
```

เมื่อคุณตรวจสอบว่าทุกอย่างถูกต้องแล้ว แนะนำให้รันบริการในโหมด background โดยใช้คำสั่งนี้

```bash
docker run -d --rm --name openvpn-server --privileged --net host -v ~/lamda-openvpn-server:/etc/openvpn rev1si0n/openvpn run
```

## เอกสารอ้างอิง

เอกสารพื้นฐาน: https://openvpn.net/community-resources/reference-manual-for-openvpn-2-4/

การตั้งค่า Routing: https://community.openvpn.net/openvpn/wiki/BridgingAndRouting