1. Trang chủ
  2. » Tất cả

Hướng dẫn thiết lập tường lửa iptables

15 491 0
Tài liệu đã được kiểm tra trùng lặp

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 15
Dung lượng 96 KB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Nghĩa là nó không chỉ đơn giản cho phép hoặc từ chối packet dựa trên header mà xác định kết nối giữa hai đầu có hợp lệ không, dựa theo các quy tắc cấu hình, trước khi mở session và cho p

Trang 1

Iptables-Firewall Linux

Mọi người thường nghĩ firewall cung cấp an toàn tuyệt đối, nhưng họ sai Trong hầu hết trường hợp cấu hình firewall sai sẽ giảm độ an toàn hơn cả không cài đặt firewall Firewall cũng là một phần mềm và nên được coi như một phần mềm bình thường như mọi phần mềm khác, vì nó cũng

có thể gặp lỗi như thường

Vậy hãy suy nghĩ trước khi cài đặt firewall! Bạn có thật sự cần không? Nếu bạn cần nghĩ mình cần, bạn nên viết ra những quy tắc hoặt động của nó, loại firewall nào, và thao tác với nó như thế nào Nhưng trước hết hãy đọc tài liệu này

Firewall được dùng cho hai mục đích:

Bảo vệ người dùng khỏi worm và những kẻ tấn công

Giữ người dùng (lao động/trẻ em) ở trong phạm vi kiểm soát

Có ba loại firewall:

Packet filtering

Circuit relay

Application gateway

Firewall cần có một máy riêng, không chạy dịch vụ gì cả (hoặc chỉ chạy sshd) và được bảo đảm

an ninh theo cách tài liệu này hướng dẫn

Mọi lưu thông mạng đều được gửi dạng packet Một lượng lớn lưu thông được chia ra thành những phần nhỏ dễ xử lý và được tập hợp lại khi đến đích Packet header của mọi packet chứa thông tin cách đến và nơi đến Và thông tin này chính xác là những thông tin firewall packing filtering dùng Filter dựa trên:

Cho phép hoặc không cho phép packet dựa trên địa chỉ IP nguồn/đích

Cho phép hoặc không cho phép packet dựa trên cổng nguồn/đích

Cho phép hoặc không cho phép packet dựa trên giao thức

Cho phép hoặc không cho phép packet dựa trên cờ hiệu của giao thức xác định

Nói cách khác, firewall này lọc theo thông tin trong header, không phải nội dung packet

Điểm yếu:

Thông tin địa chỉ trong gói có thể bị làm giả IP (hoặc ta nói là spoof) từ phía người gửi

Dữ liệu hoặc request trong gói được phép có thể chứa dữ liệu không mong muốn mà kẻ tấn công

có thể dùng để khai thác các lỗi đã biết của các dịch vụ nằm trên hoặc nằm sau firewall

Thường là nguồn gốc của lỗi

Điểm mạnh:

Cài đặt dễ và đơn giản

Có thể cảnh báo trước các cuột tấn công (vd, phát hiện quét cổng)

Ngăn cản SYN attack

Trang 2

Ví dụ về lọc packet trong Linux:

Iptables

Ipchains

SmoothWall

Bạn nên dùng iptables Ipchains đã lỗi thời

Circuit gateway là loại firewall kiểm tra kết nối trước khi trao đổi dữ liệu Nghĩa là nó không chỉ đơn giản cho phép hoặc từ chối packet dựa trên header mà xác định kết nối giữa hai đầu có hợp

lệ không, dựa theo các quy tắc cấu hình, trước khi mở session và cho phép trao đổi dữ liệu Filter dựa trên:

Địa chỉ IP nguồn/đích

Cổng nguồn/đích

Khoảng thời gian

Giao thức

User

Password

Mọi lưu thông đều được kiểm tra và theo dõi, những lưu thông không mong đợi có thể bị loại bỏ

Điểm yếu:

Hoạt động ở tầng Transport, có thể cần thay đổi đáng kể các chương trình cung cấp tính năng transport bình thường

Application gateway là proxy cho ứng dụng, trao đổi dữ liệu với hệ thống ở xa, đại diện cho client Nó tách biệt khỏi thế giới bên ngoài bằng cách nằm sau DMZ (De-Militarized Zone - Vùng dân sự: phần mạng riêng tư có thể thấy thông qua firewall) hoặc sau một firewall không cho phép kết nối từ bên ngoài Nó dựa trên:

Cho phép hoặc cấm dựa trên địa chỉ IP nguồn/đích

Dựa trên nội dung packet

Giới hạn quyền truy cập tập tin dựa trên loại tập tin hoặc phần mở rộng

Điểm mạnh:

Có thể cache các tập tin, tăng cường hiệu quả

Log chi tiết mọi kết nối

Thích ứng tốt (vài proxy server có thể "chia sẻ" dữ liệu cache)

Không truy cập trực tiếp từ bên ngoài

Thậm chí có thể thay thế ngay tức thì nội dung packet

Điểm yếu:

Cấu hình phức tạp

Gateway ứng dụng được xem là giải pháp an toàn nhất vì nó không cần chạy bằng root và những máy sau lưng nó không thể được truy cập từ Internet

Ví dụ về một số gateway ứng dụng:

Trang 3

Squid

Để dùng iptables, phải bật nó trong kernel Tôi đã cài iptables dạng module (lệnh iptables sẽ nạp module khi cần thiết) và biên dịch lại kernel (nhưng bạn có thể muốn biên dịch iptables nằm sẵn trong kernel, nếu bạn định tắt tính năng Loadable Kernel Modules như đã thảo luận ở trên) Thông tin chi tiết cách cấu hình kernel cho iptables có ở Iptables Tutorial Chapter 5:

Preparations Sau khi bạn biên dịch kernel mới (hoặc trong khi biên dịch kernel), bạn phải thêm lệnh iptables Chỉ cần emerge iptables là nó sẽ chạy

Giờ hãy kiểm tra nó chạy chưa bằng lệnh iptables -L Nếu thất bại, có gì đó không ổn và bạn cần kiểm tra lại cấu hình

Iptables là bộ lọc packet mới và nặng, dành cho Linux 2.4.x Tiền thân của nó là ipchains dành cho kernel 2.2.x Một trong những điểm cải tiến quan trọng là iptables có thể thực hiện stateful packet filtering Với khả năng này, nó có thể theo dấu các kết nối TCP đã hình thành

Kết nối TCP bao gồm một chuỗi các packet chứa thông tin về địa chỉ nguồn, địa chỉ đích, cổng nguồn, cổng đích và một con số (sequence number) để tập hợp packet lại mà không mất dữ liệu TCP là giao thức hướng kết nối (connection-oriented), ngược với UDP là giao thức phi kết nối (connectionless)

Bằng cách theo dõi header của packet TCP, bộ lọc stateful có thể xác định packet TCP nhận được có phải là một phần của kết nối đã tạo hay không và quyết định xem chấp nhận hay hủy bỏ packet đó

Với bộ lọc stateless, có thể đánh lừa bộ lọc chấp nhận packet mà lẽ ra nên hủy bọ bằng cách xử

lý header của packet TCP Có thể thực hiện điều đó bằng cách điều chỉnh SYN flag hoặc các flag khác trong header packet TCP để các packet xấu xuất hiện như một phần của kết nối (vì bộ lọc packet bản thân nó không thể theo dõi các kết nối) Với bộ lọc packet stateful, có thể hủy bỏ những packet như thế vì nó không thuộc về kết nối đã có Nó sẽ giúp chấm dứt khả năng bị

"stealth scan", một loại quét cổng mà trình quét gửi các packet với flag rất ít khả năng bị log lại

từ firewall so với các packet thông thường

Iptables còn cung cấp vài tính năng khác như NAT (Network Address Translation) và rate limit Rate limit đặc biệt hữu dụng khi chống DoS (Denial of Service) như SYN flood

Kết nối TCP được thiết lập bằng cái gọi là bắt tay ba đường Khi lập kết nối TCP, phía client gửi một packet đến server với flag SYN Khi phía server nhận được packet SYN, nó trả lời bằng cách gửi packet SYN+ACK ngược lại Khi phía client nhận được SYN+ACK, nó sẽ gửi trả lời bằng packet ACK để xác nhận thành lập kết nối

SYN flood attack được thực hiện bằng cách gửi packet SYN mà không trả lời packet

SYN+ACK Phía client có thể làm giả packet với một địa chỉ IP nguồn sai vì nó không cần trả lời Phía server sẽ thêm một mục vào hàng đợi các kết nối sắp hình thành khi nó nhận được packet SYN và chờ nhận packet ACK sau cùng trước khi xoá mục khỏi hàng đợi Hạng đợi chỉ

có thể chứa một số lượng giới hạn và nếu bị đầy, nó sẽ không thể mở bất kỳ kết nối nào nữa Nếu

Trang 4

không nhận được gói ACK khi hết hạn, mục đó sẽ tự động bị xoá khỏi hàng đợi Phía client sẽ khởi động tấn công bằng cách làm giả gói SYN với những địa chỉ IP nguồn khác nhau và gửi đến

IP đích càng nhanh càng tốt, do đó sẽ làm đầy hàng đợi bằng những kết nối chưa được mở xong, làm cho các client khác không thể nào tạo kết nối đến server

Đây là chỗ cần đến rate limit Có thể giới hạn tỉ lệ packet SYN chấp nhận bằng cách dùng -m limit limit 1/s Nó sẽ giới hạn số packet SYN chấp nhậ trong một giây và hạn chể SYN flood trong vòng kiểm soát

Một tùy chọn khác để chống SYN flood là SYN cookies, cho phép máy tính trả lời packet SYN

mà không làm đầy hàng đợi kết nối SYN cookie có thể được bật trong cấu hình Linux kernel, nhưng chúng vẫn được coi là đang trong quá trình thử nghiệm ở thời điểm này

Giờ hãy thực tế hơn một chút!

Khi iptables được nạp vào kernel, nó tạo 5 móc nối vào hệ thống để bạn có thể thêm vào các quy tắc của mình Chúng là INPUT, OUTPUT, FORWARD, PREROUTING và POSTROUTING Mỗi cái được gọi là một chain (xích) và chứa một loạt các quy tắt Mỗi quy tắc sẽ xác định, nếu packet header như thế này, thì làm gì với packet đó Nếu quy tắc đầu không áp dụng được, quy tắc kế sẽ được thử

Bạn có thể thêm các quy tắc (rule) vào 5 chain chính hoặc tạo chain riêng và thêm rule vào đó Iptables hỗ trợ các tùy chọn sau

Tùy chọn: Mô tả:

-A Nối thêm

-D Xoá

-I Chèn

-R Thay thế

-L Liệt kê

-F Xoá mọi rule trong một chain hoặc trong mọi chain

-Z Đặt counter về không cho một chain hoặc mọi chain

-C Kiểm tra packet này trên chain

-N Tạo chain riêng

-X Xoá chain tự tạo

-P Thay đổi chính sách của chain

-E Đổi tên chain

-p Giao thức

-s Địa chỉ/mặt nạ nguồn

-d Địa chỉ/mặt nạ đích

-i Tên input (tên Ethernet)

-o Tên Output (tên Ethernet)

-j Nhảy (đích của quy tắc)

-m So khớp mở rộng (có thể dùng phần mở rộng)

-n Địa chỉ và cổng output dạng số

-t Bảng cần xử lý

-v Chế độ Verbose

Trang 5

-x Số mở rộng (hiển thị chính xác giá trị)

-f Chỉ so khớp gói thứ hai hoặc sau đó

-V Phiên bản Packet

line-numbers In số dòng khi liệt kê

Trước hết chúng ta cần thử phong toả các packet ICMP đến máy của ta, để làm quen với iptables

# iptables -A INPUT -p icmp -j DROP

Trước hết ta xác định chain cần thêm quy tắc vào, sau đó xác định giao thức cần kiểm tra, và cuối cùng là đích đến Đích đến có thể là tên một chain tự tạo hoặc một trong những đích đặc biệt ACCEPT, DROP, REJECT, LOG, QUEUE, hoặc MASQUERADE Trong trường hợp này chúng ta dùng DROP, sẽ hủy bỏ packet mà không thông báo cho client

Đích LOG là một dạng đích "không kết thúc" Nếu packet được áp dụng với quy tắc dùng đích LOG, thay vì chấm dứt áp dụng quy tắc, packet sẽ vẫn được tiếp tục kiểm tra với các quy tắc khác Nhờ vậy bạn có thể log packet trong khi vẫn xử lý chúng như thường lệ

Giờ thử ping localhost Bạn sẽ không nhận được trả lời, vì iptables đã hủy bỏ mọi packet ICMP đến máy này Bạn cũng sẽ không thể ping đến máy khác, vì gói ICMP trả lời cũng bị hủy bỏ Giờ xoá sạch chain để cho phép dùng ICMP

# iptables -F

Hãy xem tính năng lọc stateful của iptables Nếu bạn cần bật kiểm tra stateful các packet đến trên eth0, bạn cần dùng lệnh:

# iptables -A INPUT -i eth0 -m state state ESTABLISHED,RELATED -j ACCEPT

Nó sẽ chấp nhận bất kỳ packet nào từ một kết nối được tạo lập hoặc có liên quan trong chain INPUT Và bạn có thể hủy bỏ bất kỳ gói nào không nằm trong tầm quản lý bằng lệnh iptables -A INPUT -i eth0 -m state state INVALID -j DROP ngay trước lệnh trên Nó sẽ bật cơ chế lọc stateful trong iptables bằng cách dùng phần mở rộng "state" Nếu bạn cần cho phép những máy khác kết nối đến máy bạn, bạn có thể dùng cờ state NEW iptables có một số module dùng cho các mục đích khác nhau Một trong số chúng là:

Module/So khớp Mô tả Tùy chọn mở rộng

mac Phần mở rộng so khớp cho các packet vào dựa trên địa chỉ mac mac-source

state Bật kiểm tra stateful state (state bao gồm ESTABLISHED,RELATED, INVALID, NEW) limit Giới hạn so khớp theo tỉ lệ limit, limit-burst

owner Thử so khớp các đặc điểm khác nhau của trình tạo gói uid-owner userid gid-owner groupid pid-owner processid sid-owner sessionid

unclean Một loạt các kiểm tra toàn vẹn ngẫu nhiên trên các packet

Hãy thử tạo một chain riêng và áp dụng vào một trong những chain đã có:

Trang 6

# iptables -X mychain

# iptables -N mychain

# iptables -A mychain -i eth0 -m state state ESTABLISHED,RELATED -j ACCEPT

# iptables -P OUTPUT ACCEPT

# iptables -P INPUT DROP

# iptables -A INPUT -j mychain

Bằng cách áp dụng quy tắc này vào chain INPUT, chúng ta có được chính sách sau: Mọi gói đi

ra đều được phép và mọi gói đi vào đều bị hủy

Bạn có thể tìm đọc thêm tài liệu Netfilter/iptables

Giờ hãy xem một ví dụ hoàn chỉnh Đây là trược hợp mà chính sách firewall/gateway là:

Kết nối đến firewall chỉ được phép thông qua SSH (cổng 22)

Mạng nội bộ được phép truy cập HTTP, HTTPS và SSH (DNS cũng được phép)

Lưu thông ICMP có thể chứa dữ liệu và không bị cấm Dĩ nhiên chúng ta phải cho phép một vài lưu thông ICMP

Quét cổng được dò tìm và bị log

Tránh những cuộc tấn công SYN

Mọi lưu thông khác bị hủy bỏ và log lại

#!/sbin/runscript

IPTABLES=/sbin/iptables

IPTABLESSAVE=/sbin/iptables-save

IPTABLESRESTORE=/sbin/iptables-restore

FIREWALL=/etc/firewall.rules

DNS1=212.242.40.3

DNS2=212.242.40.51

#inside

IIP=10.0.0.2

IINTERFACE=eth0

LOCAL_NETWORK=10.0.0.0/24

#outside

OIP=217.157.156.144

OINTERFACE=eth1

opts="${opts} showstatus panic save restore showoptions rules"

depend() {

need net

}

rules() {

Trang 7

ebegin "Setting internal rules"

einfo "Setting default rule to drop"

$IPTABLES -P FORWARD DROP

$IPTABLES -P INPUT DROP

$IPTABLES -P OUTPUT DROP

#default rule

einfo "Creating states chain"

$IPTABLES -N allowed-connection

$IPTABLES -F allowed-connection

$IPTABLES -A allowed-connection -m state state ESTABLISHED,RELATED -j ACCEPT

$IPTABLES -A allowed-connection -i $IINTERFACE -m limit -j LOG log-prefix \

"Bad packet from ${IINTERFACE}:"

$IPTABLES -A allowed-connection -j DROP

#ICMP traffic

einfo "Creating icmp chain"

$IPTABLES -N icmp_allowed

$IPTABLES -F icmp_allowed

$IPTABLES -A icmp_allowed -m state state NEW -p icmp icmp-type \

time-exceeded -j ACCEPT

$IPTABLES -A icmp_allowed -m state state NEW -p icmp icmp-type \

destination-unreachable -j ACCEPT

$IPTABLES -A icmp_allowed -p icmp -j LOG log-prefix "Bad ICMP traffic:"

$IPTABLES -A icmp_allowed -p icmp -j DROP

#Incoming traffic

einfo "Creating incoming ssh traffic chain"

$IPTABLES -N allow-ssh-traffic-in

$IPTABLES -F allow-ssh-traffic-in

#Flood protection

$IPTABLES -A allow-ssh-traffic-in -m limit limit 1/second -p tcp tcp-flags \

ALL RST dport ssh -j ACCEPT

$IPTABLES -A allow-ssh-traffic-in -m limit limit 1/second -p tcp tcp-flags \

ALL FIN dport ssh -j ACCEPT

$IPTABLES -A allow-ssh-traffic-in -m limit limit 1/second -p tcp tcp-flags \

ALL SYN dport ssh -j ACCEPT

$IPTABLES -A allow-ssh-traffic-in -m state state RELATED,ESTABLISHED -p tcp dport ssh -j ACCEPT

#outgoing traffic

einfo "Creating outgoing ssh traffic chain"

$IPTABLES -N allow-ssh-traffic-out

$IPTABLES -F allow-ssh-traffic-out

Trang 8

$IPTABLES -A allow-ssh-traffic-out -p tcp dport ssh -j ACCEPT

einfo "Creating outgoing dns traffic chain"

$IPTABLES -N allow-dns-traffic-out

$IPTABLES -F allow-dns-traffic-out

$IPTABLES -A allow-dns-traffic-out -p udp -d $DNS1 dport domain \

-j ACCEPT

$IPTABLES -A allow-dns-traffic-out -p udp -d $DNS2 dport domain \

-j ACCEPT

einfo "Creating outgoing http/https traffic chain"

$IPTABLES -N allow-www-traffic-out

$IPTABLES -F allow-www-traffic-out

$IPTABLES -A allow-www-traffic-out -p tcp dport www -j ACCEPT

$IPTABLES -A allow-www-traffic-out -p tcp dport https -j ACCEPT

#Catch portscanners

einfo "Creating portscan detection chain"

$IPTABLES -N check-flags

$IPTABLES -F check-flags

$IPTABLES -A check-flags -p tcp tcp-flags ALL FIN,URG,PSH -m limit \

limit 5/minute -j LOG log-level alert log-prefix "NMAP-XMAS:"

$IPTABLES -A check-flags -p tcp tcp-flags ALL FIN,URG,PSH -j DROP

$IPTABLES -A check-flags -p tcp tcp-flags ALL ALL -m limit limit \

5/minute -j LOG log-level 1 log-prefix "XMAS:"

$IPTABLES -A check-flags -p tcp tcp-flags ALL ALL -j DROP

$IPTABLES -A check-flags -p tcp tcp-flags ALL SYN,RST,ACK,FIN,URG \

-m limit limit 5/minute -j LOG log-level 1 log-prefix "XMAS-PSH:"

$IPTABLES -A check-flags -p tcp tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

$IPTABLES -A check-flags -p tcp tcp-flags ALL NONE -m limit \

limit 5/minute -j LOG log-level 1 log-prefix "NULL_SCAN:"

$IPTABLES -A check-flags -p tcp tcp-flags ALL NONE -j DROP

$IPTABLES -A check-flags -p tcp tcp-flags SYN,RST SYN,RST -m limit \

limit 5/minute -j LOG log-level 5 log-prefix "SYN/RST:"

$IPTABLES -A check-flags -p tcp tcp-flags SYN,RST SYN,RST -j DROP

$IPTABLES -A check-flags -p tcp tcp-flags SYN,FIN SYN,FIN -m limit \

limit 5/minute -j LOG log-level 5 log-prefix "SYN/FIN:"

$IPTABLES -A check-flags -p tcp tcp-flags SYN,FIN SYN,FIN -j DROP

# Apply and add invalid states to the chains

einfo "Applying chains to INPUT"

$IPTABLES -A INPUT -m state state INVALID -j DROP

$IPTABLES -A INPUT -j icmp_allowed

$IPTABLES -A INPUT -j check-flags

$IPTABLES -A INPUT -i lo -j ACCEPT

$IPTABLES -A INPUT -j allow-ssh-traffic-in

Trang 9

$IPTABLES -A INPUT -j allowed-connection

einfo "Applying chains to FORWARD"

$IPTABLES -A FORWARD -m state state INVALID -j DROP

$IPTABLES -A FORWARD -j icmp_allowed

$IPTABLES -A FORWARD -j check-flags

$IPTABLES -A FORWARD -o lo -j ACCEPT

$IPTABLES -A FORWARD -j allow-ssh-traffic-in

$IPTABLES -A FORWARD -j allow-www-traffic-out

$IPTABLES -A FORWARD -j allowed-connection

einfo "Applying chains to OUTPUT"

$IPTABLES -A OUTPUT -m state state INVALID -j DROP

$IPTABLES -A OUTPUT -j icmp_allowed

$IPTABLES -A OUTPUT -j check-flags

$IPTABLES -A OUTPUT -o lo -j ACCEPT

$IPTABLES -A OUTPUT -j allow-ssh-traffic-out

$IPTABLES -A OUTPUT -j allow-dns-traffic-out

$IPTABLES -A OUTPUT -j allow-www-traffic-out

$IPTABLES -A OUTPUT -j allowed-connection

#Allow client to route through via NAT (Network Address Translation)

$IPTABLES -t nat -A POSTROUTING -o $IINTERFACE -j MASQUERADE eend $?

}

start() {

ebegin "Starting firewall"

if [ -e "${FIREWALL}" ]; then

restore

else

einfo "${FIREWALL} does not exists Using default rules."

rules

fi

eend $?

}

stop() {

ebegin "Stopping firewall"

$IPTABLES -F

$IPTABLES -t nat -F

$IPTABLES -X

$IPTABLES -P FORWARD ACCEPT

$IPTABLES -P INPUT ACCEPT

$IPTABLES -P OUTPUT ACCEPT

eend $?

Trang 10

showstatus() {

ebegin "Status"

$IPTABLES -L -n -v line-numbers

einfo "NAT status"

$IPTABLES -L -n -v line-numbers -t nat

eend $?

}

panic() {

ebegin "Setting panic rules"

$IPTABLES -F

$IPTABLES -X

$IPTABLES -t nat -F

$IPTABLES -P FORWARD DROP

$IPTABLES -P INPUT DROP

$IPTABLES -P OUTPUT DROP

$IPTABLES -A INPUT -i lo -j ACCEPT

$IPTABLES -A OUTPUT -o lo -j ACCEPT

eend $?

}

save() {

ebegin "Saving Firewall rules"

$IPTABLESSAVE > $FIREWALL

eend $?

}

restore() {

ebegin "Restoring Firewall rules"

$IPTABLESRESTORE < $FIREWALL

eend $?

}

restart() {

svc_stop; svc_start

}

showoptions() {

echo "Usage: $0 {start|save|restore|panic|stop|restart|showstatus} " echo "start) will restore setting if exists else force rules"

echo "stop) delete all rules and set all to accept"

echo "rules) force settings of new rules"

echo "save) will store settings in ${FIREWALL}"

echo "restore) will restore settings from ${FIREWALL}"

Ngày đăng: 14/12/2021, 17:58

TỪ KHÓA LIÊN QUAN

w