Bài 11: Firewall — NT140 Network Security

1. Tổng quan về Firewall

Firewall là gì?

Firewall là một thành phần của hệ thống máy tính hoặc mạng được thiết kế để ngăn chặn lưu lượng truy cập trái phép di chuyển từ mạng này sang mạng khác. Cụ thể hơn:

  • Phân tách các thành phần tin cậy (trusted) và không tin cậy (untrusted) trong mạng.
  • Phân biệt các mạng con ngay cả bên trong vùng tin cậy.
  • Chức năng chính: lọc dữ liệu (filtering), chuyển hướng lưu lượng (redirecting traffic), và bảo vệ chống lại các cuộc tấn công mạng.

Yêu cầu của một Firewall

  1. Tất cả lưu lượng đi giữa các vùng tin cậy khác nhau phải đi qua firewall — không có đường vòng.
  2. Chỉ lưu lượng được phép theo chính sách bảo mật mới được thông qua.
  3. Bản thân firewall phải miễn nhiễm với các cuộc tấn công xâm nhập — đòi hỏi một hệ điều hành được hardened và cấu hình bảo mật nghiêm ngặt.

2. Chính sách Firewall (Firewall Policy)

Firewall kiểm soát truy cập theo ba chiều:

User Control — Kiểm soát dựa trên vai trò của người dùng đang cố truy cập. Áp dụng cho các người dùng bên trong vành đai firewall.

Service Control — Kiểm soát dựa trên loại dịch vụ mà host cung cấp. Áp dụng dựa trên địa chỉ mạng, giao thức kết nối, và số port.

Direction Control — Xác định chiều mà các yêu cầu có thể được khởi tạo và cho phép đi qua firewall:

  • Inbound: Lưu lượng từ mạng ngoài vào firewall (ingress).
  • Outbound: Lưu lượng từ bên trong ra ngoài (egress).

Các hành động của Firewall

Hành độngMô tả
AcceptedCho phép gói tin đi qua vào mạng/host đích
DeniedKhông cho phép gói tin đi qua, huỷ im lặng
RejectedTương tự Denied nhưng gửi lại thông báo ICMP cho nguồn biết gói bị từ chối

3. Các loại Firewall

graph TD A[Firewall] --> B[Packet Filter Firewall] A --> C[Stateful Firewall] A --> D[Application/Proxy Firewall]

3.1 Packet Filter Firewall (Stateless Firewall)

Firewall loại này hoạt động bằng cách kiểm tra thông tin trong header của từng gói tin một cách độc lập, không quan tâm đến payload (dữ liệu ứng dụng).

Đặc điểm:

  • Không quan tâm gói tin có thuộc về một luồng dữ liệu đang tồn tại hay không.
  • Không duy trì trạng thái (state) về các gói tin — đó là lý do còn gọi là Stateless Firewall.
  • Quyết định dựa trên từng gói tin riêng lẻ: địa chỉ IP nguồn/đích, port, giao thức.

Ưu điểm: Nhanh, đơn giản, ít tốn tài nguyên.

Nhược điểm: Dễ bị bypass bởi các kỹ thuật giả mạo (spoofing), không thể phân tích ngữ cảnh kết nối.

3.2 Stateful Firewall

Firewall loại này theo dõi trạng thái của từng kết nối theo thời gian.

Đặc điểm:

  • Ghi lại các thuộc tính như địa chỉ IP, số port, sequence number — được gọi chung là connection state.
  • Duy trì một Connection State Table để hiểu ngữ cảnh của từng gói tin.
  • Ví dụ: chỉ cho phép kết nối đến các port đang có kết nối mở hợp lệ.

Lợi ích: Có thể phân biệt gói tin hợp lệ thuộc về kết nối đang chạy với gói tin giả mạo được tạo ra để bypass firewall.

3.3 Application/Proxy Firewall

Firewall loại này phân tích dữ liệu đến tầng ứng dụng (Layer 7).

Cơ chế hoạt động:

  • Đóng vai trò là trung gian (intermediary) — giả mạo làm đích đến thực sự.
  • Kết nối từ client kết thúc tại proxy; proxy mở một kết nối mới đến đích thực.
  • Phân tích toàn bộ nội dung gói tin đến tầng ứng dụng để quyết định cho phép hay từ chối.
sequenceDiagram participant Client participant Proxy participant Server Client->>Proxy: Request (connection terminates here) Proxy->>Server: Forwarded Request (new connection) Server->>Proxy: Reply Proxy->>Client: Forwarded Reply

4. Xây dựng Firewall với Netfilter

4.1 Cơ chế hoạt động

Để implement packet filter firewall trong Linux kernel, cần hai cơ chế:

Netfilter — Framework cung cấp các hook (điểm móc) tại các vị trí quan trọng trên đường đi của gói tin trong Linux Kernel. Mỗi protocol stack định nghĩa một loạt hook theo đường đi của gói tin.

Loadable Kernel Modules (LKM) — Cho phép người dùng có đặc quyền thêm/gỡ module vào kernel một cách động mà không cần recompile toàn bộ kernel.

4.2 Loadable Kernel Modules

Một kernel module cơ bản có hai điểm vào/ra:

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>

static int kmodule_init(void) {
    printk(KERN_INFO "Initializing this module\n");
    return 0;
}

static void kmodule_exit(void) {
    printk(KERN_INFO "Module cleanup\n");
}

module_init(kmodule_init);
module_exit(kmodule_exit);
MODULE_LICENSE("GPL");
  • module_init(): Hàm khởi tạo được gọi khi module được nạp vào kernel (insmod).
  • module_exit(): Hàm dọn dẹp được gọi khi module bị gỡ ra (rmmod).

Compile kernel module:

obj-m += kMod.o
all:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:
    make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean

Sử dụng module:

# Nạp module vào kernel
sudo insmod kMod.ko

# Kiểm tra module đang chạy
lsmod | grep kMod

# Gỡ module
sudo rmmod kMod

# Xem log kernel (output của printk)
dmesg

4.3 Netfilter Hooks cho IPv4

Netfilter định nghĩa 5 hook trên đường đi của gói tin IPv4:

graph LR NET[Network] --> PRE[NF_IP_PRE_ROUTING] PRE --> RD1{Routing Decision} RD1 -->|Local| IN[NF_IP_LOCAL_IN] RD1 -->|Forward| FWD[NF_IP_FORWARD] IN --> LP[Local Process] LP --> OUT[NF_IP_LOCAL_OUT] FWD --> POST[NF_IP_POST_ROUTING] OUT --> RD2{Routing Decision} RD2 --> POST POST --> NET2[Network Out]
HookVị tríDùng cho
NF_IP_PRE_ROUTINGNgay sau khi gói tin đến, trước routingLọc tất cả traffic vào, DNAT
NF_IP_LOCAL_INSau routing, gói tin dành cho localLọc traffic đến local process
NF_IP_FORWARDGói tin được chuyển tiếpLọc traffic đi qua router
NF_IP_LOCAL_OUTGói tin từ local process raLọc traffic từ local process
NF_IP_POST_ROUTINGSau routing, trước khi ra dâySNAT, lọc outgoing

4.4 Các verdict (quyết định) của Netfilter

VerdictÝ nghĩa
NF_ACCEPTCho gói tin tiếp tục đi qua stack
NF_DROPHuỷ gói tin, không thông báo
NF_QUEUEChuyển gói tin lên user space qua nf_queue để xử lý
NF_STOLENModule tự xử lý gói tin, netfilter quên gói đó đi
NF_REPEATYêu cầu netfilter gọi lại module này một lần nữa

4.5 Implement Simple Packet Filter Firewall

Bước 1 — Viết callback function:

unsigned int telnetFilter(void *priv, struct sk_buff *skb,
                          const struct nf_hook_state *state)
{
    struct iphdr *iph;
    struct tcphdr *tcph;

    iph = ip_hdr(skb);                          // Lấy IP header từ gói tin
    tcph = (void *)iph + iph->ihl * 4;          // Lấy TCP header

    if (iph->protocol == IPPROTO_TCP &&
        tcph->dest == htons(23)) {               // Port 23 = telnet
        printk(KERN_INFO "Dropping telnet packet to %d.%d.%d.%d\n",
               ((unsigned char *)&iph->daddr)[0],
               ((unsigned char *)&iph->daddr)[1],
               ((unsigned char *)&iph->daddr)[2],
               ((unsigned char *)&iph->daddr)[3]);
        return NF_DROP;                          // Huỷ gói tin
    }
    return NF_ACCEPT;                            // Cho qua
}

Bước 2 — Đăng ký hook:

int setUpFilter(void) {
    printk(KERN_INFO "Registering telnet filter.\n");
    telnetFilterHook.hook     = telnetFilter;           // Callback function
    telnetFilterHook.hooknum  = NF_INET_POST_ROUTING;   // Hook point
    telnetFilterHook.pf       = PF_INET;                // IPv4
    telnetFilterHook.priority = NF_IP_PRI_FIRST;        // Ưu tiên cao nhất

    nf_register_hook(&telnetFilterHook);
    return 0;
}

void removeFilter(void) {
    printk(KERN_INFO "Telnet filter is being removed.\n");
    nf_unregister_hook(&telnetFilterHook);
}

module_init(setUpFilter);
module_exit(removeFilter);

Kết quả kiểm thử:

sudo insmod telnetFilter.ko
telnet 10.0.2.5        # → Unable to connect (blocked!)

dmesg
# [1166535.962316] Dropping telnet packet to 10.0.2.5
# [1166536.958065] Dropping telnet packet to 10.0.2.5

sudo rmmod telnetFilter
telnet 10.0.2.5        # → Connected! (module removed)

5. iptables — Linux Firewall

5.1 Tổng quan

iptables là firewall tích hợp sẵn trong Linux, xây dựng trên nền tảng Netfilter.

  • Kernel part: Xtables (framework xử lý trong kernel)
  • User-space program: iptables (công cụ dòng lệnh để cấu hình)

5.2 Cấu trúc phân cấp: Table → Chain → Rule

graph TD T1[Table: filter] --> C1[Chain: INPUT] T1 --> C2[Chain: FORWARD] T1 --> C3[Chain: OUTPUT] T2[Table: nat] --> C4[Chain: PREROUTING] T2 --> C5[Chain: INPUT] T2 --> C6[Chain: OUTPUT] T2 --> C7[Chain: POSTROUTING] T3[Table: mangle] --> C8[Chain: PREROUTING] T3 --> C9[Chain: INPUT] T3 --> C10[Chain: FORWARD] T3 --> C11[Chain: OUTPUT] T3 --> C12[Chain: POSTROUTING]
TableChainChức năng
filterINPUT, FORWARD, OUTPUTLọc gói tin (mặc định)
natPREROUTING, INPUT, OUTPUT, POSTROUTINGSửa đổi địa chỉ IP nguồn/đích
mangleTất cảSửa đổi nội dung gói tin (TTL, TOS, …)

Mỗi chain tương ứng với một Netfilter hook:

  • INPUTNF_IP_LOCAL_IN
  • FORWARDNF_IP_FORWARD
  • OUTPUTNF_IP_LOCAL_OUT
  • PREROUTINGNF_IP_PRE_ROUTING
  • POSTROUTINGNF_IP_POST_ROUTING

5.3 Cú pháp cơ bản

iptables [-t table] -A CHAIN <rule> -j <target>

Các tham số:

Tham sốÝ nghĩa
-t tableChỉ định bảng (mặc định: filter)
-A CHAINAppend rule vào cuối chain
-I CHAIN [pos]Insert rule vào vị trí chỉ định
-D CHAIN [pos]Xoá rule
-P CHAIN targetĐặt default policy cho chain
-FFlush (xoá tất cả) rule
-LLiệt kê rule
-j targetHành động: ACCEPT, DROP, REJECT, LOG, …

Chỉ định rule (matching):

# Layer 2
-i eth0          # Interface đến (incoming)
-o eth0          # Interface đi (outgoing)

# Layer 3
-s 192.168.1.0/24    # Source IP/subnet
-d 10.0.0.1          # Destination IP

# Layer 4
-p tcp --dport 22    # TCP, destination port 22
-p udp --sport 53    # UDP, source port 53
-p icmp --icmp-type echo-request   # ICMP ping

5.4 Ví dụ cấu hình iptables

# Chặn IP nguồn cụ thể
sudo iptables -A INPUT -s 192.168.30.6 -d 192.168.1.0/24 -j DROP

# Cho phép TCP vào port 22 (SSH) và 80 (HTTP)
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Cho phép tất cả outgoing TCP
sudo iptables -A OUTPUT -p tcp -j ACCEPT

# Tăng TTL lên 5 cho tất cả gói tin
sudo iptables -t mangle -A PREROUTING -j TTL --ttl-inc 5

Liệt kê và xoá rule:

# Liệt kê với số thứ tự
sudo iptables -L --line-numbers

# Xoá rule số 2 trong chain INPUT
sudo iptables -D INPUT 2

# Liệt kê bảng nat
sudo iptables -t nat -L

# Flush bảng nat
sudo iptables -t nat -F

5.5 iptables Extension Modules

iptables có thể được mở rộng bằng các module.

Cho phép xây dựng stateful firewall dựa trên trạng thái kết nối:

# Chỉ cho phép outgoing TCP thuộc kết nối đã established
sudo iptables -A OUTPUT -p tcp -m conntrack \
    --ctstate ESTABLISHED,RELATED -j ACCEPT

Cho phép lọc gói tin theo user/group ID của tiến trình tạo ra nó. Chỉ hoạt động với OUTPUT chain (không thể xác định uid cho gói tin đến).

# Chặn user "seed" gửi telnet
sudo iptables -A OUTPUT -m owner --uid-owner seed -j DROP

Kết quả: User seed không thể kết nối telnet, nhưng user khác (ví dụ bob) vẫn kết nối được bình thường.

5.6 Xây dựng Simple Firewall hoàn chỉnh với iptables

# Bước 1: Đặt default policy = ACCEPT trước khi thêm rule
sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -P FORWARD ACCEPT

# Bước 2: Flush tất cả rule cũ
sudo iptables -F

# Bước 3: Cho phép loopback interface
sudo iptables -I INPUT 1 -i lo -j ACCEPT

# Bước 4: Cho phép DNS
sudo iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT  -p udp --sport 53 -j ACCEPT

# Bước 5: Cho phép SSH và HTTP vào
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT

# Bước 6: Cho phép tất cả outgoing TCP
sudo iptables -A OUTPUT -p tcp -m tcp -j ACCEPT

# Bước 7: Sau khi thêm đủ rule, đổi default policy = DROP
sudo iptables -P INPUT   DROP
sudo iptables -P OUTPUT  DROP
sudo iptables -P FORWARD DROP

Kết quả kiểm thử:

# Từ máy khác
telnet 10.0.2.6      # → BLOCKED (port 23 không được phép)
wget 10.0.2.6        # → SUCCESS (port 80 được phép)

6. NAT với iptables

6.1 Source NAT (SNAT)

SNAT thay đổi địa chỉ IP nguồn của gói tin — thường dùng để nhiều máy trong mạng nội bộ chia sẻ một IP public.

# SNAT cố định: đổi source IP thành 10.0.2.7
sudo iptables -t nat -A POSTROUTING -o enp0s3 -j SNAT --to-source 10.0.2.7

# Bật IP forwarding
sudo sysctl net.ipv4.ip_forward=1

# MASQUERADE: SNAT động (tự lấy IP của interface, dùng cho IP động)
sudo iptables -t nat -A POSTROUTING -o enp0s3 -j MASQUERADE

6.2 Destination NAT (DNAT)

DNAT thay đổi địa chỉ IP đích của gói tin — thường dùng để port forwarding hoặc load balancing.

# Chuyển hướng port 8000 đến 192.168.60.5:23
sudo iptables -t nat -A PREROUTING -p tcp --dport 8000 \
    -j DNAT --to-destination 192.168.60.5:23

6.3 DNAT Load Balancing

Phân phối lưu lượng ngẫu nhiên với xác suất 50/50:

sudo iptables -t nat -A PREROUTING -p tcp --dport 8000 \
    -m statistic --mode random --probability .50 \
    -j DNAT --to-destination 192.168.60.5:9001

sudo iptables -t nat -A PREROUTING -p tcp --dport 8000 \
    -m statistic --mode random --probability .50 \
    -j DNAT --to-destination 192.168.60.5:9002

Phân phối lưu lượng luân phiên (mỗi gói thứ n):

# Packet 0, 2, 4, ... → server 9001
sudo iptables -t nat -A PREROUTING -p tcp --dport 8000 \
    -m statistic --mode nth --every 2 --packet 0 \
    -j DNAT --to-destination 192.168.60.5:9001

# Packet 1, 3, 5, ... → server 9002
sudo iptables -t nat -A PREROUTING -p tcp --dport 8000 \
    -m statistic --mode nth --every 2 --packet 1 \
    -j DNAT --to-destination 192.168.60.5:9002

7. Stateful Firewall và Connection Tracking

7.1 Stateful Firewall

Stateful firewall theo dõi lưu lượng đến và đi theo thời gian, ghi lại các thuộc tính như:

  • Địa chỉ IP nguồn/đích
  • Số port nguồn/đích
  • Sequence number

Khái niệm connection state (trạng thái kết nối) xác định gói tin có thuộc về một luồng dữ liệu đang tồn tại hay không. Áp dụng được cho cả TCP (connection-oriented) lẫn UDP/ICMP (connectionless).

7.2 Connection Tracking trong Linux

nf_conntrack là framework theo dõi kết nối trong Linux kernel, xây dựng trên Netfilter. Mỗi gói tin được đánh dấu với một trong các trạng thái:

Trạng tháiMô tả
NEWKết nối đang bắt đầu; firewall chỉ thấy traffic một chiều
ESTABLISHEDKết nối đã thiết lập; giao tiếp hai chiều đang diễn ra
RELATEDKết nối liên quan đến kết nối khác (ví dụ: FTP control và FTP data)
INVALIDGói tin không theo hành vi kết nối bình thường

Xem bảng connection tracking:

sudo conntrack -L

Output ví dụ:

udp  17 22 src=10.0.2.6 dst=10.0.2.7 sport=60360 dport=9090 ...
tcp  429309 ESTABLISHED src=10.0.2.6 dst=10.0.2.7 sport=43164 dport=23 ... [ASSURED]
icmp 26 src=10.0.2.6 dst=10.0.2.7 type=8 code=0 ...

7.3 Xây dựng Stateful Firewall Rule

# Không dùng conntrack (stateless) — cho phép TẤT CẢ outgoing TCP
sudo iptables -A OUTPUT -p tcp -j ACCEPT

# Dùng conntrack (stateful) — chỉ cho phép outgoing TCP thuộc kết nối đang thiết lập
sudo iptables -A OUTPUT -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

8. Application/Proxy Firewall và Web Proxy

Proxy firewall kiểm tra traffic đến tầng ứng dụng. Để đảm bảo tất cả web traffic đều qua proxy:

  1. Cấu hình từng host redirect web traffic đến proxy server (qua browser settings hoặc iptables DNAT).
  2. Đặt proxy trên network bridge nối mạng nội bộ và mạng ngoài.

Proxy cũng có thể dùng để bypass egress filtering:

  • Nếu firewall chặn dựa trên địa chỉ đích, ta có thể gửi traffic qua proxy bên ngoài.
  • Firewall chỉ thấy địa chỉ proxy, không thấy đích thực sự.

Anonymizing Proxy: Ẩn địa chỉ IP thực của client; server chỉ thấy IP của proxy.


9. Bypass Firewall

9.1 SSH Tunneling (Local Port Forwarding)

Tình huống 1: Telnet từ home vào work qua firewall

Firewall chặn telnet (port 23) từ ngoài vào. Nhưng SSH (port 22) được phép đến máy apollo.

graph LR HOME["home\n(telnet client)"] -->|SSH tunnel\nport 8000| FW[Firewall] FW -->|SSH| APOLLO[apollo] APOLLO -->|telnet port 23| WORK[work]
# Trên máy home: tạo SSH tunnel từ home:8000 → work:23 qua apollo
ssh -L 8000:work:23 apollo

# Sau đó telnet đến localhost:8000 (được tunnel forward đến work:23)
telnet localhost 8000

Firewall chỉ thấy SSH traffic (mã hoá) giữa home và apollo — không thấy telnet traffic thực sự.

Tình huống 2: Truy cập Facebook bị chặn từ work

# Trên máy work: tạo SSH tunnel đến home, forward traffic đến facebook
ssh -L 8000:www.facebook.com:80 home

# Trên browser: truy cập localhost:8000

9.2 Dynamic Port Forwarding (SOCKS Proxy)

ssh -D 9000 -C home

Lệnh này tạo một SOCKS proxy tại localhost:9000. Khác với local port forwarding, không cần chỉ định đích cụ thể — browser sẽ tự gửi mọi request qua proxy này.

Cấu hình Firefox:

  • Network Settings → Manual proxy configuration
  • SOCKS Host: 127.0.0.1, Port: 9000, SOCKS v5

9.3 VPN

VPN tạo một tunnel mã hoá giữa máy bên trong và bên ngoài mạng. Vì traffic trong tunnel được mã hoá, firewall không thể xem nội dung để thực hiện filtering.


10. Câu hỏi trắc nghiệm

Câu 1. Firewall có chức năng chính nào sau đây?

  • A. Tăng tốc độ kết nối mạng
  • B. Lọc dữ liệu, chuyển hướng traffic và bảo vệ chống tấn công mạng
  • C. Mã hóa toàn bộ dữ liệu truyền qua mạng
  • D. Phân bổ địa chỉ IP cho các thiết bị

Câu 2. Yêu cầu nào sau đây KHÔNG phải là yêu cầu bắt buộc của một firewall?

  • A. Tất cả traffic giữa các trust zone phải đi qua firewall
  • B. Chỉ traffic được ủy quyền mới được phép đi qua
  • C. Firewall phải log tất cả traffic
  • D. Bản thân firewall phải miễn nhiễm với xâm nhập

Câu 3. Firewall Policy “Direction Control” kiểm soát điều gì?

  • A. Loại dịch vụ mà host cung cấp
  • B. Quyền truy cập dựa trên vai trò người dùng
  • C. Chiều mà các yêu cầu có thể được khởi tạo và đi qua firewall
  • D. Giao thức mạng được phép sử dụng

Câu 4. Sự khác biệt giữa hành động “Denied” và “Rejected” của firewall là gì?

  • A. Denied nhanh hơn Rejected
  • B. Rejected gửi thông báo ICMP về cho nguồn, Denied thì không
  • C. Denied dùng cho TCP, Rejected dùng cho UDP
  • D. Không có sự khác biệt

Câu 5. Packet Filter Firewall (Stateless Firewall) đưa ra quyết định dựa trên thông tin nào?

  • A. Nội dung payload của gói tin
  • B. Thông tin trong header của từng gói tin riêng lẻ
  • C. Lịch sử kết nối và trạng thái session
  • D. Thông tin người dùng ứng dụng

Câu 6. Stateful Firewall khác Packet Filter Firewall ở điểm nào chủ yếu?

  • A. Stateful Firewall nhanh hơn
  • B. Stateful Firewall duy trì Connection State Table để hiểu ngữ cảnh kết nối
  • C. Stateful Firewall phân tích đến tầng ứng dụng
  • D. Stateful Firewall chỉ hoạt động với TCP

Câu 7. Application/Proxy Firewall hoạt động theo cơ chế nào?

  • A. Chặn tất cả traffic và chỉ cho phép whitelist
  • B. Đóng vai trò trung gian — kết nối từ client kết thúc ở proxy, proxy mở kết nối mới đến đích
  • C. Phân tích packet header đến tầng transport
  • D. Mã hóa tất cả traffic đi qua

Câu 8. Nhược điểm chính của Application/Proxy Firewall là gì?

  • A. Không thể lọc traffic
  • B. Cần implement proxy mới cho mỗi giao thức mới và chậm hơn loại khác
  • C. Không hỗ trợ mã hóa
  • D. Chỉ hoạt động với HTTP

Câu 9. Netfilter cung cấp gì cho Linux kernel?

  • A. Giao diện đồ họa để cấu hình firewall
  • B. Hook tại các điểm quan trọng trên đường đi của gói tin trong kernel
  • C. Cơ chế mã hóa gói tin
  • D. Giao thức routing động

Câu 10. Loadable Kernel Module (LKM) có ưu điểm gì so với việc sửa trực tiếp kernel?

  • A. Chạy nhanh hơn
  • B. Cho phép thêm/gỡ chức năng kernel động mà không cần recompile toàn bộ kernel
  • C. Được cấp quyền cao hơn
  • D. Hỗ trợ nhiều hệ điều hành hơn

Câu 11. Trong kernel module C, hàm nào được gọi khi chạy lệnh insmod?

  • A. module_exit()
  • B. cleanup_module()
  • C. Hàm được chỉ định bởi module_init()
  • D. main()

Câu 12. Lệnh nào dùng để xem log từ printk() trong kernel module?

  • A. syslog
  • B. dmesg
  • C. journalctl
  • D. cat /var/log/kernel

Câu 13. Netfilter hook NF_IP_PRE_ROUTING được kích hoạt ở đâu?

  • A. Sau khi routing decision, gói tin đến local process
  • B. Ngay sau khi gói tin đến interface, trước routing decision
  • C. Sau khi gói tin rời local process
  • D. Khi gói tin được chuyển tiếp (forward)

Câu 14. Muốn chặn outgoing telnet từ máy Linux đóng vai trò là router (không phải source), nên dùng Netfilter hook nào?

  • A. NF_IP_LOCAL_IN
  • B. NF_IP_LOCAL_OUT
  • C. NF_IP_FORWARD
  • D. NF_IP_PRE_ROUTING

Câu 15. Netfilter verdict NF_QUEUE có ý nghĩa gì?

  • A. Gói tin được chấp nhận
  • B. Gói tin bị huỷ
  • C. Gói tin được chuyển lên user space để xử lý thêm
  • D. Gói tin được lặp lại qua hook

Câu 16. Trong code Netfilter, sk_buff *skb chứa thông tin gì?

  • A. Chỉ IP header
  • B. Chỉ TCP header
  • C. Toàn bộ gói tin (bao gồm tất cả headers và payload)
  • D. Thông tin về socket

Câu 17. Trong iptables, table mặc định nếu không chỉ định -t là gì?

  • A. nat
  • B. mangle
  • C. filter
  • D. raw

Câu 18. Chain FORWARD trong iptables tương ứng với Netfilter hook nào?

  • A. NF_IP_LOCAL_IN
  • B. NF_IP_PRE_ROUTING
  • C. NF_IP_FORWARD
  • D. NF_IP_POST_ROUTING

Câu 19. Lệnh iptables nào dùng để chèn rule vào vị trí đầu tiên của chain INPUT?

  • A. iptables -A INPUT -i lo -j ACCEPT
  • B. iptables -I INPUT 1 -i lo -j ACCEPT
  • C. iptables -D INPUT 1 -i lo -j ACCEPT
  • D. iptables -P INPUT -i lo -j ACCEPT

Câu 20. Để xoá rule số 2 trong chain INPUT, dùng lệnh nào?

  • A. iptables -F INPUT 2
  • B. iptables -D INPUT 2
  • C. iptables -R INPUT 2
  • D. iptables -P INPUT 2 DROP

Câu 21. Module owner trong iptables chỉ hoạt động với chain nào?

  • A. INPUT
  • B. FORWARD
  • C. OUTPUT
  • D. Tất cả các chain

Câu 22. Khi xây dựng firewall với iptables, tại sao nên đặt default policy = ACCEPT trước rồi mới đổi sang DROP sau khi thêm đủ rule?

  • A. Vì ACCEPT nhanh hơn DROP
  • B. Để tránh bị lock out khỏi machine trong quá trình cấu hình
  • C. Vì iptables yêu cầu như vậy
  • D. Để rule có hiệu lực ngay

Câu 23. Lệnh iptables nào dùng để thực hiện Source NAT với IP động (IP của interface thay đổi)?

  • A. iptables -t nat -A POSTROUTING -j SNAT --to-source 1.2.3.4
  • B. iptables -t nat -A POSTROUTING -j DNAT --to-destination 1.2.3.4
  • C. iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
  • D. iptables -t nat -A PREROUTING -j MASQUERADE

Câu 24. DNAT thường được thực hiện ở chain nào?

  • A. OUTPUT
  • B. POSTROUTING
  • C. PREROUTING
  • D. FORWARD

Câu 25. nf_conntrack là gì?

  • A. Công cụ dòng lệnh để xem kết nối mạng
  • B. Framework theo dõi kết nối trong Linux kernel, xây dựng trên Netfilter
  • C. Plugin cho Wireshark
  • D. Giao thức mạng mới

Câu 26. Trạng thái ESTABLISHED trong connection tracking có nghĩa là gì?

  • A. Kết nối đang bắt đầu, chỉ có traffic một chiều
  • B. Kết nối đã được thiết lập, giao tiếp hai chiều đang diễn ra
  • C. Gói tin không theo hành vi kết nối bình thường
  • D. Kết nối liên quan đến một kết nối khác

Câu 27. Trạng thái RELATED trong conntrack thường gặp trong giao thức nào?

  • A. HTTP
  • B. DNS
  • C. FTP (giữa control connection và data connection)
  • D. SSH

Câu 28. Lệnh nào dùng để xem bảng connection tracking hiện tại?

  • A. iptables -L
  • B. netstat -an
  • C. sudo conntrack -L
  • D. cat /proc/net/nf_conntrack

Câu 29. Rule iptables nào an toàn hơn để cho phép outgoing traffic?

  • A. iptables -A OUTPUT -p tcp -j ACCEPT
  • B. iptables -A OUTPUT -p tcp -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
  • C. iptables -P OUTPUT ACCEPT
  • D. iptables -A OUTPUT -j ACCEPT

Câu 30. Tại sao egress filtering được dùng trong trường học/công ty?

  • A. Tăng tốc độ mạng
  • B. Ngăn người dùng nội bộ truy cập một số tài nguyên bên ngoài như mạng xã hội, game
  • C. Bảo vệ server nội bộ khỏi tấn công
  • D. Mã hóa dữ liệu truyền ra

Câu 31. Để enable IP forwarding trên Linux (cho phép máy hoạt động như router), dùng lệnh nào?

  • A. sudo iptables -P FORWARD ACCEPT
  • B. sudo sysctl net.ipv4.ip_forward=1
  • C. sudo modprobe ip_forward
  • D. sudo ifconfig eth0 forward

Câu 32. DNAT load balancing với --mode random --probability .50 hoạt động như thế nào?

  • A. Phân chia traffic theo round-robin (luân phiên đều đặn)
  • B. Mỗi gói tin có 50% xác suất được route đến server được chỉ định
  • C. Chỉ 50% tổng traffic được xử lý, phần còn lại bị drop
  • D. Server đầu tiên xử lý 50 gói, server thứ hai xử lý 50 gói

Câu 33. Trong ví dụ load balancing với --mode nth --every 2 --packet 0, gói tin nào sẽ được route đến server đầu tiên?

  • A. Gói thứ 1, 3, 5, … (lẻ)
  • B. Gói thứ 0, 2, 4, … (chẵn)
  • C. Ngẫu nhiên
  • D. Tất cả gói tin

Câu 34. SSH Tunneling bypass firewall dựa vào nguyên lý nào?

  • A. Khai thác lỗ hổng trong giao thức TCP
  • B. Mã hóa và bọc traffic thực (như telnet) bên trong SSH connection được phép
  • C. Giả mạo địa chỉ IP nguồn
  • D. Tăng TTL để tránh bị chặn

Câu 35. Lệnh ssh -L 8000:work:23 apollo tạo ra điều gì?

  • A. SSH connection từ apollo đến work:23
  • B. Tunnel chuyển tiếp TCP đến port 8000 trên local machine → work:23 qua apollo
  • C. SOCKS proxy tại port 8000
  • D. Port 8000 trên apollo → port 23 trên work

Câu 36. Dynamic Port Forwarding (ssh -D 9000 home) tạo ra loại proxy nào?

  • A. HTTP proxy
  • B. HTTPS proxy
  • C. SOCKS proxy
  • D. Transparent proxy

Câu 37. Sự khác biệt giữa Local Port Forwarding (-L) và Dynamic Port Forwarding (-D) trong SSH là gì?

  • A. -L bảo mật hơn -D
  • B. -L chuyển tiếp đến một đích cố định; -D tạo SOCKS proxy linh hoạt (đích do client quyết định)
  • C. -D nhanh hơn -L
  • D. -L dùng cho TCP, -D dùng cho UDP

Câu 38. Tại sao VPN có thể bypass firewall hiệu quả?

  • A. VPN thay đổi địa chỉ MAC
  • B. VPN tạo tunnel mã hóa, firewall không thể xem nội dung để thực hiện filtering
  • C. VPN dùng port 443 luôn được phép
  • D. VPN khai thác lỗ hổng firewall

Câu 39. Proxy server có thể được dùng để bypass egress filtering như thế nào?

  • A. Proxy thay đổi địa chỉ nguồn của gói tin
  • B. Proxy đổi địa chỉ đích thành địa chỉ proxy, qua mặt rule chặn dựa trên destination IP
  • C. Proxy nén dữ liệu để tránh detection
  • D. Proxy dùng giao thức khác với HTTP

Câu 40. Anonymizing Proxy giúp ẩn thông tin gì của client?

  • A. Địa chỉ MAC
  • B. Địa chỉ IP thực của client (server chỉ thấy IP của proxy)
  • C. Nội dung request
  • D. Thời gian kết nối

Câu 41. Trong iptables, tham số -p icmp --icmp-type echo-request lọc loại ICMP nào?

  • A. ICMP ping reply
  • B. ICMP ping request (loại được gửi đi khi ping)
  • C. ICMP destination unreachable
  • D. ICMP time exceeded

Câu 42. Lệnh sudo iptables -t mangle -A PREROUTING -j TTL --ttl-inc 5 làm gì?

  • A. Giảm TTL của tất cả gói tin đi 5
  • B. Đặt TTL = 5 cho tất cả gói tin
  • C. Tăng TTL của tất cả gói tin đi 5, áp dụng trước routing decision
  • D. Chặn tất cả gói tin có TTL = 5

Câu 43. Lệnh sudo iptables -L --line-numbers dùng để làm gì?

  • A. Liệt kê các chain của tất cả table
  • B. Liệt kê các rule trong tất cả chain của table filter, kèm số thứ tự
  • C. Liệt kê các kernel module đang chạy
  • D. Liệt kê các kết nối đang active

Câu 44. Khi sử dụng iptables để chặn user seed dùng telnet nhưng cho phép user bob, phương pháp nào phù hợp nhất?

  • A. iptables -A INPUT -s seed -j DROP
  • B. iptables -A OUTPUT -m owner --uid-owner seed -j DROP
  • C. iptables -A OUTPUT -p tcp --dport 23 -j DROP
  • D. iptables -A FORWARD -m owner --uid-owner seed -j DROP

Câu 45. Tại sao cần chạy sudo sysctl net.ipv4.ip_forward=1 khi cấu hình SNAT/NAT?

  • A. Để enable iptables
  • B. Để kernel Linux chuyển tiếp (forward) gói tin giữa các network interface
  • C. Để tăng tốc độ NAT
  • D. Để enable IPv6

Câu 46. Để chặn tất cả traffic ngoại trừ những gì được phép rõ ràng (deny-all, allow-by-exception), cần làm gì trong iptables?

  • A. Không thêm rule nào
  • B. Đặt default policy là DROP cho các chain, sau đó thêm rule ACCEPT cho traffic được phép
  • C. Đặt default policy là ACCEPT và thêm rule DROP
  • D. Dùng -j REJECT cho tất cả rule

Câu 47. Ưu điểm của Application Proxy Firewall so với Packet Filter trong việc chống IP Spoofing là gì?

  • A. Proxy lọc dựa trên địa chỉ IP nên không bị spoofing
  • B. Proxy xác thực người dùng ở tầng ứng dụng thay vì dựa vào địa chỉ IP, không bị ảnh hưởng bởi IP Spoofing
  • C. Proxy không sử dụng địa chỉ IP
  • D. Proxy mã hóa tất cả traffic

Câu 48. Trong ví dụ SSH tunnel, firewall có thể thấy loại traffic nào?

  • A. Telnet traffic giữa home và work
  • B. HTTP traffic giữa work và Facebook
  • C. SSH traffic (mã hóa) giữa home và apollo
  • D. Tất cả traffic đều hiển thị rõ

Câu 49. Module conntrack trong iptables với --ctstate NEW cho phép điều gì?

  • A. Chỉ cho phép gói tin thuộc kết nối đã established
  • B. Cho phép gói tin khởi tạo kết nối mới (chỉ có traffic một chiều)
  • C. Chặn tất cả kết nối mới
  • D. Cho phép gói tin không thuộc kết nối nào

Câu 50. Lệnh sudo iptables -t nat -F làm gì?

  • A. Xoá chain FORWARD trong table nat
  • B. Xoá tất cả rule trong table nat
  • C. Flush toàn bộ iptables
  • D. Liệt kê rule của table nat

Câu 51. Khi xây dựng firewall, tại sao phải thêm rule cho phép loopback interface (-i lo -j ACCEPT)?

  • A. Vì loopback interface không an toàn
  • B. Vì nhiều dịch vụ nội bộ giao tiếp qua loopback (127.0.0.1), block loopback sẽ làm hỏng hệ thống
  • C. Vì loopback cần được encrypt
  • D. Vì default policy không áp dụng cho loopback

Câu 52. Ingress filteringEgress filtering khác nhau ở điểm nào?

  • A. Ingress lọc UDP, Egress lọc TCP
  • B. Ingress kiểm tra traffic đến (inbound) bảo vệ mạng nội bộ; Egress kiểm tra traffic ra (outbound) kiểm soát những gì người dùng nội bộ có thể truy cập
  • C. Ingress nhanh hơn Egress
  • D. Ingress dùng cho IPv4, Egress dùng cho IPv6

Câu 53. Trong iptables, lệnh nào đặt default policy DROP cho chain INPUT?

  • A. iptables -A INPUT -j DROP
  • B. iptables -D INPUT -j DROP
  • C. iptables -P INPUT DROP
  • D. iptables -I INPUT 1 -j DROP

Câu 54. Khi client dùng SOCKS proxy, yêu cầu kỹ thuật nào bắt buộc?

  • A. Phần mềm client phải chạy trên Linux
  • B. Phần mềm client phải có hỗ trợ SOCKS native
  • C. SOCKS proxy phải chạy trên port 1080
  • D. Phải dùng Firefox

Câu 55. Trong Netfilter, NF_IP_PRI_FIRST trong đăng ký hook có ý nghĩa gì?

  • A. Hook này xử lý trước tất cả hook khác cùng điểm
  • B. Hook này chỉ xử lý gói tin đầu tiên
  • C. Hook này có độ ưu tiên thấp nhất
  • D. Hook này được gọi cuối cùng