8. Xây dựng hệ Linux Firewall
8.3. Cấu hình FW cho mô hình thử nghiệm
Máy chủ tường lửa (Xây dựng với Iptables)
Về mặt vật lý, máy chủ tường lửa được trang bị 02 card mạng, và giả sử
eth1: có địa chỉ 203.162.12.125 (địa chỉ Internet); đảm nhận liên lạc với Internet
eth0: có địa chỉ 192.168.0.5 (địa chỉ IP mạng nội bộ); đảm nhận liên lạc với mạng nội bộ Khi cần định tuyến ra Internet, máy chủ tường lửa sử dụng địa chỉ 203.162.12.126 (eth0 tại router) làm ‘gateway’ Bộ luật đặt lọc #!/bin/sh modprobe ip_tables modprobe ip_conntrack modprobe ip_conntrack_ftp
INET_GW="203.162.12.126" INET_SRV_NAT="203.162.12.124" INET_SRV_IP="192.168.0.4" FW_PUBLIC_IF="eth1" FW_PUBLIC_IP="203.162.12.125" FW_PUBLIC_IP_NET="203.162.12.120/29" FW_PUBLIC_IP_BROADCAST_1="203.162.12.120" FW_PUBLIC_IP_BROADCAST_2="203.162.12.127" FW_PRIVATE_IF="eth0" FW_PRIVATE_IP="192.168.0.5" FW_PRIVATE_IP_NET="192.168.0.0/24" FW_PRIVATE_IP_BROADCAST_1="192.168.0.255" LOOPBACK_IF="lo" LOOPBACK_IP="127.0.0.1" LOOPBACK="127.0.0.0/8" BROADCAST="255.255.255.255" CLASS_A="10.0.0.0/8" CLASS_B="172.16.0.0/12" CLASS_C="192.168.0.0/16" CLASS_D_MUTICAST="224.0.0.0/4" CLASS_E_RESERVED_NET="240.0.0.0/5" P_PORTS="0:1023" UP_PORTS="1024:65535"
# Cấm các tác vụ mạng trong thời gian ngắn khởi tạo tường lửa echo "0" > /proc/sys/net/ipv4/ip_forward
route del -net 0.0.0.0 netmask 0.0.0.0 route del -host $INET_SRV_IP_NAT # cấm phản hồi với thông tin broadcast
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # cấm ‘icmp redirect’
echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects # cấm ‘routed packets’
echo "1" > /proc/sys/net/ipv4/conf/all/accept_source_route # lưu vào nhật ký các gói giả mạo địa chỉ
echo "0" > /proc/sys/net/ipv4/conf/all/log_martians # Xoá mọi luật hiện có
iptables -F iptables -X iptables -Z iptables -t nat -Z iptables -t nat -F # chính sách mặc định: cấm tất iptables -P INPUT DROP
iptables -P FORWARD DROP
# NAT - network address translating; ánh xạ địa chỉ
iptables -t nat -A POSTROUTING -j SNAT -s $INET_SRV_IP --to-source $INET_SRV_IP_NAT iptables -t nat -A PREROUTING -j DNAT -d $INET_SRV_IP_NAT --to-dest $INET_SRV_IP iptables -t nat -A OUTPUT -j DNAT -d $INET_SRV_IP_NAT --to-dest $INET_SRV_IP # bảo vệ kiểu tấn công bằng các gói thông tin gây lụt, tắc nghẽn - synflood iptables -N syn-flood
iptables -A syn-flood -m limit --limit 1/s --limit-burst 10 -j RETURN iptables -A syn-flood -j DROP
# Luật bảo vệ giao tiếp eth1 # chống giả mạo địa chỉ iptables -N public_snoof
iptables -A public_snoof -i $FW_PUBLIC_IF -s $FW_PUBLIC_IP -j DROP iptables -A public_snoof -i $FW_PUBLIC_IF -s $CLASS_A -j DROP iptables -A public_snoof -i $FW_PUBLIC_IF -s $CLASS_B -j DROP iptables -A public_snoof -i $FW_PUBLIC_IF -s $CLASS_C -j DROP
iptables -A public_snoof -i $FW_PUBLIC_IF -s $CLASS_D_MUTICAST -j DROP iptables -A public_snoof -i $FW_PUBLIC_IF -s $CLASS_E_RESERVED_NET -j DROP iptables -A public_snoof -i $FW_PUBLIC_IF -d $FW_PUBLIC_IP_BROADCAST_1 -j DROP iptables -A public_snoof -i $FW_PUBLIC_IF -d $FW_PUBLIC_IP_BROADCAST_2 -j DROP iptables -A public_snoof -i $FW_PUBLIC_IF -d $BROADCAST -j DROP
iptables -A public_snoof -i $FW_PUBLIC_IF -d $LOOPBACK -j DROP
# các dịch vụ được phép truy nhập từ ngoài vào chính máy chủ tường lửa. Giả sử tại đây chỉ có dịch # vụ DNS
iptables -N public_services
iptables -A public_services -i $FW_PUBLIC_IF -p tcp --dport 113 -j REJECT --reject-with tcp-reset iptables -A public_services -i $FW_PUBLIC_IF -m state --state ESTABLISHED,RELATED -j ACCEPT # DNS
iptables -A public_services -i $FW_PUBLIC_IF -p udp -d $FW_PUBLIC_IP --dport 53 -j ACCEPT # Thông tin dạng icmp đến từ bên ngoài
iptables -N public_icmp
iptables -A public_icmp -i $FW_PUBLIC_IF -p icmp --icmp-type 0 -j ACCEPT iptables -A public_icmp -i $FW_PUBLIC_IF -p icmp --icmp-type 3 -j ACCEPT iptables -A public_icmp -i $FW_PUBLIC_IF -p icmp --icmp-type 12 -j ACCEPT iptables -A public_icmp -i $FW_PUBLIC_IF -p icmp --icmp-type 14 -j ACCEPT iptables -A public_icmp -i $FW_PUBLIC_IF -p icmp --icmp-type 16 -j ACCEPT iptables -A public_icmp -i $FW_PUBLIC_IF -p icmp --icmp-type 18 -j ACCEPT
iptables -A public_icmp -i $FW_PUBLIC_IF -s $FW_PUBLIC_IP_NET -p icmp --icmp-type 8 -j ACCEPT # luật bảo vệ giao tiếp eth0
# chống giả mạo địa chỉ iptables -N private_snoof
iptables -A private_snoof -i $FW_PRIVATE_IF -s $FW_PRIVATE_IP -j DROP iptables -A private_snoof -i $FW_PRIVATE_IF -s $CLASS_A -j DROP
iptables -A private_snoof -i $FW_PRIVATE_IF -s $CLASS_B -j DROP
iptables -A private_snoof -i $FW_PRIVATE_IF -s $CLASS_D_MUTICAST -j DROP iptables -A private_snoof -i $FW_PRIVATE_IF -s $CLASS_E_RESERVED_NET -j DROP iptables -A private_snoof -i $FW_PRIVATE_IF -d $BROADCAST -j DROP
# Các dịch vụ được phép truy nhập từ máy nội bộ: chỉ là DNS iptables -N private_services
# quản trị
iptables -A private_services -i $FW_PRIVATE_IF -s $LOCAL_ADMIN_IP_1 -j ACCEPT iptables -A private_services -i $FW_PRIVATE_IF -s $LOCAL_ADMIN_IP_2 -j ACCEPT iptables -A private_services -i $LOOPBACK_IF -s $FW_PUBLIC_IP -j ACCEPT
iptables -A private_services -i $LOOPBACK_IF -s $FW_PRIVATE_IP -j ACCEPT iptables -A private_services -i $LOOPBACK_IF -s $LOOPBACK_IP -j ACCEPT
iptables -A private_services -i $LOOPBACK_IF -p tcp --dport 113 -j REJECT --reject-with tcp-reset iptables -A private_services -i $FW_PRIVATE_IF -p tcp --dport 113 -j REJECT --reject-with tcp-reset iptables -A private_services -i $LOOPBACK_IF -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A private_services -i $FW_PRIVATE_IF -m state --state ESTABLISHED,RELATED -j ACCEPT # DNS
iptables -A private_services -i $FW_PRIVATE_IF -p udp -d $FW_PRIVATE_IP --dport 53 -j ACCEPT # icmp -> đối với các máy trên mạng nội bộ
iptables -N private_icmp
iptables -A private_icmp -i $FW_PRIVATE_IF -p icmp --icmp-type 0 -j ACCEPT iptables -A private_icmp -i $FW_PRIVATE_IF -p icmp --icmp-type 3 -j ACCEPT iptables -A private_icmp -i $FW_PRIVATE_IF -p icmp --icmp-type 8 -j ACCEPT iptables -A private_icmp -i $FW_PRIVATE_IF -p icmp --icmp-type 12 -j ACCEPT iptables -A private_icmp -i $FW_PRIVATE_IF -p icmp --icmp-type 14 -j ACCEPT iptables -A private_icmp -i $FW_PRIVATE_IF -p icmp --icmp-type 16 -j ACCEPT iptables -A private_icmp -i $FW_PRIVATE_IF -p icmp --icmp-type 18 -j ACCEPT
# Chuyển tiếp - truy nhập từ bên ngoài, qua bức tường lửa tới máy chủ INET_SRV, và chỉ tới # được các dịch vụ: WEB, FTP, eMail
iptables -N forward_services
iptables -A forward_services -i $FW_PUBLIC_IF -p tcp --dport 113 -j REJECT --reject-with tcp-reset iptables -A forward_services -i $FW_PRIVATE_IF -p tcp --dport 113 -j REJECT --reject-with tcp-reset iptables -A forward_services -i $FW_PUBLIC_IF -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A forward_services -i $FW_PRIVATE_IF -m state --state ESTABLISHED,RELATED -j ACCEPT # WWW
iptables -A forward_services -i $FW_PUBLIC_IF -p tcp -d $INET_SRV_IP --dport 80 -j ACCEPT # FTP
iptables -A forward_services -i $FW_PUBLIC_IF -p udp -d $INET_SRV_IP --dport 21 -j ACCEPT # Chuyển tiếp - từ trong ra Internet: cho phép tất
iptables -A forward_services -i $FW_PRIVATE_IF -j ACCEPT # INPUT chain
iptables -A INPUT -i $FW_PUBLIC_IF -p tcp --syn -j syn-flood
iptables -A INPUT -i $FW_PUBLIC_IF -p tcp ! --syn -m state --state NEW -j DROP iptables -A INPUT -i $LOOPBACK_IF -p tcp --syn -j syn-flood
iptables -A INPUT -i $LOOPBACK_IF -p tcp ! --syn -m state --state NEW -j DROP iptables -A INPUT -i $FW_PRIVATE_IF -p tcp --syn -j syn-flood
iptables -A INPUT -i $FW_PUBLIC_IF -j public_snoof iptables -A INPUT -i $LOOPBACK_IF -j private_snoof iptables -A INPUT -i $FW_PRIVATE_IF -j private_snoof iptables -A INPUT -i $FW_PUBLIC_IF -p icmp -j public_icmp iptables -A INPUT -i $FW_PUBLIC_IF -j public_services iptables -A INPUT -i $LOOPBACK_IF -p icmp -j private_icmp iptables -A INPUT -i $LOOPBACK_IF -j private_services iptables -A INPUT -i $FW_PRIVATE_IF -p icmp -j private_icmp iptables -A INPUT -i $FW_PRIVATE_IF -j private_services # FORWARD chain
iptables -A FORWARD -i $FW_PUBLIC_IF -p tcp --syn -j syn-flood
iptables -A FORWARD -i $FW_PUBLIC_IF -p tcp ! --syn -m state --state NEW -j DROP iptables -A FORWARD -i $FW_PRIVATE_IF -p tcp --syn -j syn-flood
iptables -A FORWARD -i $FW_PRIVATE_IF -p tcp ! --syn -m state --state NEW -j DROP iptables -A FORWARD -i $FW_PUBLIC_IF -j public_snoof
iptables -A FORWARD -i $FW_PRIVATE_IF -j private_snoof iptables -A FORWARD -i $FW_PUBLIC_IF -p icmp -j public_icmp iptables -A FORWARD -j forward_services
# OUTPUT chain
iptables -A OUTPUT -j ACCEPT # Routing
route add -net 0.0.0.0 netmask 0.0.0.0 gw $INET_GW metric 1
route add -net $LINUX_TEAM_NET netmask $LINUX_TEAM_NETMASK gw $LOCAL_GW metric 1 route add -host $INET_SRV_IP_NAT gw $FW_PRIVATE_IP metric 1
echo "1" > /proc/sys/net/ipv4/ip_forward exit 0
Với các máy chủ nội bộ khác sử dụng Linux – chúng ta cũng có thể áp dụng kỹ thuật vừa trình bày với iptables, và cần chú ý tới các điểm sau:
Một máy chủ nội bộ thông thường sẽ chỉ có 01 netcard (eth0)
Với máy chủ có 01 netcard chúng ta KHÔNG cần phải thiết lập các luật ‘chuyển tiếp’ (không cần tới FORWARD chain)
Với một máy chủ khác, khi thiết lập các luật đặt lọc chiều thông tin vào (INPUT chain), cũng cần xác định ra dịch vụ cụ thể sẽ cho phép (LDAP, POP3, ..)
Ghi chú:
INPUT: Chiều thông tin vào, có đích là chính một máy chủ tường lửa.
OUTPUT: Chiều thông tin ra, xuất phát từ chính máy chủ tường lửa.
FORWARD: Chuyển tiếp thông tin: máy nội bộ - (eth0) máy chủ tường lửa (eth1) - thế giới bên ngoài, hoặc theo chiều ngược lại; thế giới bên ngoài - (eth1) máy chủ tường lửa (eth0) - máy nội bộ.