You are on page 1of 14

HỌC VIỆN KỸ THUẬT MẬT MÃ

KHOA AN TOÀN THÔNG TIN


***

Bài giảng:

THIẾT LẬP HỆ THỐNG TƯỜNG LỬA VỚI


IPTABLES

Hà nội
Bài giảng
THIẾT LẬP HỆ THỐNG TƯỜNG LỬA VỚI IPTABLES
Mục đích bài giảng:
 Tìm hiểu về IPTABLES
 Xây dựng hệ thống tường lửa với IPTABLES
Nội dung bài giảng:
1-Giới thiệu cơ bản về các hoạt động của IPTABLES và cách cấu hình iptables.
2-Hướng dẫn cách cấu hình IPTABLES cho một Web Sever.

Phần I GIỚI THIỆU IPTABLES


Iptables là một tường lửa ứng dụng lọc gói dữ liệu rất mạnh, miễn phí và có sẵn trên Linux..
Netfilter/Iptables gồm 2 phần là Netfilter ở trong nhân Linux và Iptables nằm ngoài nhân.
Iptables chịu trách nhiệm giao tiếp giữa người dùng và Netfilter để đẩy các luật của người dùng
vào cho Netfiler xử lí. Netfilter tiến hành  lọc các gói dữ liệu ở mức IP. Netfilter làm việc trực
tiếp trong nhân, nhanh và không làm giảm tốc độ của hệ thống.
1 - Cách đổi địa chỉ IP động (dynamic NAT)
NAT động là một trong những kĩ thuật chuyển đổi địa chỉ IP NAT (Network Address
Translation). Các địa chỉ IP nội bộ được chuyển sang IP NAT như sau:

NAT Router đảm nhận việc chuyển dãy IP nội bộ 169.168.0.x sang dãy IP mới
203.162.2.x. Khi có gói liệu với IP nguồn là 192.168.0.200 đến router, router sẽ đổi IP nguồn
thành 203.162.2.200 sau đó mới gởi ra ngoài. Quá trình này gọi là SNAT (Source-NAT, NAT
nguồn). Router lưu dữ liệu trong một bảng gọi là bảng NAT động. Ngược lại, khi có một gói từ
liệu từ gởi từ ngoài vào với IP đích là 203.162.2.200, router sẽ căn cứ vào bảng NAT động hiện
tại để đổi địa chỉ đích 203.162.2.200 thành địa chỉ đích mới là 192.168.0.200. Quá trình này gọi
là DNAT (Destination-NAT, NAT đích). Liên lạc giữa 192.168.0.200 và 203.162.2.200 là hoàn
toàn trong suốt (transparent) qua NAT router. NAT router tiến hành chuyển tiếp (forward) gói dữ
liệu từ 192.168.0.200 đến 203.162.2.200 và ngược lại.

2 - Cách giả địa chỉ IP (masquerade)


Đây là một kĩ thuật khác trong NAT.
NAT Router chuyển dãy IP nội bộ 192.168.0.x sang một IP duy nhất là 203.162.2.4 bằng
cách dùng các số hiệu cổng (port-number) khác nhau. Chẳng hạn khi có gói dữ liệu IP với nguồn
192.168.0.168:1204, đích 211.200.51.15:80 đến router, router sẽ đổi nguồn thành
203.162.2.4:26314 và lưu dữ liệu này vào một bảng gọi là bảng Masquerade động. Khi có một
gói dữ liệu từ ngoài vào với nguồn là 221.200.51.15:80, đích 203.162.2.4:26314 đến router,
router sẽ căn cứ vào bảng masquerade động hiện tại để đổi đích từ 203.162.2.4:26314 thành
192.168.0.164:1204. Liên lạc giữa các máy trong mạng LAN với máy khác bên ngoài hoàn toàn
trong suốt qua router.

3 - Cấu trúc của Iptables.


Iptables được chia làm 4 bảng (table): bảng filter dùng để lọc gói dữ liệu, bảng nat dùng để
thao tác với các gói dữ liệu được NAT nguồn hay NAT đích, bảng mangle dùng để thay đổi các
thông số trong gói IP và bảng conntrack dùng để theo dõi các kết nối. Mỗi table gồm nhiều mắc
xích (chain). Chain gồm nhiều luật (rule) để thao tác với các gói dữ liệu. Rule có thể là ACCEPT
(chấp nhận gói dữ liệu), DROP (thả gói), REJECT (loại bỏ gói) hoặc tham chiếu (reference) đến
một chain khác.

4 - Quá trình chuyển gói dữ liệu qua Netfilter.


Gói dữ liệu (packet) chạy trên chạy trên cáp, sau đó đi vào card mạng (chẳng hạn như
eth0). Đầu tiên packet sẽ qua chain PREROUTING (trước khi định tuyến). Tại đây, packet có
thể bị thay đổi thông số (mangle) hoặc bị đổi địa chỉ IP đích (DNAT). Đối với packet đi vào
máy, nó sẽ qua chain INPUT. Tại chain INPUT, packet có thể được chấp nhận hoặc bị hủy bỏ.
Tiếp theo packet sẽ được chuyển lên cho các ứng dụng (client/server) xử lí và tiếp theo là được
chuyển ra chain OUTPUT. Tại chain OUTPUT, packet có thể bị thay đổi các thông số và bị lọc
chấp nhận ra hay bị hủy bỏ. Đối với packet forward qua máy, packet sau khi rời chain
PREROUTING sẽ qua chain FORWARD. Tại chain FORWARD, nó cũng bị lọc ACCEPT hoặc
DENY. Packet sau khi qua chain FORWARD hoặc chain OUTPUT sẽ đến chain
POSTROUTING (sau khi định tuyến). Tại chain POSTROUTING, packet có thể được đổi địa
chỉ IP nguồn (SNAT) hoặc MASQUERADE. Packet sau khi ra card mạng sẽ được chuyển lên
cáp để đi đến máy tính khác trên mạng.
5 - Các tham số dòng lệnh thường gặp của Iptables.
1. Gọi trợ giúp
Để gọi trợ giúp về Iptables, gõ lệnh $ man iptables hoặc $ iptables --help. Chẳng hạn nếu
cần biết về các tùy chọn của  match limit, gõ lệnh $ iptables -m limit --help.
2. Các tùy chọn để chỉ định thông số
- Chỉ định tên table: -t <tên_table>, ví dụ -t filter, -t nat, .. nếu không chỉ định table, giá trị
mặc định là filter.
- Chỉ đinh loại giao thức: -p <tên giao thức>, ví dụ -p tcp, -p udp hoặc -p ! udp để chỉ định
các giao thức không phải là udp.
- Chỉ định card mạng vào: -i <tên_card_mạng_vào>, ví dụ: -i eth0, -i lo
- Chỉ định card mạng ra: -o <tên_card_mạng_ra>, ví dụ: -o eth0, -o pp0
- Chỉ định địa chỉ IP nguồn: -s <địa_chỉ_ip_nguồn>, ví dụ: -s 192.168.0.0/24 (mạng
192.168.0 với 24 bít mạng), -s 192.168.0.1-192.168.0.3 (các IP 192.168.0.1, 192.168.0.2,
192.168.0.3).
- Chỉ định địa chỉ IP đích: -d <địa_chỉ_ip_đích>, tương tự như -s
- Chỉ định cổng nguồn: --sport <cổng_nguồn>, ví dụ: --sport 21 (cổng 21), --sport 22:88
(các cổng 22 .. 88), --sport :80 (các cổng <=80), --sport 22: (các cổng >=22)
-Chỉ định cổng đích: --dport <cổng_đích>, tương tự như --sport
3. Các tùy chọn để thao tác với chain
- Tạo chain mới: iptables -N <tên_chain>
- Xóa hết các luật đã tạo trong chain: iptables -X <tên_chain>
- Đặt chính sách cho các chain `built-in` (INPUT, OUTPUT & FORWARD): iptables -P
<tên_chain_built-in> <tên policy (DROP hoặc ACCEPT)>.
ví dụ: iptables -P INPUT ACCEPT để chấp nhận các packet vào chain INPUT
- Liệt kê các luật có trong chain: iptables -L <tên_chain>
- Xóa các luật có trong chain (flush chain): iptables -F <tên_chain>
- Reset bộ đếm packet về 0: iptables -Z <tên_chain>
4. Các tùy chọn để thao tác với luật
- Thêm luật: -A (append)
- Xóa luật: -D (delete)
- Thay thế luật: -R (replace)
- Chèn thêm luật: -I (insert)

5. ACCEPT, DROP và REJECT packet


- ACCEPT: chấp nhận packet
- DROP: thả packet (không hồi âm cho client)
- REJECT: loại bỏ packet (hồi âm cho client bằng một packet khác)
Ví dụ:
# iptables -A INPUT -i eth0 --dport 80 -j ACCEPT chấp nhận các packet vào cổng 80 trên
card mạng eth0
# iptables -A INPUT -i eth0 -p tcp --dport 23 -j DROP thả các packet đến cổng 23 dùng
giao thức TCP trên card mạng eth0
# iptables -A INPUT -i eth1 -s ! 10.0.0.1-10.0.0.5 --dport 22 -j REJECT --reject-with tcp-
reset gởi gói TCP với cờ RST=1 cho các kết nối không đến từ dãy địa chỉ IP 10.0.0.1..5 trên
cổng 22, card mạng eth1
# iptables -A INPUT -p udp --dport 139 -j REJECT --reject-with icmp-port-unreachable
gởi gói ICMP `port-unreachable` cho các kết nối đến cổng 139, dùng giao thức UDP

6 - NEW, ESTABLISHED và RELATED.


- NEW: mở kết nối mới
- ESTABLISHED: đã thiết lập kết nối
- RELATED: mở một kết nối mới trong kết nối hiện tại
Ví dụ:
# iptables -P INPUT DROP đặt chính sách cho chain INPUT là DROP
# iptables -A INPUT -p tcp --syn -m state --state NEW -j ACCEPT chỉ chấp nhận các gói
TCP mở kết nối đã set cờ SYN=1
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT không đóng
các kết nối đang được thiết lập, đồng thời cũng cho phép mở các kết nối mới trong kết nối được
thiết lập
# iptables -A INPUT -p tcp -j DROP các gói TCP còn lại đều bị DROP

7 -Tùy chọn --limit, --limit-burst.


--limit-burst: mức đỉnh, tính bằng số packet
--limit: tốc độ khi chạm mức đỉnh, tính bằng số packet/s(giây), m(phút), d(giờ) hoặc
h(ngày)
Ví dụ cụ thể:
# iptables -N test
# iptables -A test -m limit --limit-burst 5 --limit 2/m -j RETURN
# iptables -A test -j DROP
# iptables -A INPUT -i lo -p icmp --icmp-type echo-request -j test
Đầu tiên lệnh iptables -N test để tạo một chain mới tên là test (table mặc định là filter).
Tùy chọn -A test (append) để thêm luật mới vào chain test. Đối với chain test, giới hạn limit-
burst ở mức 5 gói, limit là 2 gói/phút, nếu thỏa luật sẽ trở về (RETURN) còn không sẽ bị DROP.
Sau đó nối thêm chain test vào chain INPUT với tùy chọn card mạng vào là lo, giao thức icmp,
loại icmp là echo-request. Luật này sẽ giới hạn các gói PING tới lo là 2 gói/phút sau khi đã đạt
tới 5 gói.
$ ping -c 10 localhost
Chỉ 5 gói đầu trong phút đầu tiên được chấp nhận, thỏa luật RETURN đó. Bây giờ đã đạt
đến mức đỉnh là 5 gói, lập tức Iptables sẽ giới hạn PING tới lo là 2 gói trên mỗi phút bất chấp có
bao nhiêu gói được PING tới lo đi nữa. Nếu trong phút tới không có gói nào PING tới, Iptables
sẽ giảm limit đi 2 gói tức là tốc độ đang là 2 gói/phút sẽ tăng lên 4 gói/phút. Nếu trong phút nữa
không có gói đến, limit sẽ giảm đi 2 nữa là trở về lại trạng thái cũ chưa đạt đến mức đỉnh 5 gói.
Quá trình cứ tiếp tục như vậy. Chỉ cần nhớ đơn giản là khi đã đạt tới mức đỉnh, tốc độ sẽ bị giới
hạn bởi tham số--limit. Nếu trong một đơn vị thời gian tới không có gói đến, tốc độ sẽ tăng lên
đúng bằng --limit đến khi trở lại trạng thái chưa đạt mức --limit-burst thì thôi.
Để xem các luật trong Iptables gõ lệnh $ iptables -L -nv (-L tất cả các luật trong tất cả các
chain, table mặc định là filter, -n liệt kê ở dạng số, v để xem chi tiết)
# iptables -L -nv
Chain INPUT (policy ACCEPT 10 packets, 840 bytes)
pkts bytes target prot opt in out source destination
10 840 test icmp -- lo * 0.0.0.0/0 0.0.0.0/0 icmp type 8

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)


pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 15 packets, 1260 bytes)


pkts bytes target prot opt in out source destination

Chain test (1 references)


pkts bytes target prot opt in out source destination
5 420 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0 limit: avg 2/min burst 5
5 420 DROP all -- * * 0.0.0.0/0 0.0.0.0/0
# iptables -Z reset counter
# iptables -F flush luật
# iptables -X xóa chain đã tạo

8 – Redirect cổng.
Iptables hổ trợ tùy chọn -j REDIRECT cho phép đổi hướng cổng một cách dễ dàng. Ví dụ
như SQUID đang listen trên cổng 3128/tcp. Để redirect cổng 80 đến cổng 3128 này làm như
sau:
# iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
Lưu ý: tùy chọn -j REDIRECT cho có trong chain PREROUTING

9 - SNAT & MASQUERADE

 
Để tạo kết nối `transparent` giữa mạng LAN 192.168.0.1 với Internet lập cấu hình cho
tường lửa Iptables như sau:
# echo 1 > /proc/sys/net/ipv4/ip_forward cho phép forward các packet qua máy chủ đặt
Iptables
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 210.40.2.71 đổi IP nguồn
cho các packet ra card mạng eth0 là 210.40.2.71. Khi nhận được packet vào từ Internet, Iptables
sẽ tự động đổi IP đích 210.40.2.71 thành IP đích tương ứng của máy tính trong mạng LAN
192.168.0/24.
Hoặc có thể dùng MASQUERADE thay cho SNAT như sau:
# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE 
(MASQUERADE thường được dùng khi kết nối đến Internet là pp0 và dùng địa chỉ IP
động)
10 – DNAT.

Giả sử đặt các máy chủ Proxy, Mail và DNS trong mạng DMZ. Để tạo kết nối trong suốt
từ Internet vào các máy chủ này làm như sau:
# echo 1 > /proc/sys/net/ipv4/ip_forward
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.2
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j DNAT --to-destination 192.168.1.3
# iptables -t nat -A PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination
192.168.1.4

Phần II MINH HOẠ CẤU HÌNH IPTABLES CHO


WEB SERVER
Phần này sẽ trình bày qua ví dụ cụ thể và chỉ hướng dẫn các lọc packet vào.
Giả sử có máy chủ phục vụ Web kết nối mạng trực tiếp vào Internet qua card mạng eth0,
địa chỉ IP là 1.2.3.4. cần lập cấu hình tường lửa cho Iptables đáp ứng các yêu cầu sau:
-Cổng TCP 80 (chạy apache) mở cho mọi người truy cập web
- Cổng 21 (chạy proftpd) chỉ mở cho webmaster (dùng để upload file lên public_html)
- Cổng 22 (chạy openssh) chỉ mở cho admin (cung cấp shell `root` cho admin để nâng cấp
& patch lỗi cho server khi cần)
- Cổng UDP 53 (chạy tinydns) để phục vụ tên miền (đây chỉ là ví dụ)

Bước 1: Thiết lập các tham số cho nhân


echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 10 > /proc/sys/net/ipv4/tcp_fin_timeout
echo 1800 > /proc/sys/net/ipv4/tcp_keepalive_time
….
tcp_syncookies=1 bật chức năng chống DoS SYN qua syncookie của Linux
tcp_fin_timeout=10 đặt thời gian timeout cho quá trình đóng kết nối TCP là 10 giây
tcp_keepalive_time=1800 đặt thời gian giữ kết nối TCP là 1800 giây

Bước 2: Nạp các môđun cần thiết cho Iptables


Để sử dụng Iptables, cần phải nạp trước các môđun cần thiết. Ví dụ nếu muốn dùng chức
năng LOG trong Iptables, phải nạp môđun ipt_LOG vào trước bằng lệnh # modprobe ipt_LOG.
MODULES="ip_tables iptable_filter ipt_LOG ipt_limit ipt_REJECT ipt_state
for i in $MODULES; do
    /sbin/modprobe $MODULES
done

Bước 3: Nguyên tắc đặt luật là "drop trước, accept sau"


Đây là nguyên tắc nên tuân theo. Đầu tiên hãy đóng hết các cổng, sau đó mở dần cách
cổng cần thiết. Cách này tránh cho gặp sai sót trong khi đặt luật cho Iptables.
iptables -P INPUT DROP thả packet trước

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT giữ các kết nối
hiện tại và chấp nhận các kết nối có liên quan

iptables -A INPUT -i lo -s 127.0.0.1 -j ACCEPT chấp nhận các gói vào looback từ IP
127.0.0.1
iptables -A INPUT -i lo -s 1.2.3.4 -j ACCEPT  và 1.2.3.4

BANNED_IP="10.0.0.0/8 192.168.0.0/16 172.16.0.0/12 224.0.0.0/4 240.0.0.0/5"


for i in $BANNED_IP; do
    iptables -A INPUT -i eth0 -s $i -j DROP thả các gói dữ liệu đến từ các IP nằm trong
danh sách cấm BANNER_IP done

Bước 4: Lọc ICMP vào và chặn ngập lụt PING


LOG của Iptables sẽ được ghi vào file /var/log/firewall.log. phải sửa lại cấu hình cho
SYSLOG như sau:
# vi /etc/syslog.conf
kern.=debug /var/log/firewall.log
# /etc/rc.d/init.d/syslogd restart
Đối với các gói ICMP đến, chúng ta sẽ đẩy qua chain CHECK_PINGFLOOD để kiểm tra
xem hiện tại đamg bị ngập lụt PING hay không, sau đó mới cho phép gói vào. Nếu đang bị ngập
lụt PING, môđun LOG sẽ tiến hành ghi nhật kí ở mức giới hạn --limit $LOG_LIMIT và --limit-
burst $LOG_LIMIT_BURST, các gói PING ngập lụt sẽ bị thả hết.
LOG_LEVEL="debug"

LOG_LIMIT=3/m
LOG_LIMIT_BURST=1

PING_LIMIT=500/s
PING_LIMIT_BURST=100

iptables -A CHECK_PINGFLOOD -m limit --limit $PING_LIMIT --limit-burst


$PING_LIMIT_BURST -j RETURN
iptables -A CHECK_PINGFLOOD -m limit --limit $LOG_LIMIT --limit-burst
$LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix
"fp=PINGFLOOD:warning a=DROP "
iptables -A CHECK_PINGFLOOD -j DROP

iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -j CHECK_PINGFLOOD


iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request -j ACCEPT

Bước 5: Reject quét cổng TCP và UDP


Ở đây tạo sẵn chain reject quét cổng, chúng ta sẽ đẩy vào chain INPUT sau. Đối với gói
TCP, chúng ta  reject bằng gói TCP với cờ SYN=1 còn đối với gói UDP, chúng ta sẽ reject
bằng gói ICMP `port-unreachable`
iptables-N REJECT_PORTSCAN
iptables-A REJECT_PORTSCAN -p tcp -m limit --limit $LOG_LIMIT --limit-burst
$LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=PORTSCAN:tcp
a=REJECT "
iptables-A REJECT_PORTSCAN -p udp -m limit --limit $LOG_LIMIT --limit-burst
$LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix
"fp=PORTSCAN:udp a=REJECT "
iptables-A REJECT_PORTSCAN -p tcp -j REJECT --reject-with tcp-reset
iptables-A REJECT_PORTSCAN -p udp -j REJECT --reject-with icmp-port-unreachable

Bước 6: Phát hiện quét cổng bằng Nmap


iptables-N DETECT_NMAP
iptables-A DETECT_NMAP -p tcp --tcp-flags ALL FIN,URG,PSH -m limit --limit
$LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-
prefix "fp=NMAP:XMAS a=DROP "
iptables-A DETECT_NMAP -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -m limit --
limit $LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL
--log-prefix "fp=NMAP:XMAS-PSH a=DROP "
iptables-A DETECT_NMAP -p tcp --tcp-flags ALL ALL -m limit --limit $LOG_LIMIT --
limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix
"fp=NMAP:XMAS-ALL a=DROP "
iptables-A DETECT_NMAP -p tcp --tcp-flags ALL FIN -m limit --limit $LOG_LIMIT --
limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix
"fp=NMAP:FIN a=DROP "
iptables-A DETECT_NMAP -p tcp --tcp-flags SYN,RST SYN,RST -m limit --limit
$LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-
prefix "fp=NMAP:SYN-RST a=DROP "
iptables-A DETECT_NMAP -p tcp --tcp-flags SYN,FIN SYN,FIN -m limit --limit
$LOG_LIMIT --limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-
prefix "fp=NMAP:SYN-FIN a=DROP "
iptables-A DETECT_NMAP -p tcp --tcp-flags ALL NONE -m limit --limit $LOG_LIMIT --
limit-burst $LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix
"fp=NMAP:NULL a=DROP "
iptables-A DETECT_NMAP -j DROP
iptables-A INPUT -i eth0 -p tcp ! --syn -m state --state NEW -j DETECT_NMAP
Đối với các gói TCP đến eth0 mở kết nối nhưng không đặt SYN=1 chúng ta sẽ chuyển
sang chain DETECT_NMAP. Đây là những gói không hợp lệ và hầu như là quét cổng bằng
nmap hoặc kênh ngầm. Chain DETECT_NMAP sẽ phát hiện ra hầu hết các kiểu quét của Nmap
và tiến hành ghi nhật kí ở mức --limit $LOG_LIMIT và --limit-burst $LOG_LIMIT_BURST. Ví
dụ để kiểm tra quét XMAS, dùng tùy chọn --tcp-flags ALL FIN,URG,PSH nghĩa là 3 cờ FIN,
URG và PSH được bật, các cờ khác đều bị tắt. Các gói qua chain DETECT_NMAP sau đó sẽ bị
DROP hết.

Bước 7: Chặn ngập lụt SYN


Gói mở TCP với cờ SYN được set 1 là hợp lệ nhưng không ngoại trừ khả năng là các gói
SYN dùng để ngập lụt. Vì vậy, ở dây đẩy các gói SYN còn lại qua chain CHECK_SYNFLOOD
để kiểm tra ngập lụt SYN như sau:
iptables-N CHECK_SYNFLOOD
iptables-A CHECK_SYNFLOOD -m limit --limit $SYN_LIMIT --limit-burst
$SYN_LIMIT_BURST -j RETURN
iptables-A CHECK_SYNFLOOD -m limit --limit $LOG_LIMIT --limit-burst
$LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix
"fp=SYNFLOOD:warning a=DROP "
iptables-A CHECK_SYNFLOOD -j DROP
iptables-A INPUT -i eth0 -p tcp --syn -j CHECK_SYNFLOOD

Bước 8: Giới hạn truy cập SSH cho admin


SSH_IP="1.1.1.1"
iptables -N SSH_ACCEPT
iptables -A SSH_ACCEPT -m state --state NEW -j LOG --log-level $LOG_LEVEL --log-
prefix "fp=SSH:admin a=ACCEPT "
iptables -A SSH_ACCEPT -j ACCEPT
iptables -N SSH_DENIED
iptables -A SSH_DENIED -m limit --limit $LOG_LIMIT --limit-burst
$LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=SSH:attempt
a=REJECT "
iptables -A SSH_DENIED -p tcp -j REJECT --reject-with tcp-reset
for i in $SSH_IP; do
iptables -A INPUT -i eth0 -p tcp -s $i --dport 22 -j SSH_ACCEPT
done
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW -j SSH_DENIED

Bước 9: Giới hạn FTP cho web-master


FTP_IP="2.2.2.2"
iptables -N FTP_ACCEPT
iptables -A FTP_ACCEPT -m state --state NEW -j LOG --log-level $LOG_LEVEL --log-
prefix "fp=FTP:webmaster a=ACCEPT "
iptables -A FTP_ACCEPT -j ACCEPT
iptables -N FTP_DENIED
iptables -A FTP_DENIED -m limit --limit $LOG_LIMIT --limit-burst
$LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix "fp=FTP:attempt
a=REJECT "
iptables -A FTP_DENIED -p tcp -j REJECT --reject-with tcp-reset
for i in $FTP_IP; do
iptables -A INPUT -i eth0 -p tcp -s $i --dport 21 -j FTP_ACCEPT
done
iptables -A INPUT -i eth0 -p tcp --dport 21 -m state --state NEW -j FTP_DENIED

Bước 10: Lọc TCP vào


iptables -N TCP_INCOMING
iptables -A TCP_INCOMING -p tcp --dport 80 -j ACCEPT
iptables -A TCP_INCOMING -p tcp -j REJECT_PORTSCAN
iptables -A INPUT -i eth0 -p tcp -j TCP_INCOMING

Bước 11: Lọc UDP vào và chặn ngập lụt UDP


iptables -N CHECK_UDPFLOOD
iptables -A CHECK_UDPFLOOD -m limit --limit $UDP_LIMIT --limit-burst
$UDP_LIMIT_BURST -j RETURN
iptables -A CHECK_UDPFLOOD -m limit --limit $LOG_LIMIT --limit-burst
$LOG_LIMIT_BURST -j LOG --log-level $LOG_LEVEL --log-prefix
"fp=UDPFLOOD:warning a=DROP "
iptables -A CHECK_UDPFLOOD -j DROP
iptables -A INPUT -i eth0 -p udp -j CHECK_UDPFLOOD

iptables -N UDP_INCOMING
iptables -A UDP_INCOMING -p udp --dport 53 -j ACCEPT
iptables -A UDP_INCOMING -p udp -j REJECT_PORTSCAN
iptables -A INPUT -i eth0 -p udp -j UDP_INCOMING
Để hạn chế khả năng bị DoS và tăng cường tốc độ cho máy chủ phục vụ web, có thể dùng
cách tải cân bằng (load-balacing) như sau:
Cách 1: chạy nhiều máy chủ phục vụ web trên các địa chỉ IP Internet khác nhau. Ví dụ,
ngoài máy chủ phục vụ web hiện tại 1.2.3.4, có thể đầu tư thêm các máy chủ phục vụ web
mới 1.2.3.2, 1.2.3.3, 1.2.3.4, 1.2.3.5. Điểm yếu của cách này là tốn nhiều địa chỉ IP Internet.
Cách 2: đặt các máy chủ phục vụ web trong một mạng DMZ. Cách này tiết kiệm được
nhiều địa chỉ IP nhưng bù lại gateway Iptables 1.2.3.4 - 192.168.0.254 có thể load nặng
hơn trước và yêu cầu đầu tư tiền cho đường truyền mạng từ gateway ra Internet.
dùng DNAT trên gateway 1.2.3.4 để chuyển tiếp các gói dữ liệu từ client đến một trong các máy
chủ phục vụ web trong mạng DMZ hoặc mạng LAN như sau:
# iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination
192.168.0.1-192.168.0.4

Tài liệu tham khảo:


1 – Linux iptables How to
http://www.linuxguruz.com/iptables-howto.html
2 – Iptables Tutorial
http://www.iptables-toturial.frozentux.net/iptables.html
3 – Iptables Tutorial 1.1.19-firewall
http://www.faqs.org/doc/iptables/

You might also like