Thứ tư, 22/10/2014 | 00:00 GMT+7

Cách chạy server trò chuyện UnrealIRCd trên Debian 7

Trong bài viết này, ta sẽ tìm hiểu cách xây dựng, cài đặt và cấu hình server IRC bằng daemon Unreal IRC (IRCd): một dịch vụ cho phép user kết nối thông qua IRC (Internet Relay Chat). IRC là một giao thức cho phép user trò chuyện trong thời gian thực thông qua các tin nhắn được gửi qua mạng.

Đặc biệt, ta sẽ sử dụng Debian 7 x64 Server cho hướng dẫn này.

Bước một - Tạo user ircd

Ta sẽ cho rằng bạn vừa chạy Debian 7 x64 Server mới và bạn đã đăng nhập với quyền là user root . Nếu bạn hiện không phải là user root, hãy chuyển sang root bằng:

su 

Như với bất kỳ daemon hoặc dịch vụ nào bên ngoài mà user có thể thấy, tốt nhất là không chạy UnrealIRCd dưới dạng root, vì cả lý do bảo mật và hiệu suất. Bởi vì điều này, ta sẽ bắt đầu bằng cách tạo một user đặc biệt để chạy daemon.

adduser ircd 

Tạo password mới cho user khi được yêu cầu . Tôi khuyên bạn nên tạo password bằng phương pháp tạo password XKCD - nghĩa là kết hợp 3-5 từ trong từ điển khá phổ biến thành một tổ hợp dễ nhớ có độ dài sẽ thêm đủ entropy (độ mạnh) vào password để khiến máy tính khó đoán nhưng con người dễ nhớ.

Nếu bạn không được yêu cầu tạo password , chỉ cần nhập:

passwd ircd 

Sau đó, bạn sẽ được yêu cầu tạo password .

Cung cấp cho user các quyền

Bây giờ ta cần đảm bảo server đi kèm với sudo , một tiện ích phổ biến cho các hệ thống dựa trên UNIX (chẳng hạn như Linux). Đối với những người không quen thuộc, lệnh sudo cho phép user thực thi các lệnh với quyền root ( su hoặc superuser ), do đó có tên - s uper u ser do - mà ta cần khi cài đặt các thư viện yêu cầu .

Debian 7 đã cài đặt sudo theo mặc định. Nếu bạn cần cài đặt nó, hãy nhập:

apt-get install sudo 

Bây giờ ta biết sudo đã được cài đặt, bạn cần thêm user ircd mà ta đã tạo trước đó vào group sudo để cho phép nó truy cập vào lệnh sudo.

Để làm điều này, hãy chạy lệnh sau:

adduser ircd sudo 

Đó là tất cả cho bước tạo user ! Bây giờ ta chỉ cần chuyển sang user mới:

su ircd 

Thay đổi folder chính của user ircd .

cd ~ 

Bước hai - Cài đặt yêu cầu

Trước khi ta có thể cài đặt UnrealIRCd, ta đang thiếu một vài thư viện. Chúng bao gồm các thư viện được sử dụng để kết nối an toàn cũng như các trình biên dịch và thư viện cần thiết để xây dựng UnrealIRCd.

Các gói này là make , gcc , build-essential , openssl , libcurl4-openssl-dev , zlib1g , zlib1g-dev , zlibc , libgcrypt11libgcrypt11-dev .

Ta sẽ sử dụng APT để cài đặt chúng trong Debian. Chạy lệnh sau để cập nhật trình quản lý gói của bạn:

sudo apt-get update 

Chạy lệnh sau để cài đặt các yêu cầu . Nhập khi được yêu cầu . Bạn có thể thấy rằng một số gói này đã được cài đặt - tại thời điểm viết bài này, zlib1g và openssl đã có trong Debian - nhưng chúng được liệt kê ở đây để hoàn thiện.

sudo apt-get install make gcc build-essential openssl libcurl4-openssl-dev zlib1g zlib1g-dev zlibc libgcrypt11 libgcrypt11-dev 

Bây giờ sẽ là thời điểm tốt để mua một bữa ăn nhẹ, vì có thể mất một lúc để trình quản lý gói download và cài đặt tất cả các gói.

Sau khi hoàn tất, ta có thể download và cài đặt UnrealIRCd và bắt đầu quá trình xây dựng.

Bước 3 - Cài đặt UnrealIRCd

UnrealIRCd không có sẵn theo mặc định dưới dạng một gói trên Debian hoặc bất kỳ bản phân phối chính nào, vì vậy ta sẽ download và xây dựng nó từ nguồn theo cách thủ công.

Ta sẽ download gói nguồn cho UnrealIRCd bằng tiện ích wget được tích hợp trong Debian. Nếu bạn cần download wget, hãy chạy lệnh sau:

sudo apt-get install wget 

Bạn cần lấy liên kết download từ trang web của UnrealIRCd để tiến hành cài đặt. Truy cập trang download UnrealIRCd chính thức và download nhánh nguồn ổn định mới nhất.

Khi trang download được hiển thị cho bạn, bạn có thể thấy một liên kết cho biết “Quá trình download sẽ bắt đầu sau 5 giây, nếu nó không nhấp vào đây”. Đây là liên kết đến file chứa mã nguồn Không có thực và URL bạn nên sử dụng với wget .

Tại thời điểm viết bài, URL là http://unrealircd.org/downloads/Unreal3.2.10.4.tar.gz .

Trong khi đăng nhập với quyền user ircd của ta , hãy đảm bảo ta đang ở trong folder chính của ta :

cd ~ 

Bây giờ, ta hãy download mã nguồn. Cảnh báo: Sử dụng cờ --no-check-certificate với wget là một cách kém an toàn hơn để lấy file này. Bạn nên sử dụng một phương pháp khác nếu mục tiêu của bạn là bảo mật trên tốc độ:

wget --no-check-certificate http://unrealircd.org/downloads/Unreal3.2.10.4.tar.gz 

Extract mã nguồn vào folder riêng của nó:

tar xzvf Unreal3.2.10.4.tar.gz 

Bây giờ ta có thể chuyển sang folder mới:

cd Unreal3.2.10.4 

Và cuối cùng, hãy bắt đầu quá trình xây dựng. Sử dụng tập lệnh ./Config được tích hợp trong gói nguồn:

./Config 

Đọc qua ghi chú phát hành và nhấn Enter để tiếp tục cuộn qua. Hãy để ý con số phần trăm ở phía dưới để không bỏ lỡ các câu hỏi. Sau khi ghi chú phát hành kết thúc và tập lệnh cấu hình bắt đầu, UnrealIRCd sẽ bắt đầu hỏi bạn các câu hỏi.

What directory are all the server configuration files in? 

Bạn có thể để nó ở chế độ mặc định. Nhấn Enter để tiếp tục.

What is the path to the ircd binary including the name of the binary? 

Để điều này làm mặc định là tốt. Nhấn Enter .

What should the default permissions for your configurations files be?  (Set this to 0 to disable) 

, hãy để nó ở chế độ mặc định. Câu hỏi tiếp theo là quan trọng:

Do you want to support SSL (Secure Sockets Layer) connections? 

Câu trả lời:

Yes 

Theo mặc định, tập lệnh cấu hình của UnrealIRCd sẽ không hỗ trợ kết nối SSL, nhưng nhập Có ở đây sẽ kích hoạt nó. Đây là lý do tại sao ta đã cài đặt OpenSSL trước đó.

Sau đó, bạn sẽ được yêu cầu về đường dẫn đến OpenSSL trên hệ thống. Vì ta đã để APT xử lý việc này cho ta sớm hơn, ta có thể để nó ở chế độ mặc định.

If you know the path to OpenSSL on your system, enter it here. If not leave this blank (in most cases it will be detected automatically). 

Nhấn Enter .

Câu hỏi tiếp theo là quan trọng đối với một số user nhất định sử dụng IPv6 trên Server của họ.

Do you want to enable IPv6 support? 

Bạn chỉ nên trả lời cho câu hỏi này nếu bạn đã bật IPv6 khi cài đặt Server ban đầu. Nếu bạn chưa bật IPv6 trên Server của bạn , bạn có thể để nó ở chế độ mặc định (“Không”) và nhấn Enter .

Câu hỏi tiếp theo liên quan đến những user sẽ vận hành daemon IRC với nhiều server được liên kết trong mạng IRC. Ziplinks thực chất là một phương tiện tiết kiệm băng thông khi trao đổi dữ liệu giữa các server IRC bằng cách nén dữ liệu trước khi nó được gửi đi. Bạn không bắt buộc phải trả lời , nhưng bạn nên trả lời. Nếu bạn gặp khó khăn khi xây dựng UnrealIRCd không được ghi trong bài viết này, hãy thử chạy lại ./Config và trả lời Không cho câu hỏi này.

Do you want to enable ziplinks support? 

Câu trả lời:

Yes 

Khi được hỏi về đường dẫn, hãy nhấn Enter .

If you know the path to zlib on your system, enter it here. If not leave this blank 

Tất cả các câu hỏi tiếp theo đều có thể được trả lời theo mặc định bằng cách nhấn Enter :

Do you want to enable remote includes? Do you want to enable prefixes for chanadmin and chanowner? What listen() backlog value do you wish to use? How far back do you want to keep the nickname history? What is the maximum sendq length you wish to have? How many buffer pools would you like? How many file descriptors (or sockets) can the IRCd use? Would you like to pass any custom parameters to configure? 

Khi bạn đã trả lời xong các câu hỏi, tập lệnh cấu hình sẽ bắt đầu chuẩn bị folder nguồn cho quá trình xây dựng. Quá trình này có thể mất một vài phút, vì vậy hãy nghỉ ngơi một chút.

Cuối cùng, bạn sẽ được yêu cầu tạo certificate SSL cho IRCd. Trừ khi bạn đã có certificate SSL được cấp bởi một tổ chức cấp certificate thích hợp, bạn có thể chỉ muốn để tùy chọn này ở chế độ mặc định (phải là “Có”) - đó là những gì ta sẽ thực hiện trong hướng dẫn này.

Bạn sẽ được hỏi thông tin về server , chẳng hạn như quốc gia, tỉnh, city và tổ chức. Bạn có thể nhập bất cứ điều gì bạn cảm thấy hợp lý tại đây. Bạn nên nhập domain của server khi được hỏi tên.

Nhấn Enter để tiếp tục. Bạn sẽ thấy một thông báo nhanh về các certificate đã ký. Nhấn Enter lần nữa và quá trình cấu hình hoàn tất.

Bước 4 - Xây dựng UnrealIRCd

Đây là bước đơn giản nhất trong số đó! Di chuyển đến folder ~ / Unreal [bất kỳ version nào bạn đã download ] :

cd ~/Unreal3.2.10.4 

Xây dựng nó!

make 

Quá trình xây dựng sẽ bắt đầu. Đây là bước dài nhất và nếu bạn vẫn chưa đi pha trà hoặc cà phê trong hai lần nghỉ giải lao trước, thì bây giờ chắc chắn là lúc để làm điều đó - sẽ mất vài phút để hoàn thành quá trình xây dựng.

Bước 5 - Cấu hình UnrealIRCd

Sau khi quá trình xây dựng hoàn tất, bây giờ bạn đã sẵn sàng để cấu hình server UnrealIRCd mới của bạn . Tệp cấu hình được viết với cú pháp giống C. Nó dài, nhưng khá đơn giản.

Tạo một bản sao của file cấu hình mẫu:

cp ~/Unreal3.2.10.4/doc/example.conf ~/Unreal3.2.10.4/unrealircd.conf 

Thao tác này sẽ sao chép file cấu hình ví dụ tiếng Anh vào folder root Unreal. Nếu server của bạn sẽ hoạt động bằng ngôn ngữ không phải là tiếng Anh, bạn có thể sử dụng mã ngôn ngữ gồm hai chữ cái cho bất kỳ đối tượng mục tiêu của bạn sẽ sử dụng; ví dụ: ./doc.example. fr .conf Tại thời điểm viết bài, tiếng Đức, tiếng Tây Ban Nha, tiếng Pháp, tiếng Hungary, tiếng Hà Lan, tiếng Nga và tiếng Thổ Nhĩ Kỳ được hỗ trợ cùng với tiếng Anh, nhưng trong hướng dẫn này, ta sẽ giải quyết cấu hình ví dụ tiếng Anh.

Mở file cấu hình bằng editor yêu thích của bạn:

nano ~/Unreal3.2.10.4/unrealircd.conf 

Bây giờ, ta hãy bắt đầu chỉnh sửa file cấu hình theo ý mình. Ta sẽ xem xét file cấu hình tuần tự từ trên xuống dưới, vì vậy thứ tự của các phần có thể hơi kỳ quặc. Đi từ trên xuống dưới là phương pháp đơn giản nhất cho mục đích của ta .

Lưu ý có nhiều phần được comment trong file cấu hình này và một số cài đặt không ảnh hưởng đến hầu hết user , ta sẽ không hiển thị chi tiết.

Mô-đun

UnrealIRCd được quảng cáo là một IRCd mô-đun , trong đó bạn có thể tạo chức năng cho daemon mà không cần phải biên dịch lại toàn bộ cơ sở mã nguồn và tải / dỡ nó nhanh chóng. Do đó, một số chức năng cốt lõi được lưu trữ trong hai module cổ phiếu của Unreal — module lệnh và module áo choàng . Hãy tìm hai dòng sau:

// loadmodule “src/modules/commands.so”; // loadmodule “src/modules/cloak.so”; 

Đối với những người không quen với cú pháp giống C, dấu gạch chéo kép ( // ) cho Unreal bỏ qua bất cứ điều gì xuất hiện sau dấu gạch chéo trên một dòng. Nhiều dòng có thể được comment bằng cách thêm /**/ xung quanh tài liệu.

Bỏ ghi chú hai module để chúng trông như thế này:

/* FOR *NIX, uncomment the following 2lines: */ loadmodule "src/modules/commands.so"; loadmodule "src/modules/cloak.so"; 

tôi {} - Tên server

Tiếp tục cuộn qua file cấu hình cho đến khi bạn thấy phần có nhãn là me {} . Trước tiên sẽ có một phần ví dụ được comment . Bạn muốn cái không có ghi chú.

Phần này, trước đây được gọi là M-line, xác định các chi tiết cụ thể về server khi user kết nối.

Đặt tên thành tên server của server .

Trường thông tin phải chứa tên chính thức cho server IRC của bạn, chẳng hạn như “MyDomain IRC”. Các trường tên và thông tin phải được đặt trong dấu ngoặc kép.

Trường số nên được để lại bằng số mặc định, trừ khi bạn định liên kết nhiều server IRC với nhau. Với nhiều server , bạn hoàn toàn phải đảm bảo tất cả các server trong mạng có giá trị khác nhau trong trường này. Điều này đóng role là mã nhận dạng duy nhất của họ đối với UnrealIRCd.

me {         name "unreal.example.com";         info "Unreal Chat Server";         numeric 1; }; 

administrator {} - Thông tin liên hệ của administrator

Phần tiếp theo là khối admin {} hoặc một: dòng. , cuộn cho đến khi bạn đến ví dụ không chú thích.

Điều này phải chứa thông tin liên hệ của bạn với quyền là administrator server . Bạn có thể đặt nhiều hoặc ít ở đây tùy thích, nhưng bạn cần phải có ít nhất một dòng.

Hầu hết user đặt tên thật của họ ở dòng đầu tiên (trong ví dụ là “Bob Smith”), biệt hiệu ở dòng thứ hai (trong ví dụ là “bob”) và địa chỉ email ở dòng thứ ba. Yêu cầu duy nhất là mỗi dòng này phải được đặt trong dấu ngoặc kép và kết thúc bằng dấu chấm phẩy ( ; ).

admin {         "Will Preston";         "will";         "will@example.com"; }; 

Bây giờ ta có thể chuyển sang cấu hình liên quan đến server cụ thể hơn, ngoài thông tin liên hệ đơn giản.

class {} - Cài đặt Kết nối Máy khách và Server

Khối tiếp theo, khối class {} , xác định những gì server sẽ nhớ là "máy khách" kết nối với mạng ( user của bạn) và " server " liên kết với mạng (nếu bạn thêm server IRC của bạn vào một mạng server ) .

Nói chung, các cài đặt này có thể được để ở mặc định cho hầu hết các trường hợp mạng nhỏ. Tuy nhiên, nếu bạn đang vận hành một hoạt động mạng lớn, bạn có thể cần đọc tài liệu về các giá trị trong các khối này làm gì, vì chúng có tính hữu ích nhưng chỉ trong các tình huống rất cụ thể.

Cài đặt mặc định ổn:

class           clients {         pingfreq 90;         maxclients 500;         sendq 100000;         recvq 8000; };        class           servers {         pingfreq 90;         maxclients 10;          /* Max servers we can have linked at a time */         sendq 1000000;         connfreq 100; /* How many seconds between each connection attempt */ }; 

allow {} - Mật khẩu Server , Ngoại lệ

Các khối allow {} cấu hình ai được phép kết nối với mạng.

Nói chung, đối với một server IRC lớn, mở mà bất kỳ ai cũng có thể tham gia, bạn nên để nó ở chế độ mặc định.

Đối với một server mà bạn muốn giữ ở chế độ riêng tư hoặc được bảo vệ bằng password , bạn nên thêm dòng mật khẩu , như trong ví dụ thứ hai allow {} khối, vào khối chung đầu tiên. Khối allow {} đầu tiên có cài đặt chung cho các kết nối client . Bạn có thể thấy rằng giá trị iptên server đều được đặt thành *@* , nghĩa là “mọi người từ mọi nơi”.

Điều này cho phép bạn nhắc user nhập password khi kết nối.

allow {         ip             *@*;         hostname       *@*;         class           clients;         maxperip 5;         password "yourpasswordhere";     };        /* Passworded allow line */ allow {         ip             *@255.255.255.255;         hostname       *@*.passworded.people;         class           clients;         password "f00Ness";         maxperip 1; }; 

Bạn cũng có thể comment khối cho phép thứ hai nếu bạn không cần tinh chỉnh cài đặt cho phép của bạn với các IP khác nhau hoặc các thông số kết nối khác.

Khối tiếp theo, khối allow channel {} , xác định loại kênh hoặc phòng trò chuyện, được miễn các hạn chế được đặt sau này trong file cấu hình.

Giải thích một chút: Trong khối sau này, ta sẽ có thể xác định kênh hoặc từ khóa nào trong tên kênh bị cấm và khối này cho phép ta xác định các trường hợp miễn trừ đối với các lệnh cấm đó. Nói chung, bạn có thể để điều này một mình trừ khi bạn có một trường hợp đặc biệt và cấu hình ví dụ cho ta thấy cách này hoạt động:

    allow channel {         channel "#WarezSucks";         class "clients";     }; 

Ví dụ này làm cho server cho phép tất cả các client truy cập vào kênh #WarezSucks, mặc dù thực tế là các kênh trùng với chuỗi ký tự đại diện *warez* sau này trong file cấu hình bị hạn chế.

Trừ khi bạn gặp một trường hợp cụ thể mà bạn muốn cấm một kênh nhất định mà không phải một số kênh nhất định khác, bạn có thể để nguyên điều này mà không có vấn đề gì.

oper {} - Cài đặt nhà điều hành

Lúc này, khối tiếp theo là một trong những khối quan trọng nhất: khối oper {} , hoặc o:line , xác định thông tin đăng nhập của bạn là chủ sở hữu server hoặc cái mà hầu hết user gọi là IRCop .

Đọc kỹ phần này, vì bạn cần đảm bảo mình làm đúng mọi thứ.

Khối oper {} xác định những gì bạn và bất kỳ user có quyền nào khác được phép làm với quyền là IRCop. Đây là nơi mà các administrator của bạn được xác định, bao gồm cả chính bạn và vì lý do này, có khá nhiều tùy chọn đang hoạt động. Tuy nhiên, bây giờ ta sẽ bắt đầu với một khối ví dụ.

Tệp cấu hình hiện chứa một khối oper {} mẫu, với tên user bobsmith . Tuy nhiên, tôi khuyên bạn chỉ cần xóa hoàn toàn phần này và thay thế bằng khối oper {} của bạn . Bạn cần thêm một khối mới cho từng user mà bạn muốn có với quyền là nhà điều hành trên server của bạn .

Dưới đây, tôi có một ví dụ dòng o: bạn có thể sao chép và paste vào file cấu hình. Các giá trị được biểu thị bằng màu đỏ sẽ do bạn thay đổi.

oper username {     class clients;     from {         userhost *@*;     };     password "yourpasswordhere";     flags {         global;         netadmin;         can_gkline;         can_gzline;         can_zline;         can_kline;         can_unkline;         can_restart;         can_die;         can_rehash;     };     swhois "This will appear when users run a /WHOIS on you"; }; 

Giải thích một chút cho từng mục này như sau:

  • lớp xác định loại toán tử mà user này là, nếu trước đó bạn đã chỉ định một lớp không phải là “máy khách” hoặc “ server ”. Bạn không cần phải thay đổi điều này.
  • Khoá con from {} chứa các tên server (do userhost chỉ định) được phép sử dụng dòng o: này. Nói chung, bạn có thể để nó tại @ , vì hầu hết các client (bao gồm cả bạn) đều có địa chỉ IP động và do đó, tên server luôn thay đổi.
  • mật khẩu xác định password bạn sẽ sử dụng để nhận dạng chính mình đối với server với quyền là người vận hành. Mật khẩu phải được đặt trong dấu ngoặc kép, giống như bất kỳ chuỗi ký tự nào.
  • Khối con flags {} chứa các quyền mà IRCop được chỉ định sẽ có khi được xác định là một toán tử. Tài liệu chính thức có danh sách những gì mỗi chỉ số quyền này thực hiện, nhưng ta sẽ nhanh chóng xem qua chúng để cung cấp cho bạn ý tưởng cơ bản về những gì mong đợi.
  • global xác định liệu IRCop này có được coi là IRCop trên tất cả các server hay không. Ngoài ra, bạn có thể sử dụng local , nơi họ sẽ chỉ có ảnh hưởng đến những user được kết nối với server mà dòng o: của họ đang bật, nhưng đối với dòng o: của bạn , bạn chắc chắn nên sử dụng global .
  • netadmin xác định cấp độ (hoặc “xếp hạng”) IRCop là khi user yêu cầu trợ giúp của nhà điều hành. netadmin là cao nhất, tiếp theo là servicesadmin , tiếp theo là admin , tiếp theo là coadmin , tiếp theo là không có chỉ số xếp hạng nào cả.
  • can_gkline , can_gzline , can_zline , can_klinecan_unkline đều xác định các quyền để có thể áp dụng một số loại cấm user trong trường hợp bạn phải xóa một user có vấn đề. Trong thuật ngữ IRC, ak-line refers to a ban from connecting to the server the line is applied to. A z , also called a g on other types of non-Unreal servers, is like a k-line, except it applies to all servers on the network (while being stored locally on the server the ban is applied on). A gz-line and gk-line are all the same, except their respective -lines are applied across all servers in the network--so if the server the ban is applied on delinks or disconnects from the network, the ban is still considered active. can_unkline` cho phép bạn loại bỏ các lệnh cấm này sau khi cài đặt .
  • can_restart chỉ định rằng bạn được phép gửi lệnh / RESTART đến server để khởi động lại IRCd, ngắt kết nối tất cả user trong quá trình này.
  • can_die chỉ định rằng bạn được phép gửi lệnh / DIE đến server để ngăn IRCd chạy, do đó ngắt kết nối tất cả user .
  • can_rehash chỉ định rằng bạn được phép gửi lệnh / REHASH, lệnh này sẽ reload cấu hình hiện đang hoạt động, hữu ích khi bạn cần áp dụng các thay đổi mà không cần khởi động lại server
  • Cuối cùng, tùy chọn swhois chỉ định bất kỳ thông báo đặc biệt nào bạn muốn user nhìn thấy khi họ chạy / WHOIS trên bạn trong khi bạn được xác định là nhà điều hành. Dòng này có thể được bỏ qua hoàn toàn, nhưng tôi muốn sử dụng đây như một cơ hội để đưa ra một thông điệp hài hước như "Bạn đang xem gì?"

Bạn có thể sao chép dòng o: ở trên khi cần thiết để cung cấp cho tất cả user mà bạn muốn trở thành IRCops. Các mạng nhỏ nói chung chỉ cần 1-2 nhà khai thác; tuy nhiên, bạn có thể cảm thấy cần phải thêm nhiều dòng o: khi mạng của bạn phát triển, để giúp kiểm soát user .

lắng nghe {} - IP, Cổng và SSL

Bây giờ dòng o: của bạn đã được cài đặt , ta có thể chuyển sang các phần quan trọng hơn của cấu hình. Trong khối listen {} bạn có thể cài đặt các cổng mà user có thể kết nối.

Cài đặt mặc định sẽ ổn đối với hầu hết các server .

listen      *:6697 {     options     {         ssl;         clientsonly;     }; };  listen *:8067; listen *:6667; 

Dấu * trước : trong mỗi khai báo nghe nghĩa là “tất cả”. Điều này có thể được thay thế bằng bất kỳ địa chỉ IP nào bạn muốn liên kết với UnrealIRCd. Nếu server của bạn có nhiều IP, bạn cần một khai báo lắng nghe riêng cho từng địa chỉ.

Đối với hầu hết các mục đích, tuy nhiên, bạn sẽ chỉ đơn giản là sử dụng listen *:6667 , và * wildcard sẽ cố gắng để có UnrealIRCd ràng buộc với bất kỳ và tất cả các địa chỉ IP trên cổng quy định sau : Trong trường hợp này, cổng 6667 .

Lưu ý: Để hỗ trợ địa chỉ IPv6 trong UnrealIRCd, bạn phải biên dịch nó với hỗ trợ IPv6 trong hướng dẫn xây dựng ở trên và Server phải hỗ trợ kết nối IPv6. Tuy nhiên, lưu ý khi chỉ định địa chỉ IPv6, bạn phải đặt chính địa chỉ đó trong [ngoặc vuông] để daemon có thể phân biệt giữa IP là gì và cổng là gì:

listen [fd3a::a1c9:b311:985e]:6667 

Trong khối phụ options {} , cờ ssl xác định liệu server có cho phép kết nối SSL hay không. Các clientsonly cờ (như trái ngược với serversonly ) cho phép bạn chỉ định cổng này là dành cho khách hàng hoặc server duy nhất. Nếu không, theo mặc định, cả client và server sẽ có thể kết nối trên cổng này. Các clientsonly cài đặt là tốt.

LƯU Ý: Nếu bạn nhận được lỗi “địa chỉ đã được sử dụng” khi lần đầu tiên khởi động UnrealIRCd, bạn cần thay thế các ký tự đại diện * bằng (các) địa chỉ IP của Server, vì Unreal có thể hoặc không thể suy ra IP chính để ràng buộc.

Khối tiếp theo, link {} , có thể được để lại với cài đặt mặc định. Khối này được sử dụng khi kết nối hai server với nhau để tạo thành mạng IRC, khối này không được đề cập trong hướng dẫn này.

link            hub.mynet.com {         username        *;         hostname        1.2.3.4;         bind-ip         *;         port            7029;         hub             *;         password-connect "LiNk";         password-receive "LiNk";         class           servers;                 options {                         /* Note: You should not use autoconnect when linking services */                         autoconnect;                         ssl;                         zip;                 }; }; 

ulines {} - Dịch vụ có Đặc quyền

ulines {} xác định server nào kết nối với mạng của ta cần có các quyền nâng cao.

Nói chung, khi bạn kết nối các dịch vụ với mạng IRC (các dịch vụ là một tập hợp các chương trình và daemon đặc biệt bổ sung toàn bộ chức năng cho IRC không được tiêu chuẩn RFC chỉ định, chẳng hạn như đăng ký biệt hiệu), bạn sử dụng điều này đảm bảo các dịch vụ ' các quyền được nâng cao hơn các quyền của một server bình thường.

Bạn không nên sử dụng nó cho một server bình thường. Thay thế các server mẫu bằng server dịch vụ của bạn :

ulines {         services.roxnet.org;         stats.roxnet.org; }; 

drpass {} - Mật khẩu cho / RESTART và / DIE

Khối tiếp theo, drpass {} , xác định password nào sẽ được đặt trong trường hợp IRCop chọn sử dụng các lệnh / DIE hoặc / RESTART trên server .

Ngay cả khi IRCop có quyền để làm điều này, thì bạn nên đặt password cho việc này đề phòng trường hợp quyền IRCop của họ bị xâm phạm. Bằng cách này, account nhà điều hành bị xâm phạm không thể làm hỏng server với quyền truy cập IRCop đơn giản.

drpass {     restart "your-restart-password-here";     die "your-die-password-here"; }; 

nhật ký {} - Cài đặt log

Khối tiếp theo, khối log {} , có thể được để lại với các cài đặt mặc định.

Bạn có thể đọc tài liệu để biết thông tin về khối log nếu bạn muốn, nhưng nói chung, bạn có thể để nguyên như vậy. UnrealIRCd rất kỹ trong việc lưu giữ log của bạn .

alias {} - Bí danh Lệnh

Chuỗi khối tiếp theo, các khối alias {} , chứa các định nghĩa cho alias lệnh trong trường hợp bạn định cài đặt các dịch vụ cùng với server IRC mới của bạn .

Nếu bạn không có kế hoạch chạy dịch vụ với server mới của bạn , bạn có thể để nguyên các khối này mà không cần lo lắng.

file {} - Bao gồm file cấu hình

Khối tiếp theo mà ta sẽ điều chỉnh là khối files {} , trong đó bạn chỉ định các file đặc biệt nhất định được đưa vào cấu hình.

Hầu hết trong số này được comment ra, nhưng ít nhất bạn nên tìm kiếm, bỏ ghi chú và chỉ định những điều sau. CẢNH BÁO: UnrealIRCd sẽ không bắt đầu nếu chỉ định các file nào không tồn tại ở đây. Khi chỉnh sửa xong cấu hình, bạn CẦN tạo các file này. Ta sẽ tạo hai file ở đây sau trong hướng dẫn.

Định vị và bỏ ghi chú hai file này:

motd ircd.motd;  ...  rules ircd.rules 
  • Tham số motd chỉ định MOTD của server , hoặc thông báo trong ngày , được gửi đến user khi kết nối hoặc khi họ sử dụng lệnh / MOTD.
  • Tham số rules chỉ định file chứa luật server được cung cấp bởi lệnh / RULES. Tôi khuyên bạn nên suy nghĩ về các luật của server của bạn , vì IRC trước đây đã nổi tiếng với một số chia sẻ file không hợp lệ và những thứ tương tự.

tld {} - Ngoại lệ Quốc tế

Khối tiếp theo, khối tld {} , về mặt chức năng giống như khối files , ngoại trừ việc nó cho phép bạn đặt các ngoại lệ đặc biệt cho user kết nối từ các quốc gia khác nhau, như được chỉ ra bởi domain cấp cao nhất của họ (ví dụ: .au cho Úc, .ru cho Nga, v.v.).

Bạn có thể cần comment phần này vì các file bạn tạo trong phần này cũng được yêu cầu nhiều như các file được tìm thấy trong khối files {} thích hợp. Đính kèm phần này trong các chú thích kiểu C:

/* tld {     ... }; */ 

Bằng cách này, nó không còn áp dụng cho cấu hình hiện tại.

Phần tiếp theo là hoàn toàn tùy chọn; tuy nhiên, bởi vì ta đang đề cập đến cấu hình theo tuần tự, nên ít nhất có thể đọc lướt qua các hướng dẫn để bạn hiểu mỗi khối làm gì.

cấm {} - Cấm biệt hiệu, IP và tên

Tất cả các phần này có thể được để lại với cài đặt mặc định.

Trong phần này, ta sẽ xem xét nhiều cách khác nhau để bảo vệ server của bạn khỏi những user độc hại thông qua cấu hình server .

Khối tiếp theo, khối ban {} , cho phép bạn cấm sử dụng một biệt hiệu cụ thể hoặc cách khác, một địa chỉ IP cụ thể kết nối với server , cũng như toàn bộ một loạt các tùy chọn khác.

Lưu ý bạn nên chọn một biệt hiệu hoặc một IP, không phải cả hai, cho một khối lệnh cấm riêng lẻ.

ban nick/ip {     mask ["nickname*goes*here"/12.223.98.1]; // Banned nick or IP     reason "Put your reason for the ban here"; }; 

Hoặc chỉ cần comment nó ra:

/* ban nick {         mask "*C*h*a*n*S*e*r*v*";         reason "Reserved for Services"; }; */ 

Lưu ý bạn cũng có thể sử dụng mặt nạ server IRC thực tế ( user@host.name ) trong trường mặt nạ thay vì nick hoặc IP để cấm một user cụ thể – chỉ cần đảm bảo chỉ định ban user thay vì ban ip hoặc ban nick .

Cuối cùng, bạn cũng có thể cấm sử dụng một realname cụ thể. Khi user cài đặt khách hàng của họ lần đầu tiên, họ có thể chỉ định “tên thật” của bạn trong cài đặt user . Cài đặt này áp dụng cho những. Ví dụ: để cấm tất cả user có tên Jack:

ban realname {     mask "Jack";     reason "Go away!"; }; 

Lưu ý: Lệnh cấm ở trên có phần vô dụng, vì user chỉ có thể thay đổi tên thật của họ trong cài đặt ứng dụng client , nhưng nó ở đây để hoàn thiện.

Bạn cũng có thể cài đặt các ngoại lệ cấm, chẳng hạn như sau:

except ban {     // My username is sigtau--don't ban me!     mask    *sigtau*@* }; 

Bây giờ ta đã xem xét các khối ban {} , được sử dụng để chống lại user , ta hãy xem xét một loại khối khác được dùng để chống lại các loại hoạt động độc hại khác.

từ chối {} - Hạn chế Hoạt động Không phải của User

Cài đặt khối deny {} mặc định có thể được giữ nguyên cho hầu hết các server .

Khi IRC là một giao thức rất phổ biến trong những năm 80, 90 và đầu những năm 2000, một giao thức bổ sung khác được yêu cầu cho những user muốn giao tiếp trực tiếp qua IRC mà không cần server tập trung của người trung gian. Giao thức DCC (direct client-to-client) ra đời, cho phép user làm những việc mà IRC bình thường không thể làm được, chẳng hạn như gửi tin nhắn trò chuyện trực tiếp cho nhau, cũng như chia sẻ file .

Tuy nhiên, khía cạnh chia sẻ file đã mở ra một loạt lỗ hổng bảo mật khi DCC ngày càng phổ biến đối với những user không đủ hiểu biết để phân biệt các file có bản chất độc hại hoặc độc hại. Do đó, một số daemon IRC bắt đầu hạn chế một số loại yêu cầu DCC nhất định để ngăn chặn loại hoạt động này.

UnrealIRCd nằm trong số các daemon IRC này. Khối deny có khả năng thực hiện một loạt các việc hạn chế khác nhau, bao gồm cả việc chặn các loại truyền file này. Ví dụ: trong cấu hình mẫu, bạn sẽ tìm thấy khối này:

deny dcc {     filename "*sub7*"; // note that this supports wildcards     reason "Possible Sub7 Virus"; }; 

Điều này khiến mọi yêu cầu DCC được gửi qua server có chứa chuỗi “sub7” (dựa trên trojan Sub7 khét tiếng từ những ngày IRC trước đó) đều không được phép.

Một khối deny cũng có thể ngăn user tham gia hoặc tạo một số loại kênh nhất định. Bạn có nhớ trước đây ta đã cho phép user tham gia một kênh có tên là #WarezSucks không? Đây là khối deny mà ta đã chống lại:

deny channel {     channel "*warez*";     reason "Warez is illegal";     class "clients"; }; 

Điều này ngăn không cho mọi user tạo kênh có từ "warez" trong tên.

vhost {} - Ẩn Tên Server của User

Hầu hết các server có thể sử dụng khối vhost {} mặc định.

Mặc dù một số gói dịch vụ IRC phổ biến cho phép bạn thực hiện việc này mà không cần chỉnh sửa file cấu hình, nhưng cách cũ để ẩn tên server của user với nhau là tự động và không yêu cầu user phải có biệt hiệu đã đăng ký.

Điều này hữu ích cho những user kết nối qua một bouncer nhưng sử dụng biệt hiệu mà họ không muốn đăng ký hoặc nếu server của bạn không có dịch vụ để bắt đầu.

Khối vhost tùy chọn đặt tên server giả cho user được chỉ định. Ta sẽ xem xét một cài đặt trước trong cấu hình mẫu:

vhost {     vhost       i.hate.microsefrs.com;     from {         userhost *@*.image.dk;     };     login       stskeeps;     password    moocowsrulemyworld; }; 

Điều này cho phép user kết nối từ tên server *@*.image.dk đặt tên server của họ thành *@i.hate.microsefrs.com . User thường thực hiện việc này bằng lệnh / CHGHOST.

Việc sử dụng lệnh này đã giảm đi đáng kể so với việc sử dụng các gói dịch vụ IRC thực hiện cùng một chức năng, vì vậy đối với hầu hết các mục đích, bạn không cần phải hiểu kỹ về cách khối này hoạt động để cài đặt một mạng IRC hoạt động đúng chức năng.

đặt {} - Cấu hình mạng

Phần này là hoàn toàn cần thiết ! Daemon IRC sẽ không khởi động trừ khi bạn cấu hình đúng phần này!

Nếu bạn đã theo dõi, khối tiếp theo sẽ là một trong những khối cuối cùng, và trớ trêu thay, một trong những khối quan trọng nhất: khối set {} .

Khối set {} chứa nhiều tùy chọn cấu hình mà server cần để hoạt động. Dưới đây là bản sao của cấu hình ví dụ như bạn sẽ thấy, với các comment nội dòng được bổ sung giải thích chức năng của mỗi tùy chọn. Bạn không cần sao chép các comment vào file cấu hình trừ khi bạn thấy chúng hữu ích.

Hầu hết nếu không phải tất cả các tùy chọn này là bắt buộc, vì vậy bạn chỉ cần chỉnh sửa chúng theo ý thích của bạn thay vì bỏ sỉ. Lưu ý nếu bạn dự định liên kết nhiều server với nhau, tốt nhất là bạn nên giữ các server này nhất quán và giống nhau trên tất cả các server . Nếu bạn không có kế hoạch liên kết các server , các tùy chọn này vẫn phải được cấu hình.

Hầu hết các tùy chọn này chỉ liên quan đến việc thay thế domain mẫu bằng domain của bạn .

Lưu ý bạn sẽ phải tạo ba giá trị ngẫu nhiên cho ba cloak-keys .

set {     network-name "ROXnet"; // This is the name of the network reported to clients                    // upon joining, and in many popular IRC clients, is the                    // formal name used for tabbed view and logs.     default-server "irc.roxnet.org"; // Replace this with your server's domain--the                      // daemon reports this to the client as being                      // the network's proper hostname.     services-server "services.roxnet.org"; // If you plan to add services to your                            // IRC server, use the same domain as                            // above, e.g. services.mydomain.com.                            // Even if you aren't going to run                            // services, you should do this anyway.     stats-server "stats.roxnet.org"; // Same as the above, except with stats                      // stats servers.     help-channel "#ROXnet"; // Set this to a be your network's official "help                 // channel" so that users have a place to go in case                 // they need help with something that only an IRCop                 // or server administrator could do.     hiddenhost-prefix "rox"; // For anonimity purposes, UnrealIRCd masks users'                  // IP addresses using 'hidden hosts'--i.e. the host                  // user331.newyork.someISP.com is converted to                  // hiddenhost-3AB66E2-newyork.someISP.com.  This value                  // can be customized--change "rox" to whatever you                  // want (generally, alphanumeric lowercase) the hidden                  // host mask to be.  This is sometimes referred to as                  // "cloaking."     cloak-keys {         "brespumuste6ewR";         "fUkAChekEswu6ed";         "4aFachehetawedR";     };      // The above block are the random seeds used to generate unique cloaks for     // each user without revealing their hostname to one another.  Generally, a     // 10-20 character random alphanumeric mixed-case string will do.  Any online     // password generator will work, or if you're in a pinch, just type whatever     // alphanumeric string you want in all three string fields.     //     // THERE MUST BE EXACTLY THREE STRINGS.      hosts {         local       "locops.roxnet.org";         global      "ircops.roxnet.org";         coadmin     "admin.roxnet.org";         admin       "admin.roxnet.org";         servicesadmin   "csops.roxnet.org";         netadmin    "netadmin.roxnet.org";         host-on-oper-up "no";     };      // The above block can go mostly unchanged, apart from changing "roxnet.org"     // to your domain of choice.  Setting host-on-oper-up automatically changes     // the hostname of the IRCop user to be one of the above based on their rank     // indicators in their o:line flags (`local`, `global`, `admin`, etc.). }; 

Khối cuối cùng trong cấu hình phải là khối set {} khác, nhưng lần này, các tùy chọn dành riêng cho version server này thay vì nhất quán trên toàn bộ mạng.

Bạn phải đặt địa chỉ email kline nếu không server sẽ không khởi động.

Phần còn lại của các cài đặt này có thể được để làm mặc định cho hầu hết các server .

set {     kline-address "contact@example.com"; // When k-lines are applied, users are sometimes                     // instructed to contact a particular e-mail for                     // more information.  This should be that e-mail.     modes-on-connect "+ixw"; // Leave these at default; however if you need to tweak                  // what modes users are automatically assigned upon                  // connecting, you can view the full mode reference                  // here: http://www.unrealircd.com/files/docs/unreal32docs.html#userchannelmodes     modes-on-oper "+xwgs";   // These are modes that are applied when a user first                  // authenticates as an IRCop.  These are generally left                  // alone as well, but you can use the above link again                  // if you, for some reason, need to tweak these.     oper-auto-join "#opers"; // This is the channel that IRCops are set to                  // be force-joined to as soon as they authenticate as                  // an IRCop.  You can set multiple channels by                  // delimiting them with commas: #chan1,#chan2,...     maxchannelsperuser 10; // This is the maximum number of channels any one user                    // session can be joined to.  You may raise or lower this                    // as needed, however it must be greater than or equal                    // to 1.     options {         hide-ulines; // This means any server specified in the ulines {} block                  // will not appear when a connected user uses /list.                  // IRCops automatically override this when they use /list.         show-connect-info; // This allows a user to see messages such as                    // "Looking up your hostname..." and "Requesting                    // identd..." when they are connecting.  Generally a                    // good idea to keep this.     };      anti-spam-quit-message-time 10s; // In the past, IRC servers have had issues                      // with users joining and quitting with long                      // quit messages in rapid succession to spam                      // the server.  This helps combat that by                      // specifying how long a user must be                       // connected before the server will allow them                      // to specify a message when using /QUIT.                      // You can leave this as it is or change it.     oper-only-stats "okfGsMRUEelLCXzdD"; // You should probably leave this alone,                          // it defines which server stats are                          // restricted to be viewable by IRCops only.                          // Since there's too many stat modes to list                          // for an article, here's a hint: once your                          // server is up and running, use the /stats                          // command (while authenticated as an IRCop)                          // to get a list of character->stat pairs,                          // which can be used to modify this list.     throttle { // When users disconnect, their clients will try to reconnect them.            // This prevents it from happening too quickly, potentially putting            // the server under high load.         connections 3; // The number of connections allowed...         period 60s; // ...per x seconds, as specified here.     };      anti-flood { // This configures anti-flood settings to prevent users from              // flooding the server with unnecessary commands.         nick-flood 3:60; // Allows 3 nick changes per 60 seconds.          // Some other useful options to read up on are away-flood for how         // many times a user can use /AWAY, or unknown-flood-amount for         // users that send unknown garbage data to the server.     };      spamfilter { // This controls settings for spam filtering and default ban info.         ban-time 1d; // This is the default duration of a k-line/z-line ban when                  // automatically set by a spam filter.         ban-reason "Spam/Advertising" // The message used by automatic bans.         virus-help-channel "#help"; // The channel users can turn to if they                         // need help with viruses such as those                         // sent over DCC.     }; }; 

Đó là nó!

Lưu các thay đổi vào file cấu hình, đảm bảo nó được lưu dưới dạng unrealircd.conf . Nhấn CTRL-x , rồi đến y , rồi nhấn Enter .

Xin chúc mừng, bạn đã chỉnh sửa xong file cấu hình! Hãy hoàn thành một số bước cuối cùng trước khi ta có thể khởi động server .

Bước 6 - Tạo ircd.rules và ircd.motd

Hai file cần được tạo trước khi UnrealIRCd khởi động: ircd.rulesircd.motd . Tại dấu nhắc shell của bạn, hãy nhập nội dung sau để tạo file cho các luật server của bạn:

nano ~/Unreal3.2.10.4/ircd.rules 

Bây giờ, bạn có thể nhập các luật server của bạn dưới dạng văn bản thuần túy. User sẽ được hiển thị với những điều này khi gõ lệnh / RULES. Lưu ý bạn nên giữ các dòng trong file này dài dưới 80 ký tự để ngăn chúng tự động bị IRCd bao bọc (nếu bạn sử dụng thụt lề, điều này có thể gây khó khăn).

Lưu các thay đổi . Tạo thông điệp của file ngày:

nano ~/Unreal3.2.10.4/ircd.motd 

Đây là nơi bạn có thể nhập MOTD của bạn , sẽ được hiển thị khi user kết nối với server . Giới hạn độ dài dòng 80 ký tự tương tự cũng được áp dụng ở đây. Thông tin hữu ích để đưa vào file này sẽ là các kênh nổi bật, phân tích nhanh các luật server , IRCops hiện tại, v.v. Bạn có thể đặt bất cứ điều gì bạn muốn ở đây dưới dạng văn bản thuần túy.

Lưu các thay đổi .

Nếu bạn đã liệt kê các file nào khác trong cấu hình của bạn , hãy tạo chúng ngay bây giờ.

Bước 7 - Tệp log IRCd

Để đảm bảo IRCd có một nơi để lưu trữ log của nó, hãy tiếp tục và tạo một file trống dành riêng cho điều đó.

touch ~/Unreal3.2.10.4/ircd.log 

Bước 8 - Khởi động UnrealIRCd

Xin chúc mừng! Bạn đã cài đặt thành công daemon IRC của riêng mình.

Di chuyển đến folder Unreal:

cd ~/Unreal3.2.10.4 

Khởi động server trò chuyện:

./unreal start 

Bạn sẽ thấy một thông báo như thế này:

* Loading IRCd configuration .. * Configuration loaded without any problems .. * Initializing SSL. * Dynamic configuration initialized .. booting IRCd. 

Nếu có lỗi khởi động, hãy kiểm tra số dòng và cài đặt được đề cập trong lỗi. Bạn có thể xác định sự cố trong file cấu hình của bạn .

Khi server khởi động, bạn có thể kết nối với server của bạn thông qua client IRC yêu thích của bạn. Tôi khuyên bạn nên làm như vậy trên máy local của bạn thay vì trên Server, đảm bảo những user khác có thể kết nối.

Bước 9 - Kết nối Khách hàng IRC

Trong ứng dụng IRC yêu thích của bạn, hãy nhập:

/server your Server IP address or domain here 6667 

Bạn cần domain hoặc địa chỉ IP và số cổng (trong ví dụ này là 6667). Nếu bạn đặt password chung cho server trong khối allow {} , bạn cũng cần sử dụng password đó.

Một số ứng dụng client IRC phổ biến dành cho Windows là mIRC , HexChatPidgin . Nếu bạn đang sử dụng Linux, X-Chat có sẵn miễn phí. Đối với OS X, X-Chat Azure và một vài ứng dụng trả phí trên App Store có sẵn.

Bước 10 - Xác thực nhà điều hành

Sau khi kết nối, bạn cần xác thực như một IRCop. Để xác thực dưới dạng toán tử, hãy nhập:

/oper your-oline-username your-oline-password 

Đây là các thông tin xác thực bạn đã đặt trong khối oper {} .

Sau đó, bạn sẽ buộc phải tham gia vào các kênh mà ta đã chỉ định trước đó trong tính oper-auto-join , cho biết rằng bạn hiện là nhà điều hành IRC.

Lưu ý về Kết nối qua SSL

Vì version server được cài đặt bằng certificate SSL tự ký, một số ứng dụng client có thể không cho phép bạn kết nối qua SSL do certificate “không hợp lệ” hoặc “không tin cậy ”. Bạn nên tìm kiếm phương tiện tạo certificate SSL hợp lệ bằng dịch vụ miễn phí như CACert.org hoặc tổ chức phát hành certificate trả phí (CA) mà bạn chọn.

Tận hưởng server IRC mới của bạn! Từ đây, bây giờ bạn có thể cài đặt dịch vụ hoặc bắt đầu mời user . Trò chuyện vui vẻ!


Tags:

Các tin liên quan

Cách cấu hình xác thực dựa trên khóa SSH trên server Linux
2014-10-20
Cách bảo vệ server của bạn trước lỗ hổng POODLE SSLv3
2014-10-15
Cách sử dụng cấu hình cloud để thiết lập server ban đầu của bạn
2014-10-13
Cách bảo vệ server của bạn trước lỗ hổng bảo mật do Shellshock Bash
2014-09-25
Cách cài đặt server Percona mới hoặc thay thế MySQL
2014-09-18
Cách cài đặt puppet để quản lý cơ sở hạ tầng server của bạn
2014-08-15
Cách cấu hình BIND làm server DNS Mạng riêng trên Ubuntu 14.04
2014-08-12
Cách cấu hình BIND làm server DNS Mạng riêng trên Ubuntu 14.04
2014-08-12
Thiết lập server ban đầu với CentOS 7
2014-07-21
Cách cài đặt Linux, Apache, MySQL, PHP (LAMP) trên CentOS 7
2014-07-21