Skip to content

Latest commit

 

History

History
305 lines (212 loc) · 14.9 KB

File metadata and controls

305 lines (212 loc) · 14.9 KB

Лабораторийн тайлан: OpenVPN ашиглан хяналттай шалгалтын WEB орчин байгуулах

Даалгаврын зорилго

Энэхүү лабораторийн зорилго нь OpenVPN ашиглан дараах нөхцөлийг хангах хяналттай VPN орчин байгуулах.

  • OpenVPN‑д холбогдсон хэрэглэгч өөрийн ердийн интернэт (Google, YouTube гэх мэт) рүү шууд хандах боломжгүй байх.
  • Хэрэглэгч зөвхөн Ubuntu Server дээр ажиллаж буй шалгалтын web систем рүү VPN‑ээр дамжин нэвтрэх боломжтой байх.
  • Хэрвээ хэрэглэгч OpenVPN client тохиргоогоо дур мэдэн өөрчилж, интернет гаргах оролдлого хийвэл үүнийг:
    • OpenVPN лог,

    • веб серверийн лог,

    • client‑side JavaScript (server талаас илгээж буй сигнал)

      ашиглан илрүүлж чадах архитектурын ойлголттой болох


Анхаарах нөхцөл:

  • Firewall, iptables зэрэг OS‑level блок ашиглахгүй.
  • Зөвхөн OpenVPN‑ийн server/client config, routing, push тохиргоонууд дээр үндэслэн хязгаарлалт тавина.

Хязгаарлалт: Клиент VPN-д холбогдсон үед интернэтэд хандах боломжгүй болно.

Хандалт: Клиент зөвхөн VPN сервер дээрх дотоод вэб систем (10.8.0.1) рүү хандана.

Хяналт: VPN холболт тасрах эсвэл интернэт илрэх үед JavaScript-ээр вэб хуудсыг шууд хаах (Blackout).

2. Ашигласан орчин (Lab Environment)

  • Төрөл Тайлбар IP хаяг
  • VPN Server Ubuntu Server 192.168.1.11 (LAN), 10.8.0.1 (VPN)
  • VPN Client Ubuntu Desktop 192.168.1.15 (LAN), 10.8.0.2 (VPN)
  • Software OpenVPN, Easy-RSA Version 2.6+
  • Web Server Python3 HTTP Server Port 80

3. Серверийн тохиргоо ба PKI үүсгэх

3.1 Гэрчилгээ болон Түлхүүр үүсгэх

Easy-RSA ашиглан CA, Server, Client сертификатуудыг үүсгэсэн.

ca.crt: Итгэлцлийн үндэс (CA)

server.crt / server.key: Серверийн таних тэмдэг

dh.pem: Diffie-Hellman параметр (нууцлал солилцох)

ta.key: TLS-auth (DDoS болон нэмэлт хамгаалалт)

make-cadir /etc/openvpn/easy-rsa
cd /etc/openvpn/easy-rsa
./easyrsa init-pki
./easyrsa build-ca nopass
./easyrsa build-server-full server nopass
./easyrsa build-client-full client1 nopass
./easyrsa gen-dh
openvpn --genkey --secret ta.key

3.2 Серверийн тохиргооны файл (/etc/openvpn/server.conf)

Бүх траффикийг өөр рүүгээ татах боловч дамжуулалтыг хаах тохиргоог оруулсан.

port 1194
proto udp
dev tun
server 10.8.0.0 255.255.255.0
topology subnet

## Сертификатуудын зам
ca /etc/openvpn/server/ca.crt
cert /etc/openvpn/server/server.crt
key /etc/openvpn/server/server.key
dh /etc/openvpn/server/dh.pem
tls-auth /etc/openvpn/easy-rsa/ta.key 0
key-direction 0

## Траффик удирдах (Redirect Gateway)
push "redirect-gateway def1 bypass-dhcp"
push "dhcp-option DNS 10.8.0.1"

keepalive 10 120
cipher AES-256-GCM
persist-key
persist-tun
status /var/log/openvpn/openvpn-status.log
verb 3

4. Интернэт хандалтыг хязгаарлах арга (Core Security)

Энэхүү лабораторид интернэт хандалтыг iptables ашиглахгүйгээр, Linux Kernel-ийн түвшинд хаасан.

Алхам: Сервер дээр IP пакет дамжуулалтыг (Forwarding) идэвхгүй болгосон.

Команд: sysctl -w net.ipv4.ip_forward=0

Үр дүн: VPN клиентээс ирсэн пакетууд сервер дээр ирэх боловч сервер тэдгээрийг цааш интернэт (eth0) рүү дамжуулахгүй. Клиент зөвхөн серверийн дотоод IP (10.8.0.1) рүү хандах боломжтой үлдэнэ.

5. Шалгалтын вэб систем (index.html)

JavaScript ашиглан бодит хугацааны хяналт (Watchdog) хийх код:

root@vpn:/etc/openvpn# cat index.html 
<!DOCTYPE html>
<html lang="mn">
<head>
    <meta charset="UTF-8">
    <title>Secure Exam System</title>
    <style>
        body {
            font-family: sans-serif;
            background: #0f172a;
            color: white;
            display: flex;
            justify-content: center;
            align-items: center;
            height: 100vh;
            margin: 0;
        }
        .box {
            border: 2px solid #22c55e;
            padding: 40px;
            border-radius: 10px;
            text-align: center;
            background: #020617;
        }
        h1 { color: #22c55e; }
    </style>
</head>
<body>

<div id="content">
    <div class="box">
        <h1>🔒 Secure Exam Mode</h1>
        <p>VPN: <span style="color: #4ade80;">CONNECTED</span></p>
        <p>Internet: <span style="color: #4ade80;">RESTRICTED</span></p>
        <hr>
        <p>Шалгалт эхлэхэд бэлэн.</p>
    </div>
</div>

<script>
    let isBlackedOut = false;

    // Бүх зүйлийг устгаж хар дэлгэц болгох функц
    function blackout() {
        if (isBlackedOut) return;
        isBlackedOut = true;
        document.body.innerHTML = ""; 
        document.body.style.background = "black";
        console.log("Security violation: Session terminated.");
    }

    // 1. VPN холболтыг хянах
    async function watchVPN() {
        try {
            const res = await fetch(window.location.href, { cache: 'no-store' });
            if (!res.ok) throw new Error();
        } catch (e) {
            blackout(); // Холболт тасарвал шууд хар дэлгэц
        }
    }

    // 2. Интернэт илрэхийг хянах
    async function watchInternet() {
        try {
            // Google рүү хандах оролдлого (ip_forward=0 үед fail хийх ёстой)
            await fetch("https://www.google.com/favicon.ico", { 
                mode: "no-cors", 
                cache: "no-store" 
            });
            // Хэрэв fetch амжилттай болбол интернэт илэрсэн тул шууд хар дэлгэц
            blackout();
        } catch (e) {
            // Алдаа гарч байвал зөв (Интернэт хаалттай байна)
        }
    }

    // 1 секунд тутамд шалгах
    setInterval(() => {
        if (!isBlackedOut) {
            watchVPN();
            watchInternet();
        }
    }, 1000);
</script>

</body>
</html>

6. Туршилтын үр дүн

6.1 OpenVPN Холболт

alt text

Клиент машин дээр sudo openvpn client1.ovpn командыг ажиллуулахад Initialization Sequence Completed амжилттай гарсан.

6.2 Траффик хязгаарлалт (Connectivity Test)

Үр дүн Тайлбар:

alt text

Internal Ping 10.8.0.1 Success Сервер рүү хандаж байна

External Ping 8.8.8.8 Fail Интернэт хаагдсан


Энд OpenVPN-ийн redirect-gateway def1 тохиргоо хэрхэн ажиллаж байгаа нь харагдаж байна:

0.0.0.0/1 via 10.8.0.1 dev tun0 болон 128.0.0.0/1 via 10.8.0.1 dev tun0: Энэ хоёр мөр нь нийлээд бүх интернэт траффикийг (0.0.0.0/0) VPN туннель (tun0) рүү хүчээр чиглүүлж байна. Энгийнээр хэлбэл, клиент ямар ч гадаад сайт руу хандахыг оролдсон бүгд VPN сервер рүү очно.

10.8.0.0/24 dev tun0 proto kernel scope link src 10.8.0.2: Клиент өөрөө 10.8.0.2 гэсэн VPN IP хаяг авсныг харуулж байна.

192.168.1.11 via 192.168.1.1 dev enp0s3: Энэ бол VPN серверийн бодит LAN IP хаяг руу хандах "статик зам" юм. Энэ зам байхгүй бол VPN холболт өөрөө тасрах аюултай тул OpenVPN автоматаар үүсгэдэг.

Web Access http://10.8.0.1 ✅ Open Шалгалтын систем ажиллаж байна

alt text

VPN тасрах үеийн логик (Watchdog Mechanism)

Вэб хуудас ачаалагдсан даруйд JavaScript-ийн setInterval функц ажиллаж, 1 секунд тутамд дараах үйлдлийг гүйцэтгэнэ:

Ажиллагаа: Браузер нь fetch(window.location.href) командыг ашиглан VPN серверийн дотоод IP (10.8.0.1) рүү маш жижиг хүсэлт илгээнэ.

VPN салсан тохиолдолд: Хэрэв клиент VPN-ээ салгавал 10.8.0.1 хаяг руу хандах чиглүүлэлт (Route) клиент компьютерээс устах тул fetch хүсэлт алдаа (Error) заана.

Үр дүн: Алдаа илэрсэн даруйд blackout() функц ажиллаж, document.body.innerHTML = "" командыг ажиллуулснаар вэб хуудасны бүх агуулгыг устгаж, дэлгэцийг тас хар болгоно.

alt text


6.2 Security Blackout Test

VPN салгахад: watchVPN() функц ажиллаж, вэб хуудас ямар ч анхааруулгагүйгээр шууд тас хар болсон.

Интернэт холбоход: VPN-ийг салгаад Wi-Fi-аар интернэт орох оролдлого хийхэд watchInternet() функц илрүүлж, мөн адил дэлгэцийг харлуулсан.

7. Дүгнэлт

OpenVPN-ийн конфигураци болон клиент талын JavaScript хяналтыг хослуулснаар "Strict Exam Environment"-ийг амжилттай бүрдүүллээ. Энэхүү систем нь зөвхөн сүлжээний түвшинд бус, хэрэглээний түвшинд (Application Layer) давхар хяналт тавьж байгаа нь аюулгүй байдлыг өндөр түвшинд хангаж байна.

Concepts

1. Туннелчлэл ба VPN (Tunneling & VPN)

Сүлжээний талаас хамгийн чухал ойлголт. VPN бол "Public" (Интернэт) сүлжээ дотор "Private" (Нууц) суваг үүсгэж байгаа хэрэг юм.

UN Interface: Чиний компьютер дээр үүссэн tun0 бол виртуал сүлжээний карт юм. Энэ нь физик кабель биш, харин программ хангамжийн түвшинд үүссэн холболт.

Encapsulation: Клиентээс гарч буй бүх дата VPN туннель рүү орохдоо шифрлэгдэж (encrypted), өөр нэг пакет дотор "боогддог". Үүнийг гаднаас нь харахад зүгээр л VPN сервер рүү явж байгаа баахан ойлгомжгүй дата харагдана.

Virtual IP: 192.168.x.x гэсэн LAN хаягтай байсан ч VPN-д холбогдмогц 10.8.0.2 гэсэн огт өөр сүлжээний хаяг авч байгаа нь чиний компьютер VPN серверийн дотоод сүлжээний нэг хэсэг болсныг илтгэнэ.

2. Чиглүүлэлт (Routing)

"Дата хаашаа явахыг хэн шийддэг вэ?" гэдэг асуултад чиглүүлэлт хариулна. "ip r" команд дээрх үр дүнгүүд маш чухал:

Default Gateway: Ердийн үед бүх траффик гэрийн router-ээр (192.168.1.1) дамжиж интернэт рүү явдаг.

Route Overriding: VPN холбогдоход 0.0.0.0/1 via 10.8.0.1 гэсэн дүрэм нэмэгдсэн. Энэ нь "Хаашаа ч явсан хамаагүй, эхлээд VPN сервер рүү оч" гэсэн тушаал юм.

Static Route: VPN сервер рүү холбогдохын тулд серверийн бодит хаяг (192.168.1.11) руу явах замыг VPN программ автоматаар үлдээдэг. Хэрэв үүнийг устгавал VPN өөрөө тасарна.

3. Пакет Дамжуулалт (Packet Forwarding)

Энэ бол төслийн "Интернэт хаах" гол нууц юм.

OSI Layer 3: Сервер бол чиглүүлэгч (Router) шиг ажиллах боломжтой. Хэрэв ip_forward=1 байвал сервер өөр дээр нь ирсэн пакетыг цааш нь интернэт рүү "шиддэг".

Security by Disabling: Чи ip_forward=0 болгосноор серверийг "сохор" болгож байгаа юм. Сервер өөрт нь ирсэн пакетуудыг (Google рүү явах хүсэлт) хүлээж авах боловч цааш нь хаашаа ч дамжуулахгүй (Forward хийхгүй) устгачихдаг.

Internal Access Only: Гэхдээ сервер өөрийнх нь IP хаяг (10.8.0.1) дээр ирсэн пакетуудад хариу өгч чадна. Тийм учраас л шалгалтын вэбээ үзэж чадаад, Google рүү орж чадахгүй байгаа юм.

4. Клиент талын хяналт (JavaScript Security)

Сүлжээний хамгаалалтаас гадна "Программ хангамжийн хамгаалалт" гэж юу болохыг чи сурлаа.

Watchdog Logic: Сүлжээ хэзээ ч тасарч болно. Гэхдээ вэб хуудас браузерын санах ойд (RAM) ачаалагдсан хэвээр байдаг. Хэрэв оюутан VPN-ээ салгаад интернэтээ асаавал браузер доторх мэдээлэл харагдсаар байна.

State Checking: Тиймээс чиний бичсэн JS код 1 секунд тутамд "Би одоо ч аюулгүй сүлжээнд байна уу?" гэж асууж байна.

DOM Manipulation: document.body.innerHTML = "" гэдэг нь браузерын бүтцийг (DOM) үндсээр нь устгаж байгаа хэрэг. Энэ нь датаг нуух хамгийн үр дүнтэй арга юм.