Linux Servers
Unix có hai cách đ t ch c các d ch v m ng: ể ổ ứ ị ụ ạ hoặc là khởi động ngay từ đầu chương trình server
dưới dạng daemon, hoặc là để công tác khởi động chương trình dịch vụ theo yêu cầu (khi có yêu
cầu kết nối) với sự trợ giúp của một tiến trình daemon khác là inetd (đọc là inét đê). Trong trường
hợp đầu, ta cần cho mỗi dịch vụ ít nhất một daemon và tài nguyên của hệ thống bị sử dụng ngay
cả khi không có yêu cầu kết nối. Còn trong trường...
Linux Servers
Inetd và các dịch vụ mạng
Inetd
Unix có hai cách để tổ chức các dịch vụ mạng: hoặc là khởi động ngay từ đầu chương trình server
dưới dạng daemon, hoặc là để công tác khởi động chương trình dịch vụ theo yêu cầu (khi có yêu
cầu kết nối) với sự trợ giúp của một tiến trình daemon khác là inetd (đọc là inét đê). Trong trường
hợp đầu, ta cần cho mỗi dịch vụ ít nhất một daemon và tài nguyên của hệ thống bị sử dụng ngay
cả khi không có yêu cầu kết nối. Còn trong trường hợp sau ta cần một daemon cho tất cả các dịch
vụ. Tài nguyên hệ thống chỉ thực sự bị chiếm dụng khi có yêu cầu kết nối. Vì vậy, chương trình
server dạng daemon thường trực được dùng cho các dịch vụ có yêu cầu kết nối thường xuyên như
DNS, mail, Web ; còn sơ đồ qua inetd dành cho các dịch vụ với tần số sử dụng thưa như ftp, telnet,
secure shell …
Chương trình inetd, còn gọi là super-server, được sử dụng để khởi động các daemon phục vụ các
dịch vụ mạng. inetd đợi các nối mạng sau một số cổng được quy định bởi tập tin cấu hình
/etc/inetd.conf. inetd của RedHat Linux 7.1 sử dụng tập tin /etc/xinetd.conf và các tập tin trong thư
mục /etc/xinet.d. Khi có yêu cầu kết nối, inetd sẽ gọi chương trình server tương ứng để thiết lập
các kết nối và phục vụ khách hàng. Thông thường, inetd được khởi động ngay từ đầu bởi các script
dùng cho khởi động máy. inetd sẽ đọc file cấu hình /etc/inetd.conf khi được gọi lên bộ nhớ. Sau đây
là một vài dòng của tập tin /etc/inetd.conf
#
# Echo, discard, daytime, and chargen are used primarily for
testing.
# To re-read this file after changes, just do a 'killall -HUP
inetd'
#time stream tcp nowait root internal
#time dgram udp wait root internal
#
# These are standard services.
#
ftp stream tcp nowait root /usr/sbin/tcpd in.ftpd -l -a
telnet stream tcp nowait root /usr/sbin/tcpd in.telnetd
Bên cạnh tập tin cấu hình /etc/inetd.conf, tập tin /etc/services cũng được inetd sử dụng để biết các
cổng (port) của các chương trình server. Ví dụ một đoạn của tập tin /etc/services
ftp-data 20/tcp
ftp 21/tcp
fsp 21/udp fspd
ssh 22/tcp # SSH Remote Login Protocol
ssh 22/udp # SSH Remote Login Protocol
telnet 23/tcp
# 24 - private
smtp 25/tcp mail
# 26 - unassigned
time 37/tcp timserver
time 37/udp timserver
rlp #9; 39/udp resource # resource location
nameserver 42/tcp name # IEN 116
whois 43/tcp nicname
re-mail-ck 50/tcp # Remote Mail Checking Protocol
re-mail-ck 50/udp # Remote Mail Checking Protocol
domain 53/tcp nameserver # name-domain server
domain 53/udp nameserver
Hai tập tin /etc/inetd.conf và /etc/services quan hệ mật thiết với nhau. Cột đầu tiên bao gồm tên các
dịch vụ mạng và cần phải giống nhau. Một dịch vụ muốn được hoạt động nhờ inetd phải khai báo
cổng mà nó đợi khách hàng thông qua /etc/services và dòng lệnh khởi động nó trong /etc/inetd.conf.
Muốn tắt một dịch vụ, ta chỉ cần đặt dấu chú thích # trước dòng miêu tả dịch vụ và khi đó, inetd sẽ
không biết và không gọi dịch vụ đó nữa. Như các bạn đọc nhận thấy nội dung của cột
cho các dịch vụ là /usr/sbin/tcpd in.telnetd. Chương trình tcpd được inetd gọi
lên trước để làm một số công tác kiểm tra và ghi log trước khi chương trình dịch vụ thực được gọi
lên. Cụ thể là tcpd sẽ sử dụng
Cột cho biết chương trình inetd có phải đợi (wait) hay không (nowait) kết nối kết thúc
trước khi "tiếp" một kết nối khác. Ví dụ trên với telnet cho thấy nhiều chương trình khách có thể
được phục vụ một lúc qua cùng một cổng telnet 23. Tất nhiên chương trình server telnet cũng phải
được thiết kế thích hợp với kiểu làm việc đa khách hàng này.
Cột quy định quyền của tiến trình khi nó được chạy trên bộ nhớ. Trong trường hợp có nghi
ngờ về tính bảo mật của một dịch vụ, ta có thể giảm quyền của nó bằng cách thay đổi nội dung
của cột này.
Qua ví dụ trên ta thấy dịch vụ ftp sẽ được inetd gọi lên thông qua dòng lệnh /usr/sbin/tcpd in.ftpd -l
–a khi có một chương trình khách hàng dùng giao thức TCP gọi qua cổng 21.
Đọc thêm. Tiến trình được sinh ra như thế nào? Trên một máy chủ Unix, thường có hàng chục tiến
trình đang đồng thời hoạt động. Trên những máy chủ lớn và bận bịu, có thể có hàng ngàn tiến trình
cùng lúc.
Vậy tiến trình được hình thành như thế nào ?
Nếu con người được sinh ra bởi con người thì tiến trình cũng sinh ra bởi tiến trình. Chỉ có một điều
khác là phải cần 2 người làm cha mẹ mới có trẻ em (trừ những dự định clone người hiện nay), còn
tiến trình thì chỉ có một tiến trình cha. Khi hệ thống khởi động, tiến trình đầu tiên là init. Sau đó,
init sẽ sinh ra các tiến trình khác cần thiết cho sự hoạt động của hệ thống. Ví dụ mỗi khi ta đăng
nhập hệ thống, tiến trình login sau khi kiểm tra mật khẩu sẽ sinh ra một tiến trình shell để người
sử dụng có thể làm việc thông qua các dòng lệnh của shell. Có 2 lệnh liên quan tới việc hình thành
các tiến trình là lệnh fork và execve. Lệnh fork cho phép hình thành một tiến trình con giống hệt
tiến trình cha và cả hai sau đó cùng được song song hoạt động và được HĐH đối xử như nhau. Hai
tiến trình này chỉ khác nhau về PID và người ta có thể biết rằng hiện đang ở tiến trình bằng cách
xem giá trị trở về của lệnh fork: nếu bằng 0, ta đang ở tiến trình cha, nếu khác 0 thì đó là PID của
tiến trình con. Lệnh execve thì thay thế một tiến trình bằng một tiến trình khác. Như vậy, nếu ta
đang có một tiến trình A, tiến trình B có thể sinh ra từ A bằng cách A fork ra A’ rồi trong A’ ta
dùng lệnh execve để thay thế A’ bằng B.
Đoạn chương trình sau cho phép hiểu rõ hơn các miêu tả trên
if (fork() == 0) {
/* I am the child, I will become ls /usr/bin */
execl("/bin/ls","ls","/usr/bin", (char *) 0);
}
else {
/* I’m parent, do whatever perent’s sopposed to do*/
}
Các biến tấu của execve tạo thành một họ các hàm exec (exec family). Linux có thêm clone để tạo
các threads (tiểu tiến trình). Trong trường hợp hệ thống quá tải, lệnh fork sẽ không thành công do
tài nguyên hệ thống đã bị vét cạn. Khi đó ta sẽ có thông báo lỗi trên màn hình gắn trực tiếp với máy
chủ và máy chủ cần được xem xét sửa chữa hoặc nâng cấp.
FTP
# default: on
# description: The wu-ftpd FTP server serves FTP connections.
It uses \
# normal, unencrypted usernames and passwords for
authentication.
service ftp
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/in.ftpd
server_args = -l -a
log_on_success += DURATION
nice = 10
}
POP 3
# default: off
# description: The POP3S service allows remote users to access
their mail \
# using an POP3 client with SSL support such as fetchmail.
service pop3s
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/ipop3d
log_on_success += USERID
log_on_failure += USERID
}
IMAP
# default: off
# description: The IMAP service allows remote users to access
their mail using \
# an IMAP client such as Mutt, Pine, fetchmail, or Netscape \
# Communicator.
service imap
{
disable = no
socket_type = stream
wait = no
user = root
server = /usr/sbin/imapd
log_on_success += DURATION USERID
log_on_failure += USERID
}