Cấu hình Iptables trên LinuxIptables là một firewall được tích hợp sẵn trong các phiên bản Ubuntu Ubuntu, Kubuntu, Xubuntu.. IPtables firewall Lệnh cơ bản Dùng lệnh # iptab
Trang 1Cấu hình Iptables trên Linux
Iptables là một firewall được tích hợp sẵn trong các phiên bản Ubuntu (Ubuntu, Kubuntu, Xubuntu) Khi bạn install Ubuntu, iptables đã có sẵn, nhưng nó mặc định cho phép tất cả các trafic Ubuntu 8.04 được trang bị ufw – chương trình quản lý Iptables firewall
IPtables firewall
Lệnh cơ bản
Dùng lệnh
# iptables -L
Liệt kê các luật hiện có trong iptables Nếu bạn chỉ vừa khởi động server, bạn sẽ không có luật nào, và sẽ thấy như sau :
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Các tùy chọn cơ bản của IPtable
Sau đây là một số giải thích cho các tùy chọn của iptables Đừng lo lắng về việc hiểu tất cả chúng, nhưng nhớ rằng trong quá trình hoạt động hãy quay lại và nhìn nó để tự nhắc nhở bản thân
· -A – Thêm luật này vào luồng Luồng hợp lệ là INPUT, FORWARD và OUTPUT , nhưng chúng ta hầu hết tác động với luồng INPUT – tác động vào traffic vào
· -L – Liệt kê các luật hiện tại
· -m conntrack – Cho phép lọc các luật để phù hợp với trạng thái kết nối Cho phép sử dụng tùy chọn ctstate
· ctstate – Định nghĩa danh sách trạng thái cho các luật để xem xét phù hợp Các trạng thái hợp lệ bao gồm:
o NEW – Kết nối chưa được ghi nhận
o RELATED – Kết nối mới, nhưng có liên hệ với kết nối khác đã được cho phép
o ESTABLISHED – Kết nối đã được thiết lập
Trang 2o INVALID – Traffic không được xác định vì một số lý do
· -m limit – Đòi hỏi luật phải phù hợp trong một số lần xác định Cho phép sử dụng tùy chọn limit Tỏ ra hiệu quả trong chính xác giới hạn số lần logging
o limit – Số lần nhiều nhất phù hợp, được xác định bằng số lần theo giây, phút, giờ hoặc ngày tùy theo người quản trị Nếu tùy chọn này không được sử dụng và -m limit được dùng thì mặc định sẽ là 3 lần một giờ
· -p – Giao thức kết nối được dùng
· dport – Port đích được yêu cầu cho luật này Một port hay 1 dải port có thể được dùng bằng cách start:end: nó sẽ xem xét tất cả các port từ start đến end
· -j – Nhảy đến một mục tiêu xác định Mặc định được cho phép 4 mục tiêu:
o ACCEPT – Cho phép gói packet và dừng việc áp dụng luật luồng này
o REJECT – Từ chối gói packet và thông báo cho người gửi rằng chung ta đã làm thế đồng thời dừng áp dụng luật trên luồng
o DROP – Âm thầm chặn gói packet và dừng áp dụng luật cho luồng
o LOG - Log gói packet và tiếp tục xử lý các luật khác trên luồng Cho phép sử dụng log-prefix và log-level
· log-prefix – Khi logging, đưa text này lên trước thông điệp log Sử dụng gấp đôi trích dẫn xung quanh text sử dụng
· log-level – Log sử dụng log đặc biệt của các mức hệ thống Mức 7 là một lựa chọn tốt trừ khi bạn thật sự cần mức khác
· -i – Chỉ xem xét nếu gói packet tới từ một interface xác định
· -I – Chèn một luật Gồm 2 lựa chọn, luồng cần chèn luật và số hiệu của luật
-I INPUT 5 sẽ chèn luật vào INPUT của luồng và áp dụng luật thứ 5 trong danh sách
· -v – Hiển thị nhiều thông tin ouput hơn Hiệu quả khi bạn có những luật nhìn có vẻ giống nhau nếu không dùng –v để hiển thị
· -s source - địa chỉ[/mask] nguồn
· -d destination – địa chỉ[/mask] đích
· -o out-interface – tên output[+] tên interface mạng
Cho phép thiết lập phiên
Chúng ta có thể cho phép thiết lập phiên để nhận traffic:
# iptables -A INPUT -m conntrack ctstate ESTABLISHED,RELATED -j ACCEPT
Cho phép traffic vào tại một port xác định
Bạn có thể bắt đầu chặn traffic, nhưng bạn phải làm việc thông qua SSH, vì vậy bạn cần cho phép SSH trước khi chặn mọi thứ khác Để cho phép traffic trên cổng mặc định 22 của SSH, bạn cần chỉ cho iptables rằng cho phép tất của traffic TCP trên cổng này đi vào
# iptables -A INPUT -p tcp dport ssh -j ACCEPT
Trang 3Trở lại danh sách ở phần trên, bạn có thể thấy ý nghĩa của các tùy chọn:
* Chèn rute này cho luồng INPUT, nên chúng ta đang tác động vào traffic vào
* Kiểm tra nếu nó sử dụng TCP
* Nếu nó sử dụng TCP, kiểm tra xem nó có đi vào port của SSH ( dport ssh)
* Nếu thõa mãn các điều kiện trên thì chấp nhận (-j ACCEPT)
Hãy thử xem xét luật sau:
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp anywhere anywhere tcp dpt:ssh
Bây giờ hãy cho phép tất cả các traffic vào
# iptables -A INPUT -p tcp dport 80 -j ACCEPT
Kiểm tra rule hiện tại :
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp anywhere anywhere tcp dpt:ssh
ACCEPT tcp anywhere anywhere tcp dpt:www
Chúng ta đã cho phép traffic tcp , ssh và web, nhưng ta chưa chặn gì nên mọi traffic đều có thể đi vào được Chặn traffic
Khi xem xét đẻ chấp nhận một packet, không có luật nào áp dụng lên nó Do đó luật cho phép ssh và web của chúng ta vào đầu tiên, trong khi luật chặn tất cả các traffic sẽ theo sau nó, ta vẫn có thể chấp nhận traffic ta muốn Tất cả những gì cần làm là đưa ra luật để chặn tất cả traffic tại cuối cùng (giống ACL của cisco)
# iptables -A INPUT -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp anywhere anywhere tcp dpt:ssh
ACCEPT tcp anywhere anywhere tcp dpt:www
Trang 4DROP all anywhere anywhere
Bởi vì chúng ta không xác định được interface hay một giao thức nào, nên mọi traffic cho mọi port đều nên chặn, ngoại trừ web và ssh
Chỉnh sửa Iptables
Vấn đề duy nhất với việc tiếp lập của chúng ta là port loopback đã bị chặn Ta có thể khắc phục điều này bằng việc chỉ ra -i eth0, nhưng ta cũng phải thêm luật cho port lookback Nếu ta thêm luật, nó sẽ được đưa vào cuối cùng – sau khi mọi traffic đều bị chặn Ta cần thêm luật này vào trước luật chặn tất cả Trong trường hợp đã có nhiều traffic, ta sẽ thêm nó vào đầu danh sách để nó được xử lý trước
# iptables -I INPUT 1 -i lo -j ACCEPT
# iptables -L
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all anywhere anywhere
ACCEPT all anywhere anywhere state RELATED,ESTABLISHED
ACCEPT tcp anywhere anywhere tcp dpt:ssh
ACCEPT tcp anywhere anywhere tcp dpt:www
DROP all anywhere anywhere
Dòng đầu và cuối nhìn có vẻ giống nhau, nên ta sẽ liệt kê danh sách với ghi chú của nó
# iptables -L -v
Chain INPUT (policy ALLOW 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all lo any anywhere anywhere
0 0 ACCEPT all any any anywhere anywhere state RELATED,ESTABLISHED
0 0 ACCEPT tcp any any anywhere anywhere tcp dpt:ssh
0 0 ACCEPT tcp any any anywhere anywhere tcp dpt:www
0 0 DROP all any any anywhere anywhere
Bạn có thể thấy nhiều thông tin hơn Luật này thật ra rất quan trọng từ khi rất nhiều ứng dụng sử dụng cổng loopback để thực hiện liên lạc với nhau
Ghi lại hoạt động
Trong ví dụ trên, không có traffic nào được ghi lại Nếu bạn muốn ghi lại các packet đã bị loại bỏ vào log của hệ thống, đây sẽ là cách dễ dàng nhất:
# iptables -I INPUT 5 -m limit limit 5/min -j LOG log-prefix "iptables denied: " log-level 7
Saving iptables
Trang 5Nếu bạn reboot lại hệ thống mà chưa save, thì các cấu hình của iptables sẽ biến mất Thay bằng việc phải đánh lại những lệnh này mỗi lần reboot, bạn có thể save chúng lại Để save cấu hình, ta có thể dùng lệnh: iptables-save và iptables-restore
Cấu hình tại startup
Chú ý: Iptables và NetworkManager có sự xung đột lẫn nhau, tuy nhiên, networkManager vẫn đang là bản Beta
Nếu bạn có đủ kiến thức bảo mật để sử dụng một firewall, có lẽ bạn sẽ không muốn tin tưởng vào NetworkManager nữa
Nếu bạn sử dụng NetworkManager, những bước tiếp theo sẽ làm bạn không thể sử dụng nó cho interface mà bạn chỉnh sửa nữa
Save cấu hình firewall vào file
# iptables-save >/etc/iptables.luậts
Sau đó chỉnh sửa file cấu hình tại /etc/network/interfaces để áp dụng luật một cách tự động Bạn sẽ cần phải biết về interface mà bạn đang sử dụng cho luật trước đó – nếu bạn không biết, bạn có thể sử dụng eth0, tuy nhiên bạn nên kiểm tra theo những bước sau để biết xem có card wireless nào:
$ iwconfig
Nếu có kết quả tương tự như sau thì bạn không có card wireless, và hãy sử dụng eth0
$ iwconfig
lo no wireless extensions
eth0 no wireless extensions
Khi bạn tìm thấy interface mình đang sử dụng, hãy mở /etc/network/interfaces
# nano /etc/network/interfaces
Trong file, hãy tìm interface bạn có, và tại dòng cuối cùng của mạng bạn có cho interface đó, hãy thêm
pre-up iptables-restore < /etc/iptables.luậts
Ta cũng có thể thiết lập vô hiệu luật, save chúng vào file /etc/iptables.downluậts và tự động áp dụng bằng lệnh: post-down iptables-restore < /etc/iptables.downluậts