Quản Trị  Hệ Điều Hành Linux - Unix
 
Thiết lập tường lửa Iptables cho Linux - Phần 4
13:49 | 10/04/2010
Trường hợp điển hình thứ ba trong việc ứng dụng iptables để chia xẻ truy cập Internet cho nội mạng.

1. Trường hợp:
Firewall cho một subnet gồm các máy con cần truy cập Internet. Khác với "case 1" và "case 2" trước đây, "case 3" giới thiệu một khái niệm mới gọi là "packet forwarding". "Packet forwarding" là một cơ chế chuyển gởi gói tin khá đặc biệt với iptables. Nguyên tắc căn bản và thu gọn bạn cần nhớ:

- nếu gói tin đi từ mạng LAN đến điểm đích và đích này chính là firewall chúng ta đang thiết lập thì gói tin này phải đi qua INPUT chain.

- nếu gói tin đi từ mạng LAN đến điểm đích mà đích này không phải là firewall chúng ta đang thiết lập thì gói tin này phải đi qua FORWARD chain.

2. Nhu cầu:
Firewall này không hỗ trợ điều tác cho những dịch vụ được cung cấp từ trong nội mạng, nó chỉ bảo vệ các máy con và chia xẻ truy cập Internet (từ trong nội mạng ra ngoài Internet).

3. Phương pháp kết nối:
Bất cứ phương tiện nào, cả IP tĩnh lẫn IP động.

4. Đòi hỏi tối thiểu:
Chính máy chạy iptables có thể kết nối vào Internet. Ngoài network interface dùng để kết nối với Internet, phải có thêm một network interface (NIC) tiếp diện với nội mạng. Các máy con có thể "ping" firewall này từ nội mạng (xác thực nội mạng đã thiết lập).

Để giản tiện cách gọi và giảm thiểu bối rối, chúng ta nên thống nhất một số từ viết tắc như sau:
- INTIF là internal network interface, hay là network card tiếp diện nội mạng. Bất cứ nơi đâu trong bài dùng INTIF, bạn nên hiểu đó là "NIC tiếp diện nội mạng".

- INTIP là internal IP address, hay là IP của firewall thuộc phía nội mạng. Bất cứ nơi đâu trong bài dùng INTIP, bạn nên hiểu đó là "IP của firewall thuộc phía nội mạng".

- INTNET là internal network, hay là nội mạng (LAN). Bất cứ nơi đâu trong bài dùng INTNET, bạn nên hiểu đó là "nội mạng được firewall bảo vệ".

- LOIF là loopback interface, hay là interface cục bộ của firewall. Bất cứ nơi đâu trong bài dùng LOIF, bạn nên hiểu đó là "interface cục bộ của firewall".

- LOIP là loopback address, hay là IP cục bộ của firewall (127.0.0.1). Bất cứ nơi đâu trong bài dùng LOIP, bạn nên hiểu đó là "IP cục bộ của firewall".

- EXTIF là external network interface, hay là network card tiếp diện với ngoại mạng. Ngoại mạng này có thể là Internet hoặc một mạng khác nằm bên ngoài giới hạn bạn muốn bảo vệ. Bất cứ nơi đâu trong bài dùng EXTIF, bạn nên hiểu đó là "NIC tiếp diện ngoại mạng".

- EXTIP là external IP address, hay là IP của firewall thuộc phía ngoại mạng. Thông thường đây chính là public IP được dịch vụ Internet cung cấp hoặc IP tiếp diện với mạng nằm ngoài giới hạn bạn muốn bảo vệ. Bất cứ nơi đâu trong bài dùng EXTIP, bạn nên hiểu đó là "IP của firewall thuộc phía ngoại mạng".

- EXTNET là external network, hay là ngoại mạng. Ngoại mạng này có thể là Internet hoặc một mạng khác nằm bên ngoài giới hạn bạn muốn bảo vệ. cứ nơi đâu trong bài dùng EXTNET, bạn nên hiểu đó là "ngoại mạng nằm bên ngoài tầm bảo vệ của firewall".

5. Mô hình:
eth0 là NIC tiếp diện với Internet với IP tĩnh hoặc IP động. eth0 có thể gắn trực tiếp vào cable hoặc vào một router (ADSL router, cable router, ATM router, frame relay router... ). Nếu sử dụng dial-up, NIC tiếp diện Internet sẽ là ppp0. Nếu sử dụng ADSL, NIC tiếp diện Internet sẽ là ppp0 nhưng eth0 sẽ cần thiết để thoả mãn cơ chế pppoe (tham khảo thêm tài liệu cụ thể cho việc kết nối Internet bằng ADSL).

eth1 là NIC tiếp diện với một subnet có các máy con.

6. Nhóm luật:
1  #!/bin/bash
2  IPT="/usr/local/sbin/iptables"
3  echo "1" > /proc/sys/net/ipv4/ip_forward
4
5  INTIF="eth1"
6  INTIP="172.16.1.100"
7  INTNET="172.16.1.0/24"
8
9  LOIF="lo"
10  LOIP="127.0.0.1"
11
12  EXTIF=`/sbin/route | grep -i 'default' | awk '{print$8}'`
13  EXTIP=`/sbin/ifconfig $EXTIF | grep "inet addr" | awk -F":" '{print$2}' | awk '{print $1}'`
14  EXTNET=any/0
15
16  OK_ICMP="0 3 4 8 11"
17  TCP_OUT="80 110 5000 5010 5100"
18  UDP_OUT="53"
19  OK_MAC="AA:AA:AA:AA:AA:AA BB:BB:BB:BB:BB:BB"
20  NOTOK_MAC="CC:CC:CC:CC:CC:CC DD:DD:DD:DD:DD:DD"
21
22  HI_PORTS="1024:65535"
23
24  DNS="203.168.11.132 203.167.12.133"
25
26  $IPT -F
27  $IPT -F -t nat
28  $IPT -F -t filter
29  $IPT -F -t mangle
30  $IPT -t mangle -X
31  $IPT -t nat -X
32  $IPT -X
33  $IPT -Z INPUT
34  $IPT -Z OUTPUT
35  $IPT -Z FORWARD
36
37  $IPT -P INPUT DROP
38  $IPT -P OUTPUT DROP
39  $IPT -P FORWARD DROP
40
41  $IPT -A INPUT -i $INTIF -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
42  $IPT -A OUTPUT -o $INTIF -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
43  $IPT -A INPUT -i $LOIF -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
44  $IPT -A OUTPUT -o $LOIF -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
45
46  for dns in $DNS; do
47     $IPT -A INPUT -i $EXTIF -p udp -s $dns --sport 53 -m state --state RELATED,ESTABLISHED -j ACCEPT
48     $IPT -A OUTPUT -o $EXTIF -p udp -d $dns --dport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
49     $IPT -A INPUT -i $EXTIF -p udp -s $EXTNET --sport 53 -d $EXTIP --dport $HI_PORTS -m state --state RELATED,ESTABLISHED -j ACCEPT
50     $IPT -A OUTPUT -o $EXTIF -p udp -s $EXTIP --sport $HI_PORTS -d $EXTNET --dport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
51     $IPT -A INPUT -i $INTIF -p udp -s $INTNET --dport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
52     $IPT -A OUTPUT -o $INTIF -p udp -d $INTNET --sport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
53     $IPT -A INPUT -i $LOIF -p udp -s $INTNET --dport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
54     $IPT -A OUTPUT -o $LOIF -p udp -d $INTNET --sport 53 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
55  done
56
57  for icmp in $OK_ICMP; do
58          $IPT -A FORWARD -p icmp --icmp-type $icmp -i $INTIF -o $EXTIF -s $INTNET -d $EXTNET -j ACCEPT
59          echo "Allowed ICMP types: $icmp"
60  done
61
62  for ports in $TCP_OUT; do
63          $IPT -A FORWARD -p tcp -i $INTIF -o $EXTIF -s $INTNET -d $EXTNET --dport $ports -j ACCEPT
64          echo "Allowed forward port $ports"
65  done
66
67  for ports in $UDP_OUT; do
68          $IPT -A FORWARD -p udp -i $INTIF -o $EXTIF -s $INTNET -d $EXTNET --dport $ports -j ACCEPT
69          echo "Allowed forward port $ports"
70  done
71
72  for macs in $OK_MAC; do
73          $IPT -A FORWARD -p tcp -i $INTIF -o $EXTIF -m mac --mac-source $macs -d $EXTNET --dport 20:21 -j ACCEPT
74          echo "Allowed forward mac $macs to ftp"
75  done
76
77  for banmac in $NOTOK_MAC; do
78          $IPT -A FORWARD -p tcp -i $INTIF -o $EXTIF -m mac --mac-source $banmac -d $EXTNET -j REJECT
79          echo "Banned MAC adddress $banmac is applied"
80  done
81
82  $IPT -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
83
84  $IPT -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP
85
86  $IPT -A INPUT -i $INTIF -j LOG --log-prefix "BAD_INPUTS: "
87  $IPT -A INPUT -i $INTIF -j DROP
88  $IPT -A OUTPUT -o $EXTIF -j LOG --log-prefix "BAD_OUTPUTS: "
89  $IPT -A OUTPUT -o $EXTIF -j DROP
90  $IPT -A FORWARD -i $INTIF -o $EXTIF -j LOG --log-prefix "BAD_FORWARD_OUT: "
91  $IPT -A FORWARD -i $INTIF -o $EXTIF -j DROP
92  $IPT -A FORWARD -i $EXTIF -o $INTIF -j LOG --log-prefix "BAD_FORWARD_IN: "
93  $IPT -A FORWARD -i $EXTIF -o $INTIF -j DROP


7. Phân tích:
- Dòng 1: dòng khai báo bash shell được dùng để chạy doạn script này.

- Dòng 2: khai báo đường dẫn đến nơi chứa chương trình iptables. Trong trường hợp này là /usr/local/sbin/iptables. Đường dẫn này thường có nếu iptables đã được biên dịch từ mã nguồn và dùng giá trị $PREFIX theo mặc định là /usr/local. iptables nếu được cài từ rpm thường có đường dẫn là /usr/sbin/iptables.

- Dòng 3: Đây là một dòng đặc biệt để thực thi việc cho phép các gói tin được định tuyến giữa 2 network cards eth0 (ngoại tuyến) và eth1 (nội tuyến). Nếu hệ thống cần thiết kế không dùng proc filesystem -1- thì lệnh này không thể thực thi. Trong trường hợp này sự thể trở nên phức tạp vì giá trị này phải được ứng dụng bằng cách thay đổi trên mã nguồn của kernel và biên dịch lại. Cách đơn giản nhất có lẽ là biên dịch lại kernel và cho phép dùng /proc filesystem. Nếu lệnh trên không thể thực thi, cơ chế NAT để cho phép các máy con trong nội mạng chia xẻ đường Internet không làm việc được và các lệnh đi theo không có tác dụng.

- Dòng 5, 6, 7: $INTIF và $INTIP khai báo các giá trị IP, network interface của máy chạy iptables phía nội mạng. Dòng 5 khai báo subnet $INTNET nội mạng. Nên lưu ý việc ứng dụng khoảng địa chỉ dành riêng cho nội mạng như đã được IANA quy định -2-

- Dòng 9, 10: khai báo giá trị network interface và IP của loopback. Đây là một phần quan trọng vì ở một số chế độ, các gói tin sẽ đi xuyên qua loopback interface. Chi tiết sẽ được trình bày ở các phần sau.

- Dòng 12: $EXTIF khai báo network interface được dùng tiếp diện với Internet hoặc "ngoại mạng". Dòng 9 này bao gồm một chuỗi shell script dùng để xác định network interface nào hiện là "default" gateway. Để có giá trị này, máy chạy iptables phải được truy cập vào ISP. Đìều này dễ hiểu bởi vì nếu không có giá trị này thì có nghĩa máy không truy cập vào Internet và bởi thế không cần được iptables bảo vệ.

- Dòng 13: $EXTIP khai báo IP hiện dụng trên network interface được dùng tiếp diện với ngoại mạng. Nó bao gồm một chuỗi shell script dùng grep và awk để tách lấy giá trị IP. Nếu $EXTIF không tồn tại, $EXTIP hiển nhiên không tồn tại.

- Dòng 14: $EXTNET khai báo giá trị "any/0" ngầm chỉ định cho "mọi network".

- Dòng 16: $OK_ICMP ấn định các loại ICMP các máy con trong nội mạng  được phép dùng và sẽ được ứng hiệu trong thân bài của firewall script.

- Dòng 17 và 18: $TCP_OUT và $UDP_OUT ấn định các cổng tcp và udp các máy con trong nội mạng được phép truy cập.

- Dòng 19: $OK_MAC ấn định các MAC address này được quyền truy cập dịch vụ nào đó thuộc ngoại mạng. Loại dịch vụ có thể thay đổi dễ dàng ở đây cho các máy có $OK_MAC được quyền truy cập.

- Dòng 20: $NOTOK_MAC ấn định các MAC address không được phép truy cập Internet. Chức năng này hữu dụng cho việc ngăn cản một số máy con vi phạm quy định sử dụng Internet hoặc ngăn cản một số máy cụ thể nào đó không thể gởi request ra ngoài vì một quy định bảo mật nào đó.

- Dòng 22: ấn định chuỗi high ports (hay còn gọi là non-privileged ports vì để mở các port này không cần phải có chủ quyền root).

Dòng 24: ấn định các địa chỉ IP của dịch vụ DNS nào nội mạng và firewall được quyền dùng. Đây là địa chỉ IP của DNS server (primary và secondary) mà ISP thường cung cấp.

- Dòng 26-35: các dòng này đơn giản dùng để xoá các luật đã được đưa lên memory (nếu có) từ mọi tables để bảo đảm không có những luật cũ hoặc không giá trị vẫn còn tồn tại khi firewall script này chạy. Các dòng theo sau còn có tác dụng xoá bỏ các "user defined" chains nếu có và bắt đầu lại bộ đếm (số lượng và khối lượng băng thông các packets đi xuyên qua mỗi rule).

- Dòng 37-39: các dòng này ấn định chế độ mặc định của firewall (DROP) đã được phân tích trong "Case 1" và "Case 2" của loạt bài này. Tổng quát mà nói, những dòng này ấn định luật căn bản và khởi đầu của firewall: cản tất cả và chỉ cho phép những dạng lưu thông cụ thể. Những gì không thoả mãn các luật đưa ra sẽ tự động bị chế độ mặc định này cản.

- Dòng 41-44 là nhóm luật khá thư dãn cho một firewall bởi vì nó ấn định rằng hễ thông tin đi vào và ra từ $INTIF và từ $LOIF ở tình trạng NEW, RELATED và ESTABLISHED đều được cho phép. Một firewall chặt chẽ hơn sẽ ấn định cụ thể hơn các cổng đi ra và đi vào xuyên qua các network interface này. Lý do chúng ta cần cho phép luôn cả loopback interface ở đây là vì sẽ có những trường hợp các gói tin cần đi xuyên qua địa chỉ loopback và loopback interface. Chúng ta sẽ đào sâu trong những phần sau này.

- Dòng 46-55 là một vòng lặp dùng để ấn định cụ thể luật dùng cho DNS. Trong trường hợp này trọn bộ nội mạng và chính firewall là DNS client của DNS servers mà ISP cung cấp (như đã khai báo trên dòng 24). Do ở vị thế hoạt động như một DNS client và chỉ cần thực hiện recursive lookup cho mục đích giải danh, nội mạng và firewall chỉ liên hệ với các DNS server qua cổng 53 UDP. Bởi thế, cụm lệnh trên chỉ chú trọng đến cổng 53 UDP. Bạn thấy trong nhóm luật dành cho DNS này ấn định rất cụ thể là: DNS server chỉ có thể 'trả lời' (xuyên qua INPUT chain) ở tình trạng RELATED,ESTABLISHED. Trong khi đó, các dòng 51, 52, 53, 54 thì được ấn định khác hẳn. Chúng cho phép các gói tin UDP đi từ nội mạng đến cổng 53 ở tình trạng NEW,RELATED,ESTABLISHED. Các dòng luật này chỉ có tác dụng (và cần thiết) nếu bạn dùng forward DNS ngay trên chính firewall (như đã chú thích ở -3-). Nếu bạn quyết định chỉ dùng DNS do ISP cung cấp thì chỉ cần sử dụng các dòng 47-48 là đủ. Tuy nhiên, nên giữ lại trọn bộ nhóm luật trên vì chúng ta sẽ đào sâu hơn việc sử dụng "DNS forwarding" về sau.

- Dòng 57-60 dùng để ấn định loại ICMP nào được dùng. Như đã đề cập rải rác trong "case 1" và "case 2" của loạt bài, ICMP là một giao thức tiện ích. Tuy nhiên, chúng có thể được dùng với mục đích thiếu thiện chí. Bởi vậy, hạn chế những loại ICMP để giảm thiểu độ nguy hiểm cho firewall và mạng là điều cần làm. Bốn dòng trên là một vòng lặp dùng để đọc giá trị lấy từ biến $OK_ICMP (được ấn định ở dòng 13) và áp dụng bằng luật ở dòng 39. Dòng này có thể được hiểu như sau: các gói tin ICMP thuộc loại đã được ấn định trong $OK_ICMP (0, 3, 4, 8 và 11 trong trường hợp này) đi từ -s $INTNET đến $INTIF và đi ra ngoài xuyên qua $EXTIF thì được cho phép. Dòng 40 chỉ đơn giản in ra một thông báo trên console sau khi mỗi luật cho ICMP được ấn định xong; nó không tác động gì đến luật của firewall cả. Dòng 57 mở vòng lặp và dòng 60 đóng vòng lặp.

Cần nhấn mạnh lại ở đây, khác với "case 1" và "case 2", giới hạn các loại ICMP dùng ở đây được đưa vào FORWARD chain thay vì INPUT chain. Lý do: giới hạn này dùng cho các máy được nat và không phải dùng cho chính firewall. FORWARD chain trong trường hợp này là một phương tiện để chuyển gói tin đi ra ngoài Internet bởi vì đích của gói tin cần đến không phải là IP (kể cả private lẫn public IP) của firewall mà là một IP nằm bên ngoài giới hạn quản lý của firewall. Nếu gói tin đi từ nội mạng và có đích là IP của firewall thì gói tin này phải đi xuyên qua INPUT chain và sẽ được luật ấn định của INPUT chain xử lý.

- Dòng 62-65, tương tự như cụm 57-60 ở trên nhưng ứng dụng cho giao thức TCP (-p tcp), cho phép được dùng những cổng đích đã được ấn định trong biến $TCP_OUT. Ở đây, $TCP_OUT chứa các cổng 80, 110, 5000, 5010 và 5100 có nghĩa rằng các máy con từ nội mạng có thể truy cập đến các dịch vụ: web, pop3 và yahoo (Messenger, Voice và Webcam). Các cổng không hiện diện trong biến $TCP_OUT sẽ bị cản theo luật mặc định ở dòng 39.

- Dòng 67-70, y hệt như cụm 62-65 nhưng ứng dụng cho giao thức UDP (-p udp). Ở đây, biến $UDP_OUT chỉ chứa mỗi một cổng 53 để cho phép các máy con liên hệ với một name (DNS) server nào đó bên ngoài cho mục đích giải danh (name / IP resolving). Có hai trường hợp cần quan tâm và phân tích ở đây:

a. nếu dùng DNS của ISP: trong trường hợp này bạn chỉ cần cụm 67-70 để "forward" request từ máy con trong mạng LAN đến DNS của ISP. Việc ấn định DNS trên các máy con tùy bạn chọn lựa (dùng static IP và ấn định cụ thể IP của DNS hoặc dùng DHCP).

b. nếu dùng "DNS foward" trên máy chạy firewall: trường hợp này bảo mật hơn và tiết kiệm băng thông hơn vì "DNS forward" của firewall chịu trách nhiệm liên hệ với DNS của ISP lấy thông và lưu trữ thông tin tìm được trong cache. Để có thể sử dụng khả năng này. Bạn phải thiết lập dịch vụ "DNS forward" trên firewall. Chi tiết thiết lập dịch vụ này nằm ngoài giới hạn bài viết này. Điều cốt yếu bạn cần thiết lập là phải có dịch vụ DNS đang "lắng nghe" trên firewall ở cổng 53. Để an toàn, nên thiết lập cho INTIP lắng nghe cho dịch vụ này. Nói theo giới hạn thiết lập rules cho iptables, nếu đã thiết lập dịch vụ DNS trên INTIP, bạn không cần cụm 67-70 nữa mà chỉ cần các dòng 51-54 bởi vì các dòng này thiết lập luật cho phép các máy con từ nội mạng có thể liên hệ firewall trực tiếp ở cổng 53 cho mục đích giải danh.

Các cổng không hiện diện trong biến $UDP_OUT sẽ bị cản theo luật mặc định ở dòng 39.

- Dòng 72-75, đây là cụm khá đặc biệt so với ba cụm ở trên bởi vì nó dùng một module để "match" MAC address của máy con nào đó. Sử dụng y hệt vòng lặp như các cụm dành cho ICMP, TCP và UDP ở trên, cụm này ấn định các máy có MAC address lấy từ biến $OK_MAC sẽ được phép truy cập dịch vụ ftp (--dport 20:21) ngoài Internet. Các máy con không có giá trị MAC như đã khai báo trong $OK_MAC sẽ không thể truy cập dịch vụ đã ấn định trong luật. Cụm luật này có thể mở rộng ra thành nhiều dịch vụ khác nhau (không riêng gì ftp) nếu cần. Nếu bạn có số lượng lớn các MAC address cần được cho phép hoặc quản lý, thay vì dùng biến $OK_MAC như trên, bạn có thể tạo danh sách các MAC address trong một file riêng biệt và dùng một vòng lặp khác để đọc -4-. Phương pháp thu thập danh sách các MAC address tùy cách sắp xếp vì nó lệ thuộc vào mô hình và hệ điều hành dùng trong nội mạng của bạn.

- Dòng 77-80, tương tự như cụm 72-75 nhưng nó có tác dụng ngược lại. Tất cả các máy con có MAC address được khai báo trong biến $NOTOK_MAC sẽ hoàn bị bị từ chối (-j REJECT). Sở dĩ chúng ta dùng -j REJECT ở đây thay vì -j DROP vì chúng ta muốn phải chăng với người dùng (đã bị cấm) trong nội mạng. Tính "phải chăng" ở đây nằm ở quyết định dùng "target" là REJECT vì khi máy nào đó bị cấm, firewall sẽ gởi trả một thông điệp "host not found" đi theo với gói tin RST (reset) để đóng connection lại. Nếu dùng "target" là DROP thì người dùng sẽ không nhận được bất cứ thông điệp gì cả. Nếu anh ta dùng trình duyệt để duyệt web (và bị cấm) thì người dùng này phải "đợi" rất lâu và kết quả có thể là một thông điệp báo "connection time-out" hay tương tự. Tương tự với cụm trên, bạn có thể dùng vòng lặp ở chú thích -4- để chứa danh sách các MAC address bị cấm.

- Dòng 82, đây là một dòng luật rất quan trọng để bảo đảm các gói tin còn lại không phải ở tình trạng ESTABLISHED hoặc RELATED thì sẽ bị loại bỏ. Các dòng 58, 63, 68 và 73 cho phép các gói tin từ nội mạng được forward đến một host nào đó ngoài Internet ở các tình trạng NEW, ESTABLISHED, RELATED.... vì bạn tin tưởng các gói tin đi từ nội mạng ra ngoài. Tuy nhiên dòng 82 này ấn định một luật rất khắc khe là bất cứ các gói tin nào khác mà không ở tình trạng ESTABLISHED hoặc RELATED và chúng đi từ bất cứ network interface nào đi chăng nữa cũng đều được luật mặc định của firewall ở dòng 39 xử lý. Nếu có một gói tin nào đó hoàn toàn mới và không thuộc một xuất truy cập nào cả đột nhiên xuất hiện, nó sẽ bị huỷ.

- Dòng 84, đây là một luật xác định cơ chế NAT cho các máy con trong nội mạng. Nó xác định luật này thuộc "nat table" (-t nat) và thuộc POSTROUTING chain. Nếu lưu thông đi từ $INTNET ra ngoài, xuyên qua $EXTIF thì được nat (-j SNAT) đến IP $EXTIP. Điều này có nghĩa như sau:
1. SNAT là một "target" được dùng để thay thế địa chỉ nguồn của gói tin với địa chỉ của firewall.

2. Đúng với tinh thần "nat", một gói tin được gởi từ nội mạng có nguồn là một private IP xxx.xxx.xxx.xxx, muốn đi đến đích là một public IP zzz.zzz.zzz.zzz chẳng hạn, gói tin này được "nat" có nghĩa là nó được thay thế nguồn IP xxx.xxx.xxx.xxx thành IP của firewall trước khi nó được đi ra ngoài Internet (hay mạng bên ngoài giới hạn firewall bảo vệ).

3. Khi gói tin (với nguồn private IP đã được thay thế bằng public IP của firewall) được một public IP nào đó nó muốn truy cập trả lời, firewall sẽ tiếp nhận gói tin trả lời này và chuyển đến đúng private IP trong nội mạng đã dùng để gởi request.

4. Điều này ứng dụng cho mọi máy con thuộc nội mạng có gói tin đi đến firewall và firewall đóng vai trò bảo vệ cũng như là gateway ra ngoài.



(còn tiếp).



Chú thích:
-1-: proc filesystem là một virtual filesystem (filesystem "ảo"), nó được kernel tạo ra "on the fly" trong quá trình khởi động. Điều này có nghĩa là nó không hề chiếm bất cứ khoảng chứa nào trên đĩa như một filesystem thông thường. Hay nói một cách khác, nếu bạn cập nhật hoặc thay đổi thông tin trên "virtual filesystem", thông tin này chỉ thay đổi trên bộ nhớ mà không hề động chạm đến đĩa lưu dữ liệu. Cụ thể hơn với /proc filesystem, nó có những tính chất sau đây:
- nó lưu giữ rất nhiều thông tin lấy được từ kernel trong lúc ứng tác
- nó thay đổi thường xuyên trong khi kernel và system đang hoạt động
- nó được sắp xếp như thể nó là một filesystem thực sự, cho phép bạn duyệt xuyên qua cấu trúc thư mục của nó
- hầu hết /proc chứa thông tin ở dạng "read only" vì mục đích chính của /proc là để cung cấp thông tin để "đọc"
- trong /proc có một khu vực cho phép "read" và "write" đó là vùng /proc/sys và các thư mục con trong vùng này
- các thông tin trực tiếp liên hệ với iptables và netfilter trên /proc nằm ở /proc/sys/net/ipv4 (vì chúng ta đang làm việc với IPv4 ở đây).

-2-: private address space hay nôm na là "khoảng địa chỉ riêng cho nội mạng" bao gồm các network:
10.0.0.0 - 10.255.255.255
172.16.0.0 - 172.31.255.255
192.168.0.0 - 192.168.255.255
Ngoài ra còn có chuỗi 169.254.0.0 -169.254.255.255 được dùng cho dạng "tự động ấn định IP" (automatic private IP addressing) trong trường hợp máy con không liên hệ được với DHCP server nếu nó được chỉnh định để dùng IP động.

Dùng public address space cho nội mạng là điều nên tránh xa bằng mọi giá vì nó sẽ gây ra những sự cố cho vấn đề routing (định tuyến) cho các router và các thiết bị NAT trong cấu trúc mạng.

-3-: ứng dụng DNS là một đòi hỏi cần thiết cho mạng. Để giảm thiểu lưu thông cũng như bảo đảm thông tin được DNS cung cấp, bạn nên ấn định cho các máy con dùng DNS do chính ISP cung cấp (bằng cách chỉnh định bằng tay trên mỗi máy con hoặc áp đặt trên DHCP, chi tiết sắp xếp DHCP không nằm trong khuôn khổ bài viết này, bạn nên tìm hiểu chi tiết cho ứng dụng DHCP riêng của mình).

Bạn cũng có thể dùng "forward DNS" (dùng BIND) hoặc dùng dnscache (trong bộ djbdns của Dan Bernstein) để tạo dịch vụ DNS ngay trên chính firewall và "ép" các máy con trong nội mạng phải dùng dịch vụ này thay vì đi ra ngoài để liên hệ với một DNS server nào đó. Nói cho cùng, nếu dùng cách này thì máy chủ firewall vẫn phải liên hệ các DNS server tương thích bên ngoài để lấy dữ liệu cung cấp cho các máy con. Tuy nhiên, điểm lợi là máy chủ firewall có thể lưu giữ thông tin trong cache và các máy con có thể tái dụng thông tin này.

-4-: vòng lặp để đọc một hồ sơ bên ngoài tương tự như sau:

while read macs
do
$IPT -A FORWARD -p tcp -i $INTIF -o $EXTIF -m mac --mac-source $macs -d $EXTNET --dport 20:21 -j ACCEPT
echo "Allowd MAC address $macs to access ftp service."
done < /path/to/maclist.txt

trong đó, maclist.txt chứa mỗi MAC address một dòng.

Ví dụ: firewall có public IP là 203.162.1.100 và private IP thuộc nội mạng là 192.168.1.100. Máy con có private IP là 192.168.1.200 và nó muốn truy cập microsoft.com chẳng hạn.
- IP 192.168.1.200 gởi request đến microsoft.com xuyên qua gateway là 192.168.1.100 (private IP của firewall)
- firewall tiếp nhận và thay thế 192.168.1.200 bằng public IP của nó 203.162.1.100
- firewall tiếp tục gởi gói tin request đến microsoft.com
- microsoft.com tiếp nhận gói tin (vì nó dùng public IP hợp lệ) và gởi trả gói tin hồi đáp đến public IP của firewall
- firewall tiếp nhận gói tin hồi đáp này và chuyển nó vào trong cho 192.168.1.200

Đối với microsoft.com, nó không hề biết thật sự có một private IP là 192.168.1.200 gởi request cho nó -5-. Đối với 192.168.1.200, nó không hề biết là IP này được firewall thay thế và thay mặt nó gởi request đến microsoft.com. Thông tin đi và về từ 192.168.1.200 xảy ra như thể nó liên hệ trực tiếp với microsoft.com.

Các dòng luật "FORWARD" ở trên và dòng luật 84 này có sự tương quan rất chặt chẽ. Như đã đề cập ở trên, các gói tin được FORWARD là các gói tin được gởi từ nội mạng và có đích (-d là một IP không phải là IP của chính firewall. Nếu gói tin này có đích là IP của firewall, nó được đi vào INPUT chain. Nếu không, nó được đi vào FORWARD chain để đưa đến đích sau khi được firewall thực hiện quy trình nat. Nếu chỉ có dòng 84 này được thiết lập, các máy con cũng không thể dùng Internet cho dù chúng được firewall nat bởi vì không có cơ chế nào dùng để "forward" gói tin cả.

Một yếu tố cuối và hết sức quan trọng cho phép quy trình natforward thành công là một ấn định ngay trên đầu của firewall ở dòng số 3. Theo chú thích -1-, khu vực /proc/sys trên /proc filesystem cho phép đọc và viết (read and write) bởi thế, dòng ấn định:
echo "1" > /proc/sys/net/ipv4/ip_forward cho phép thay đổi giá trị ip_forward từ 0 (off) thành 1 (on). ip_forward là một "công tắc" đóng mở cơ chế định tuyến giữa các network interface của firewall (trong trường hợp này là giữa eth0 và eth1). Nếu giá trị ip_forward này là 0 (zero) thì các gói tin đi đến từ eth0 sẽ không thể chuyển sang eth1 để vào bên trong nội mạng. Tương tự, các gói tin đi đến từ eth1 không thể chuyển sang eth0 để đi ra ngoài Internet.

- Dòng 86-93, các dòng này còn gọi là các "catching rules". Chúng được ấn định với mục đích cản lọc tất cả các gói tin không được quy định cụ thể. Trong trường hợp này, chúng bị DROP hoàn toàn. Ứng dụng cản lọc này rất đơn giản, những gói tin đi vào và được các luật ấn định xử lý. Nếu chúng đã đi xuyên qua các dòng từ 33 đến 63 mà vẫn không có luật nào thích ứng thì chắc chắn đến cụm 86-93, chúng sẽ bị DROP. Song song với luật mặc định ở các dòng 37-39, các dòng 86-93 áp dụng lối cản lọc "những gì không được cho phép một cách cụ thể sẽ bị cản".

8. Nhận định cấu trúc nhóm luật:
Có hai điểm tối quan trọng về mặt bảo mật cần được nhấn mạnh trong nhóm luật trên.

8.1. Bảo mật đường vào
Xét trọn bộ nhóm luật trên, bạn hẳn thấy không hề có một dòng luật nào cho phép một xuất truy cập mới từ bên ngoài (Internet) vào ngay chính firewall và trong nội mạng. Firewall này chỉ cho phép người dùng từ nội mạng tạo xuất truy cập mới đến một dịch vụ nào đó bên ngoài Internet (trong khuôn khổ các cổng được phép dùng trong biến $TCP_OUT và $UDP_OUT). Theo sau đó, dịch vụ từ ngoài Internet mới có thể trả lời yêu cầu truy cập của máy con trong nội mạng xuyên qua cơ chế NAT mà firewall chịu trách nhiệm.

Đối với các máy (dịch vụ) từ bên ngoài Internet, chúng chỉ biết và chỉ có thể liên hệ với public IP của firewall. Tuy vậy, không có bất cứ phương tiện nào cho phép truy cập firewall trực tiếp bởi vì firewall hoàn toàn không có bất cứ một luật nào cho phép các máy từ Internet truy cập đến một dịch vụ nào đó trên  firewall.

Đối với các máy (con) từ trong nội mạng, chúng không có lý do gì để trực tiếp truy cập với firewall vì mục đích cao nhất: dùng firewall này làm phương tiện để truy cập Internet. Tuy vậy, các dòng 41 và 42 khá thư dãn:
41 $IPT -A INPUT -i $INTIF -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
42 $IPT -A OUTPUT -o $INTIF -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

nó cho phép các máy con trong nội mạng có thể tạo một xuất truy cập trực tiếp đến một dịch vụ nào đó ngay trên firewall. Nếu cần thiết lập firewall chặt chẽ hơn, bạn nên ấn định cụ thể những dịch vụ nào người dùng trong nội mạng có thể truy cập đến firewall. Hoặc chặt chẽ hơn nữa, bạn nên tắt bỏ mọi dịch vụ đang chạy trên firewall ngoại trừ một số dịch vụ tối cần thiết như SSH chẳng hạn -6-.

- Nếu bạn không muốn các máy con từ nội mạng truy cập trực tiếp vào IP của firewall, chỉnh hai dòng trên trở thành:
$IPT -A INPUT -i $INTIF -s $INTNET -d ! $INTIP -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o $INTIF -s $INTNET -d ! $INTIP -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
$IPT -A INPUT -i $INTIF -s $INTNET -d ! $EXTIP -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o $INTIF -s $INTNET -d ! $EXTIP -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT


Bốn dòng trên ấn định cụ thể rằng mọi traffic đi ra và đi vào xuyên qua network interface -i $INTIF và có đích không phải là IP của firewall (kể cả private IP lẫn public IP của firewall) thì được cho phép. Dấu thang (!) dùng để đảo ngược (negate) giá trị ở đây, nó có nghĩa là không phải là $INTIP hoặc $EXTIP.

- Nếu bạn muốn cho phép các máy con được quyền truy cập dịch vụ SSH đang chạy trên firewall chẳng hạn, bạn có thể đổi 2 dòng 41 và 42 như sau:
$IPT -A INPUT -i $INTIF -p tcp -s $INTNET -d $INTIP --dport 22 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT
$IPT -A OUTPUT -o $INTIF -p tcp -s $INTIP --sport 22 -d $INTNET -m state --state RELATED,ESTABLISHED -j ACCEPT


Hai dòng trên ấn định cụ thể các máy con trong nội mạng có thể truy cập đến dịch vụ SSH (cổng 22) đến private IP của firewall ($INTIP). Gói tin đi đến từ nội mạng có thể tiếp nhận ở tình trạng NEW,RELATED,ESTABLISHED trong khi gói tin trả lời từ private IP của firewall ($INTIP) chỉ có thể ở dạng RELATED,ESTABLISHED. Điều này một lần nữa nhấn mạnh tính bảo mật ở chỗ dịch vụ SSH của firewall không có lý do gì tự động liên hệ với một máy con trong nội mạng mà nó chỉ "trả lời khi được hỏi".

Ngoài ra, bạn còn có thể ấn định chặt chẽ hơn (nếu cần); chỉ cho phép một hoặc vài máy con trong nội mạng có MAC address cụ thể nào đó mới được quyền truy cập dịch vụ SSH trên firewall. Bạn có thể ứng dụng chế độ này dựa trên dòng 73.

Bảo mật đường vào xoay quanh nguyên lý: "bên trong hỏi thì bên ngoài mới trả lời" và "bên trong chỉ được hỏi đến những cổng đã được cho phép." Với nguyên lý này, những dạng tấn công của virus đến các máy con chạy Windows xuyên qua đường Internet đến các cổng dịch vụ phổ biến không thể xảy ra được vì trên thực tế, chúng chỉ có thể đụng đến firewall (và tất nhiên chúng sẽ bị huỷ một cách yên ắng) vì các luật đã định.

8.2. Bảo mật đường ra
Với dạng firewall này, "đường ra" (từ nội mạng) thư dãn hơn ở điểm là các máy con có thể tạo những request mới (đến các dịch vụ được cho phép). Việc mở rộng hay thu hẹp các cổng dịch vụ cho phép các máy con truy cập đến Internet tùy vào nhu cầu cá biệt của bạn.
- Nếu khắc khe, bạn có thể cho phép truy cập đến cổng 80 (cho web) và không cho dùng thêm bất cứ dịch vụ nào khác.
- Khắc khe hơn nữa, bạn có thể biên soạn một danh sách các địa chỉ (trang web) cho phép các máy con truy cập (được dùng cho thông số -d để thay thế $EXTNET). Các địa chỉ website không thuộc danh sách bạn cho phép sẽ cản người dùng truy cập chúng.
- Và nếu cần phải hết sức nghiêm ngặt, bạn có thể "ép" các máy con dùng một cache server (squid chẳng hạn) để cache server này thay mặt các máy con truy cập trang web và đem thông tin về. Điều này có nghĩa các máy con không hề liên hệ trực tiếp với các websites mà chúng chỉ đi đến cache server của bạn. squid cache server có thể tích hợp hàng loạt các quy định khác để duy trì bảo mật, ví dụ:
- buộc người dùng phải xác thực danh tánh trước khi được "duyệt" trang web (thực tế cache server duyệt và máy con chỉ nhận thông tin mà thôi).
- áp đặt kích thước thông tin được mang về
- áp đặt khoảng thời gian người dùng được phép duyệt web
- lược chọn những thông tin "thiếu trong sáng"
- giới hạn các websites thuộc dạng "độc hại"
- cản lọc virus, worm, trojan trên cache server trước khi hồi đáp thông tin về máy con
và còn nhiều chức năng khác nữa.

Lối thiết lập firewall này không chỉ thuần tuý "share Internet" mà nó áp đặt một số quy định (thư dãn hoặc chặc chẽ tùy bạn) để, chẳng những giảm thiểu nguy hiểm cho nội mạng của bạn mà còn giúp giảm thiểu hư hoại đến những máy khác trên Internet -7-.

Điều cần lưu ý là iptables chỉ bảo vệ nội mạng ở tầng IP. Nếu không tích hợp một dạng application level proxy (như squid cache chẳng hạn) thì giới hạn bảo vệ cho "đường đi ra ngoài" Internet chỉ dừng lại ở mức độ:
- cản những cổng dịch vụ không cho phép ra.
- cản những máy có MAC address cụ thể không cho phép ra
- cản những gói tin có mang các chuỗi "string match" dùng string match module, một module ứng dụng mở rộng của iptables (nhưng đây không phải là biện pháp ưu việt bởi vì chúng có thể cản lọc thiếu chính xác).


Chú thích:
-5-:  Nếu dùng private IP để gởi request thì sẽ không có gói tin hồi báo vì các private IP không được dùng trên Internet theo quy định của IANA. Cho dù có thể gởi gói tin đi từ các private IP, các gói tin này không thể hồi báo vì chúng không biết phải định tuyến đi đâu cả.

-6-: Cấu hình của chính SSH cho phép bạn ấn định dịch vụ này "lắng nghe" trên IP nào đó một cách cụ thể thay vì lắng nghe trên mọi IP của máy chạy firewall. Nếu bạn quyết định chỉ cho phép truy cập dịch vụ SSH từ nội mạng mà thôi, bạn có thể chỉnh định cho nó chỉ "lắng nghe" trên private IP tiếp diện với nội mạng. Ngoài ra, bạn có thể ấn định cụ thể các tài khoản nào có thể được truy cập đến dịch vụ SSH của firewall hoặc kèm theo các phương thức khác như dùng tcp_wrapper và thắt chặt bảo mật cho chính dịch vụ SSH. Vấn đề này nằm ngoài phạm vi nội dung bài viết này, để nghiên cứu sâu hơn, bạn có thể tham khảo các tài liệu cụ thể về SSH.

-7- Ví dụ, các máy con trong nội mạng của bạn bị nhiễm virus qua đường e-mail chẳng hạn (cứ cho bạn chưa có cơ chế cản lọc virus đúng mức cho cơ chế gởi nhận mail nên xảy ra tình trạng này) và những máy con bị nhiễm này liên tục gởi request đến các máy khác trên Internet đến cổng 445 (chẳng hạn). Điều này không thể được bởi vì các gói tin đó không thể đi ra ngoài theo luật firewall đã định. Đây là điều tốt và rất nên làm. Việc thiết kế hệ thống để ngăn ngừa virus cho cơ chế gởi nhận mail là một việc khác, không nằm trong khuôn khổ bài viết này cho nên bạn nên tham khảo một giải pháp nào đó thích hợp nhất với mô hình của mình.

9. Mở rộng cho Web
Do thiết kế firewall này dùng để "share Internet" trong giới hạn nào đó bạn muốn kiểm soát, việc mở rộng firewall với những dịch vụ tích hợp khác là điều cần thiết. Ở đây tôi không đào sâu vào các chi tiết sắp xếp, thiết kế những dịch vụ đi song song với iptables mà chỉ đưa ra một số dạng điển hình và thường gặp.

Mở rộng tích hợp cho web ở bình diện "share Internet" có thể ứng dụng một caching server như squid cache. Như đã đề cập trong phần 8.2, squid cache có thể được ấn định rất nhiều chức năng kiểm soát ở tầng ứng dụng. Thiết lập cache server có rất nhiều dạng lớn nhỏ, đơn giản, phức tạp khác nhau tùy thuộc vào giới hạn tài chính và nhu cầu của từng môi trường. Ở đây tôi đơn cử hai trường hợp khá phổ biến:

9.1 Squid cache trên cùng firewall:
Squid cache trên cùng firewall có hai ưu điểm chính:
- không đòi hỏi chi phí thêm kinh phí cho một máy chạy proxy cache
- thiết lập và tích hợp với iptables khá đơn giản

Tuy nhiên, nó cũng có hai nhược điểm chính:
- kém bảo mật nếu chạy chung trên firewall (vì nếu squid bị lỗi và bị nhân nhượng thì firewall có thể bị nhân nhượng).
- đòi hỏi tài nguyên khả dĩ mới có thể hoạt động (vì nếu cấu hình kém, hiệu xuất của cả firewall và squid cache sẽ kém).

Cho một công ty nhỏ, một máy có cấu hình ở mức 500Mhz cho CPU, 512Mb RAM, 40Gb đĩa cứng riêng để chứa cache có thể cung cấp dịch vụ cho số người dùng ít hơn con số 200 -8-, càng nhiều người dùng và càng nhiều chức năng cho squid sẽ đòi hỏi nhiều memory hơn.

Giả định bạn đã cài đặt squid cache và hoàn tất bước thử nghiệm truy cập thành công trên máy chạy firewall (máy chạy firewall có thể kết nối với ISP thành công, máy con trong nội mạng khai báo địa chỉ proxy server chính là private IP của firewall và có thể duyệt web mà không cần bất cứ firewall rule nào). Để buộc mọi traffic có đích là dịch vụ web phải đi xuyên qua squid cache, còn gọi là "transparent proxy" (cùng chạy trên máy firewall) bạn cần thiết lập các chi tiết sau:

9.1.1 Thiết lập trên squid.conf
Giả định squid đang "lắng nghe" trên cổng 8080, để có thể tạo "transparent" proxy, squid.conf phải có các giá trị sau:
http_port 8080
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on

Nếu cần nắm rõ ý nghĩa của các giá trị trên, bạn bên tham khảo tài liệu thiết lập squid (khởi đầu từ: http://www.squid-cache.org).

9.1.2 Thiết lập trên firewall rule
Giả định squid đang "lắng nghe" trên cổng 8080, iptables rule của bạn cần có thêm các dòng sau để ứng hiệu khả năng "ép" lưu thông cụ thể cho việc duyệt web phải đi xuyên qua squid cache như sau:
1 $IPT -t nat -A PREROUTING -i $INTIF -p tcp -s $INTNET --sport $HI_PORTS --dport 80 -j REDIRECT --to-port 8080
2 $IPT -A INPUT -i $INTIF -p tcp -s $INTNET --sport $HI_PORTS -d $INTIP --dport 8080 -m state --state NEW,ESTABLISHED -j ACCEPT
3 $IPT -A OUTPUT -o $EXTIF -p tcp -s $EXTIP --sport $HI_PORTS -d $EXTNET --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
4 $IPT -A INPUT -i $EXTIF -p tcp -s $EXTNET --sport 80 -d $EXTIP --dport $HI_PORTS -m state --state ESTABLISHED -j ACCEPT
5 $IPT -A OUTPUT -o $INTIF -p tcp -s $INTIP --sport 8080 --dport $HI_PORTS -m state --state ESTABLISHED -j ACCEPT


Mỗi dòng trong năm dòng trên đều có trách nhiệm riêng và cụ thể để phục vụ cơ chế "transparent" proxy. Có thể hiểu chúng như sau:

- Dòng 1, thiết lập một luật trên NAT table. Tất cả traffic đi từ nội mạng (-s $INTNET) xuyên qua NIC tiếp diện với nội mạng (-i $INTIF), có cổng nguồn thuộc chuỗi 1024:65535 và có cổng đích là 80 (web) thì được chuyển (REDIRECT) đến cổng 8080 trên máy chạy firewall -9-. Cơ chế redirect ở đây không chỉ rõ địa chỉ IP là gì vì nó là một "target" rất đặc biệt: nó chuyển traffic đến một cổng cụ thể nào đó ngay trên chính máy cục bộ (ở đây là máy chạy firewall). Đây chính là phần mở đầu của cơ chế "ép" web traffic đi xuyên qua squid cache đang lắng nghe ở cổng 8080.

- Dòng 2, thiết lập một INPUT rule trên filter table. Nếu gói tin đi từ nội mạng (-s $INTNET) xuyên qua NIC tiếp diện với nội mạng (-i $INTIF), có cổng nguồn thuộc chuỗi 1024:65535, có đích là địa chỉ IP của firewall thuộc nội mạng (-d $INTIP và cổng đích là 8080 (cổng squid đang lắng nghe). Song song vào đó, nếu gói tin này ở tình trạng NEW,ESTABLISHED thì được tiếp nhận. Luật này cho phép các gói tin đi từ nội mạng đến cổng dịch vụ của squid (8080) đang chạy trên máy chủ firewall bởi vì các máy con muốn truy cập web không còn dựa trên cơ chế FORWARD để đi ra ngoài Internet nữa mà chúng phải đi xuyên qua squid cache và bởi vì squid cache nằm ngay trên máy chạy firewall nên chúng phải đi xuyên qua INPUT chain. Sở dĩ phải ấn định tình trạng NEW,ESTABLISHED là vì chúng ta cho phép các gói tin đi từ nội mạng đến squid để tạo một request mới để hình thành một xuất truy cập.

- Dòng 3, đây là dòng thiết lập OUTPUT rule trên filter table. Nó ấn định trường hợp các gói tin thuộc giao thức TCP đi từ EXTIP của firewall ra ngoài Internet xuyên qua EXTIF (NIC tiếp diện với ngoại mạng), có cổng nguồn thuộc chuỗi 1024:65535, có đích là bất cứ IP nào với cổng dịch vụ 80 (bất cứ website nào). Song song vào đó, nếu gói tin này ở tình trạng NEW,ESTABLISHED thì được tiếp nhận. Luật này cho phép squid trên chính firewall liên hệ trực tiếp với website nào đó trên Internet. Nó cấn thiết bởi vì squid phải thay mặt các máy con trong LAN để liên hệ với các website và đem thông tin về. Sở dĩ phải ấn định tình trạng NEW,ESTABLISHED là vì chúng ta cho phép các gói tin đi từ firewall đến một website nào đó trên Internet để tạo một request mới và hình thành một xuất truy cập.

- Dòng 4, đây là dòng thiết lập INPUT rule trên filter table. Nó ấn định trường hợp các gói tin thuộc giao thức TCP đi từ Internet có cổng nguồn là 80, có đích là EXTIP (IP tiếp diện ngoại mạng của firewall), có cổng đích thuộc chuỗi 1024:65535 và ở tình trạng ESTABLISHED thì được tiếp nhận. Luật này cho phép các gói tin đi từ các website trên Internet [b]trả lời[/b] các request được tạo ra từ dòng 3 ở trên. Sở dĩ phải ấn định tình trạng ESTABLISHED là vì website chỉ có thể trả lời squid của chúng ta mà không thể tạo một request truy cập mới đến squid -10-.

- Dòng 5, đây là dòng thiết lập OUTPUT rule trên filter table. Nó ấn định trường hợp các gói tin thuộc giao thức TCP đi xuyên qua INTIF (NIC tiếp diện nội mạng) có nguồn là INTIP (IP tiếp diện nội mạng của firewall), có cổng nguồn là 8080, cổng đích thuộc chuỗi 1024:65535 và ở tình trạng ESTABLISHED thì được tiếp nhận. Đây là luật tiếp nối của dòng 2 ở trên. Nó cần thiết để cho phép squid cache trả về thông tin nó lấy được từ website trên Internet cho các máy con trong nội mạng. Sở dĩ nó được ấn định tình trạng ESTABLISHED là vì máy con trong nội mạng có "hỏi" thì squid cache mới đi lấy thông tin và "trả lời". squid cache không có lý do gì để tạo một xuất truy cập mới đến các máy con.

9.2 Squid cache trên một máy riêng biệt:
Squid cache trên một server riêng biệt có hai ưu điểm chính:
- gia tăng hiệu xuất, đặc biệt server này chỉ dành riêng cho công tác caching.
- gia tăng bảo mật vì nó độc lập với firewall. Nếu cache server bị nhân nhượng, nó không dẫn đến những tác hại nặng nề như trường hợp chạy trên cùng server với firewall.

Tuy nhiên, nó cũng có hai nhược điểm chính:
- đòi hỏi chi phí thêm kinh phí cho một máy chạy proxy cache riêng biệt
- thiết lập và tích hợp với iptables phức tạp hơn.

9.2.1 Thiết lập trên squid.conf
Phần này y hệt như phần 9.1.1 ở trên.

9.2.2 Thiết lập trên firewall rule
Việc thiết kế và nối mạng cho máy squid cache này tùy thuộc vào mô hình mạng của mỗi nơi. Tuy nhiên, bạn có thể rơi vào một trong hai dạng chính:
- squid cache server nằm trên cùng subnet với firewall. squid cache server và firewall tiếp nối qua một switch hay hub thông thường.
- squid cache nằm trên một subnet khác với firewall. Subnet này có thể được tách rời bởi một router ở giữa hoặc chính firewall server là router đến subnet khác. Đây là dạng DMZ thường thấy. Trong trường hợp mô hình mạng không có DMZ, bạn có thể gắn thêm một NIC thứ ba trên firewall và ấn định một IP thuộc subnet khác cho NIC thứ ba này để nối tiếp với squid cache server bằng cross cable. Đây là một dạng 'mini' DMZ thường thấy ở các công ty nhỏ.

Tôi không đi sâu vào chi tiết thiết kế topology ở đây. Những dạng trên chỉ là các gợi ý tổng quát. Điểm chính yếu bạn cần lưu tâm là firewall server và squid cache server phải liên lạc được với nhau trên căn bản nối tiếp.

Giả định squid đang "lắng nghe" trên cổng 8080 của IP 10.10.10.10, trên một server riêng biệt và được kết nối với firewall server xuyên qua cross cable, xuyên qua eth2 chẳng hạn. Tạm dùng các biến như sau:

DMZIF="eth2"
DMZIP=10.10.10.1
SQUID_BOX=10.10.10.10

iptables rule của bạn cần có thêm các dòng sau để ứng hiệu khả năng "ép" lưu thông cụ thể cho việc duyệt web phải đi xuyên qua squid cache như sau:
1. $IPT -t nat -A PREROUTING -i $DMZIF -p tcp -s ! $SQUID_BOX --dport 80 -j DNAT --to $SQUID_BOX:8080
2. $IPT -t nat -A POSTROUTING -o $DMZIF -s $INTNET -d $SQUID_BOX -j SNAT --to $DMZIP
3. $IPT -A FORWARD -p tcp -s $INTNET -d $SQUID_BOX -i $DMZIF -o $DMZIF --dport 8080 -j ACCEPT


Khác với trường hợp squid chạy trên cùng máy chủ với firewall, FORWARD chain của firewall cần hiện diện để đưa gói tin từ mạng LAN đến máy chủ chạy squid. Hơn nữa, PREROUTING không dùng target REDIRECT nữa mà nó dùng target DNAT bởi vì gói tin không có đích là máy chủ chạy firewall mà là máy chủ chạy squid.

- Dòng 1, thiết lập một luật trên NAT table. Tất cả mọi lưu thông đi từ bất cứ nơi nào mà xuyên qua $DMZIF và có cổng đích là 80 (web) thì được chuyển (DNAT) đến cổng 8080 trên máy chạy squid. Cơ chế DNAT ở đây dùng để đổi đích của gói tin và biến đích trở thành IP của squid server bởi vì squid sẽ thay mặt các máy trạm liên hệ web site nào đó trên Internet để lấy thông tin.

- Dòng 2, thiết lập một luật khác trên NAT table. Tất cả mọi lưu thông đi từ nội mạng ($INTNET) và không phải xuất phát từ squid server (! $SQUID_BOX) đi xuyên qua $DMZIF thì sẽ được chuyển (SNAT) đến IP của squid. Một chi tiết cần lưu ý ở đây là ! $SQUID_BOX. Dấu chấm thang (!) dùng để đảo ngược (negate) có nghĩa là "không phải" $SQUID_BOX. Lý do tại sao chi tiết này quan trọng? Là vì chỉ có lưu thông đi từ nội mạng ra mới cần được SNAT (nat) và được nat cụ thể đến IP của squid để squid thi hành công tác của nó. Lưu thông đi từ chính squid server không cần (và không nên) được nat với cùng tính chất bởi vì nó không phục vụ mục đích gì cả. Chính máy chủ squid được firewall nat ở dòng 84 ở trên.

- Dòng 3, dòng này không kém quan trọng hai dòng trước. Bạn còn nhớ nguyên tắc: nếu gói tin đi từ mạng LAN đến điểm đích mà đích này không phải là firewall chúng ta đang thiết lập thì gói tin này phải đi qua FORWARD chain được nhắc đến trong phần 1 của bài viết? Đúng vậy! gói tin đi từ nội mạng có đích không phải là firewall mà đích là squid server. Bởi thế, nó cần được forward thì mới lưu chuyển từ nội mạng đến squid server. Sau khi gói tin đi đến squid server, squid sẽ thay mặt máy trạm làm công tác liên hệ với web site nào đó trên Internet để lấy thông tin. Trước khi gói tin đi từ squid server ra ngoài Internet, nó mới được firewall nat để đi ra ngoài.

Nếu nhìn mô hình theo dạng tổng thể:

Nội mạng (và máy trạm) là A
squid server là B
firewall là C
Internet (website) là D

thì;
- lưu thông đi từ A sẽ được firewall nat đến B
- B tiếp nhận và thay thế A để liên lạc với D
- C nat B để B có thể tiếp xúc với D

- Đối với D (một website nào đó bên ngoài Internet), nó không hề biết B, hay A. Nó chỉ biết có C (public IP của C) liện lạc với nó để lấy thông tin.
- Đối với B, nó không biết là C đã thay mặt nó (dùng public IP của C) để liên hệ với D lấy thông tin.
- Đối với A, nó không biết là B đã thay mặt nó đi lấy thông tin từ website D.

Tính bảo mật sẽ được duy trì vì:
- ACL được thiết lập trên hồ sơ cấu hình squid.conf chỉ cho phép các subnet (nội mạng) cụ thể được liên lạc với nó.
- một request mới từ bên ngoài Internet đi vào để liên hệ với squid server không được vì ngay chính firewall không cho phép.
- squid chỉ thực hành công tác khi có một yêu cầu đi từ nội mạng đến nó. Chỉnh bản thân squid không tự tạo một request mới.
- các ứng dụng cản lọc trên tầng application được hoàn thiện như đã khái quát ở phần 8.2

Chú thích:
-8-: tôi đã thiết lập một firewall có tích hợp với squid cache trên một máy có cấu hình tương tự cho một khách hàng có nội mạng gần 200 người dùng. Hệ thống này đã chạy liên tục hơn hai năm không restart cho đến khi cần nâng cấp phần hardware. Công ty này dùng hai đường dây Internet: một đường dây cho người dùng trong nội mạng duyệt Web tách biệt khỏi đường dây (và network) cung cấp dịch vụ.

-9-: REDIRECT là một "target" rất đặc biệt của iptables. Để nắm nguyên tắc, bạn nên tham khảo tài liệu cụ thể về NAT tables trên website http://www.iptables.org. Điều tôi muốn đề cập ở đây là một chi tiết thường tạo bối rối cho những người không có cơ hội "sniff" các gói tin được REDIRECT hoặc đọc mã nguồn của iptables/netfilter để nắm rõ nó thực sự được redirect về đâu. Tổng quát mà nói, REDIRECT là cơ chế chuyển tải các gói tin và dòng tin (packet streams) đến chính máy chủ nào đang ứng hiệu cơ chế REDIRECT. Điều này có nghĩa nó chuyển tải về ngay chính firewall chúng ta đang thiết lập. Thông thường, nếu gói tin được tạo ra từ chính máy chạy firewall, nó sẽ được redirect về ip 127.0.0.1, loopback IP. Điều làm nhiều người bối rối là hầu hết mọi người tin rằng hễ dùng REDIRECT thì gói tin sẽ tự động đi về 127.0.0.1 trên cổng nào đó đã ấn định sẵn (8080 chẳng hạn như trong trường hợp chúng ta đang bàn). Thật ra, target REDIRECT này chuyển tải các gói tin và dòng tin về IP nào mà nó được "preroute" xuyên qua. Ví dụ, dòng:
$IPT -t nat -A PREROUTING -i $INTIF -p tcp -s $INTNET --sport $HI_PORTS --dport 80 -j REDIRECT --to-port 8080
cho thấy các gói tin có cổng đích là 80 mà đi xuyên quan INTIF thì khi được REDIRECT, nó phải về IP 172.16.1.100 (IP tiếp diện nội mạng) bởi vì nó đi xuyên qua INTIF.

Tại sao đây là điểm cần đề cập? Bởi vì nó trực tiếp liên quan đến cổng nào squid đang lắng nghe và REDIRECT về đúng đích và tránh những thông điệp cảnh báo không cần thiết và bảo đảm hiệu xuất của cơ chế redirection. Nếu squid lắng nghe trên mọi IP của firewall (internal IP, external IP, loopback IP hoặc IP nào khác nếu có thêm NIC ứng hiệu) thì việc REDIRECT không có trở ngại gì bởi vì REDIRECT sẽ chuyển tải gói tin về đúng ngay IP/PORT của squid đang lắng nghe trên firewall. Tuy nhiên, nếu squid lắng nghe trên một IP cụ thể nào đó mà thôi (có thể điều chỉnh trong cấu hình của squid.conf) thì bạn sẽ gặp một số biến cố:
- iptables/netfilter phải xác định xem squid thực sự lắng nghe trên IP nào của firewall để định tuyến (route) gói tin về đúng đích. Để đạt được kết quả, cơ chế định tuyến cục bộ (internal routing) của kernel phải làm việc thêm các bước cần thiết và dẫn đến việc giảm hiệu xuất.
- bạn sẽ nhận được hàng loạt "martian" log trong syslog bởi vì kernel nhận được hàng loạt gói tin có header mang IP này nhưng lại xuất phát từ IP khác.

Đây là những biến cố nên tránh.

-10- Đây là một ấn định cực kỳ quan trọng của trọn bộ cơ chế "transparent proxy" mà chúng ta đang thiết lập bởi vì bạn chỉ cho phép các máy con trong nội mạng của bồ dùng squid cache. Bạn không muốn các máy con từ những nguồn không phải là nội mạng của bạn "mượn tạm" squid cache để dùng. Ngoài ấn định "state" trên iptables như đã phân tích ở đây, bạn cũng cần lưu tâm đến các ấn định ACL (access control list) trên squid.conf của dịch vụ squid cache để bảo đảm chỉ nội mạng của bạn mới có thể sử dụng squid cache.

Tổng hợp từ Internet
 
Ý kiến phản hồi và bình luận Góp ý kiến của bạn

Các tin mới nhất :
- Thiết lập 1 hệ thống High-availability - Loadbalancing và Reverse Proxy cho Web Server trên CentOS 6/RHEL Sử dụng HAProxy và Keepalived
- Đồng bộ hóa dữ liệu giữa hai Server Ubuntu 11.10 sử dụng Unison.
- Bảo vệ thư mục web với mod_auth_mysql trên Apache2
- Tích hợp MailScanner - ClamAV - SpamAssassin - SquirrelMail vào PostfixTrên Centos 5.7
- Cài đặt rsnapshot trên CentOS
- Xây dựng hệ thống NAS Cluster sử dụng OpenFiler
- Cài đặt Nginx trên Ubuntu 11.10
- Thiết lập hệ thống Active/active Samba CTDB Cluster sử dụng GFS & DRBD Trên Centos 5.7 X86_64
- Thiết lập máy chủ Ubuntu 11.10 và cài đặt ISPConfig 3 (Phần3)
- Thiết lập máy chủ Ubuntu 11.10 và cài đặt ISPConfig 3 (Phần2)
Các tin liên quan :
- Thiết lập tường lửa Iptables cho Linux - Phần 3
- Thiết lập tường lửa Iptables cho Linux - Phần 2
- Cài đặt lighttpd trên Linux
- Kiểm tra file, service và restart service khi cần thiết với Monit
- Tối ưu và tăng tốc PHP với XCache !
- Thiết lập Openvpn trên Server Linux
- Thiết lập tường lửa Iptables cho Linux - Phần 1
Bài nhiều người đọc cùng chuyên mục
Thiết lập 1 hệ thống High-availability - Loadbalancing và Reverse Proxy cho Web Server trên CentOS 6/RHEL Sử dụng HAProxy và Keepalived
 
Cài đặt Nginx trên server CentOS 6 x86_64 với PHP5 hỗ trợ qua PHP – FPM và MySQL.
 
Cấu hình ftp server với vsftpd
 
Quản lý đĩa trên linux dùng kỹ thuật LVM (Phần 1)
 
Cài Đặt Web Server (LAMP )Trên Centos 6 X86_64
 
Cài đặt và cấu hình Server Linux CentOS hoàn chỉnh (Phần 1)
 
Cài đặt công cụ giám sát web server apache
 
Trang chủ | Giới thiệu | Quảng cáo | Liên hệ
Giấy phép ICP số 199/GP-TTĐT. Bộ Thông tin và Truyền thông cấp.
Cơ quan quản lý  : Công Ty Cổ Phần Kênh Giải Pháp
Bản quyền © 2010-2011 Kenhgiaiphap.vn . Giữ toàn quyền.
Ghi rõ nguồn "Kenhgiaiphap.vn" khi phát hành lại thông tin từ website này.

return false; });