Bảng filter có ba chain mặc định, vĩnh viễn tồn tại là INPUT, OUTPUT, và FORWARD. Iptables cho phép ta xây dựng chain cho chính ta. Những chain này được xem như là target. Thay vì gói tin sẽ được nhận hay ngăn chặn, vòng điều khiển sẽ được chuyển đến chain tự tạo để thực hiện những kiểm tra chuyên biệt hơn liên quan đến luật đã kiểm tra và nhảy vào chain tự tạo. Nếu trong chain tự tạo không có luật match với gói tin và thực thi thì sau khi đã duyệt hết chain tự tạo, điều khiển sẽ trở về với chain gọi và tiếp tục kiểm tra luật đứng sau luật vừa dẫn đến chain tự tạo. Từ chain tự tạo có thể nhảy đến một chain tự tạo khác nếu có luật match.
Chain tự tạo rất hữu dụng trong việc tối ưu tập luật và vì thế rất hay được sử dụng. Chúng giúp ta tổ chức luật theo từng mục thay vì duyệt thẳng từ trên xuống dưới. Sau khi kiểm tra được vài đặc tính mấu chốt gói tin sẽ chuyển vào nhánh khác.
Trang 70
Hình 2.7 Duyệt luật chain tự tạo dựa trên địa chỉ đích của gói tin Một ví dụ khác, sử dụng chain tự tạo để nhảy đến chain tự tạo khác để kiểm tra càng chuyên biệt hơn.
Hình 2.8 Duyệt chain tự tạo dựa vào giao thức
2.10.Một số cấu hình với mạng Perimeter Network
Trong trường match máy Firewall có hai card mạng gói tin cần được xử lý một cách đặc biệt hơn. Những gói tin trung chuyển sẽ duyệt qua luật của chain FORWARD thay vì duyệt qua chain INPUT và OUTPUT. Lưu lượng mạng đối với máy cục bộ Firewall và lưu lượng mạng liên quan đến mạng bên trong sẽ được duyệt qua hai tập luật hoàn toàn khác nhau. Những luật trong chain FORWARD phải chỉ ra cả interface nguồn và interface đích.
Để cho phép truy cập không giới hạn từ bên trong ra bên ngoài qua hai interface đơn gian chỉ cần cho phép mọi giao thức và mọi cổng. Chú ý rằng, máy trạm bên trong có thể bắt đầu gửi yêu cầu kết nối ra bên ngoài nhưng ngược lại thì không cho phép.
$IPT -A FORWARD -i $LAN_INTERFACE -o $EXTERNAL_INTERFACE \ -p tcp -s $LAN_ADDRESSES --sport $UNPRIVPORTS \
-m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i $EXTERNAL_INTERFACE_1 -o $LAN_INTERFACE \ -m state --state ESTABLISHED,RELATED -j ACCEPT
Trang 71
Giả sử, một số dịch vụ được chạy trên máy Firewall và máy trạm trong mạng cần truy cập vào những dịch vụ đó. Để cho phép điều đó chain INPUT và OUTPUT cần phải được cấu hình luật.
2.11.Ánh xạ địa chỉ
Sử dụng ánh xạ địa chỉ có nhiều ưu điểm. Một trong những ưu điểm đó là giảm thiểu sự thiếu hụt địa chỉ IP. Như vậy một mạng con địa chỉ private có thể dùng chung một địa chỉ public. Ví dụ sau đây cho phép một mạng con sử dụng chung một địa chỉ public mà địa chỉ này sẽ được cấp động. Để thực hiện ánh xạ địa chỉ cho các trạm của mạng bên trong khi qua interface ppp0 của Firewall.
Tuy nhiên, ta chỉ mới ánh xạ địa chỉ, cần phải thêm luật để cho phép kết nối đi qua Firewall. Ví dụ sau cho phép sử dụng dịch phân giải tên miền và dịch vụ web cơ bản.
Một ứng dụng tiêu biểu của DNAT là cho phép trung chuyển trạm đích. Chẳng hạn, ta có một số máy chủ được đặt trong mạng DMZ. Thông thường những dịch vụ mạng public không cài đặt trên máy Firewall. Để tạo kết nối trong suốt từ Internet vào các máy chủ trong mạng ta làm như sau.
$IPT -A FORWARD -i -ppp0 -o <LAN interface> \ -m state --state ESTABLISHED,RELATED -j ACCEPT $IPT -A FORWARD -o ppp0 \
-m state --state RELATED,ESTABLISHED -j ACCEPT
$IPT -A FORWARD -o ppp0 -p udp \
--sport 1024:65535 -d <name server> --dport 53 \ -m state --state NEW -j ACCEPT
$IPT -A FORWARD -o ppp0 -p tcp \
-s <local host> --sport 1024:65535 --dport 80 \ -m state --state NEW -j ACCEPT
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE $IPT -A INPUT -i $LAN_INTERFACE \
-p tcp -s $LAN_ADDRESSES --sport $UNPRIVPORTS -d $GATEWAY \ -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
$IPT -A OUTPUT -o $LAN_INTERFACE \
Trang 72
Để cho phép lưu lượng trên ta phải thêm luật vào chain FORWARD. Ta biết rằng DNAT sẽ áp dụng vào gói tin trước khi nó đến được chain FORWARD. Vì thế việc lọc gói tin phải dựa trên địa chỉ của máy chủ trong DMZ chứ không phải là địa chỉ bên ngoài của máy Firewall.
Gói tin trả về sự tự động được NAT trả lại địa chỉ. Giả sử yêu cầu kết nối được chấp nhận để cho phép gói tin trả về cần phải thêm luật cho phép từ máy Firewall ra Internet.
Iptables cho phép ta đổi hướng cổng một cách dễ dàng. Giả sử ta có proxy SQUID đang lắng nghe trên cổng 3128. Để chuyển hướng cổng 80 đến cổng 3128 trên máy Firewall ta làm như sau.
Tương tự như trên, ta cũng phải thêm vào các chain một số luật để cho phép kết nối.
$IPT -t nat -A PREROUTING -i <lan interface> -p tcp \ -s <lan hosts> --sport 1024:65535 --dport 80 \ -j REDIRECT --to-port 3128
$IPT -A FORWARD -i <DMZ interface> -o <public interface> \ -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A FORWARD -i <public interface> -o <DMZ interface> -p tcp --sport 1024:65535 -d <local web server> --dport 80 \
-m state --state NEW -j ACCEPT
$IPT -t nat -A PREROUTING -i <public interface> -p tcp \ --sport 1024:65535 -d <public address> --dport 80 \ -j DNAT --to-destination <local web server>
Trang 73
Chƣơng 3
PROXY SQUID
3.1. Biên dịch và cài đặt chƣơng trình
3.1.1. Configure script
Giống như bao gói phần mềm Unix khác, Squid sử dụng ./configure để biết về hệ điều hành mà nó sẽ cài đặt. Khi chạy script này nó yêu cầu hệ thống đưa cho nó thông tin về một số thư viên, hàm, loại dữ liệu, ... và sẽ không thực thi được nếu như thiếu những thư viện yêu cầu của nó.
Script ./configure có nhiều lựa chọn. Chẳng hạn ta có thể thay đổi thư mục cài đặt với tùy chọn --prefix. Script ./configure có rất nhiều tùy chọn khác nhằm tối ưu Squid được sử dụng cho mục đích nào và hỗ trợ những module nào.
Để thực thi file script ta gõ lệnh sau.
3.1.2. Make Install
Sau khi thực thi lệnh trên với không lỗi nào xảy ra ta thực hiện tiếp lệnh
make để biên dịch file nguồn. Công việc cuối cùng của quá trình cài đặt là dùng lệnh make install để cài đặt chương trình vào thư mục được chỉ định.
3.1.3. Cài đặt Squid từ một Repository
Ta có thể cài đặt chương trình Squid một cách dể dàng và nhanh chóng trong Ubuntu Linux bằng cách thực thi lênh sau.
Với cách cài đặt này ta chấp nhận sử dụng mặc định các cấu hình của Squid. Chương trình sẽ tự động cấu hình và thực thi tạo đĩa cache trên máy.
# sudo apt-get install squid3
Trang 74
Đây là cách làm phổ biến bởi những nhà phát hành hệ điều hành Ubuntu đã cấu hình chương trình sao cho nó hoạt động tốt nhất.
3.2. Những lƣu ý khi trƣớc khi khởi động
3.2.1. Những tham số tùy chọn khi khởi động Squid
Trước khi thực thi Squid, ta nên biết về một số tùy chọn của nó. Nhiều trong số tùy chọn này có thể sẽ không bao giờ được sử dụng và một số lại rất hữu dùng khi để kiểm lỗi.
-a port chỉ ra một giá trị http_port khác khi thực thi và giá trị này sẽ được ưu tiên hơn trong tập tin cấu hình squid.conf. Ta có thể cấu hình nhiều cổng trong squid.conf và –a sẽ chỉ ghi đè cổng đầu tiên.
-d level chỉ cấp độ gửi thông điệp lỗi.
-f file yêu cầu dùng tập tin squid.conf dự phòng thay cho tập tin squid.conf mặc định.
-k function thực thi những thao tác quản trị. Tham số function có thể là một trong số sau: reconfigure, rotate, shutdown, interrupt, kill, debug, check, parse. Mỗi hàm thực hiện một thao tác khác nhau và rất hữu dụng. Reconfigure yêu cầu Squid đọc lại file squid.conf. Rotate yêu cầu Squid quay file log của nó, tức là đóng file, nếu có thể thì đổi tên file và cuối cùng là mở lại file đó hoặc tạo file mới với trùng tên khi file log kia đã được đổi tên. Shutdown sẽ kết thúc chương trình. Interrupt cũng sẽ kết thúc chương trình ngay lập tức mà không đợi những giao tác đang thực thi kết thúc. Kill để dùng để ngắt chương trình Squid nếu Squid đang bị lỗi và không thể tắt được. Đây là biện pháp cuối cùng. Debug sẽ đưa chương trình Squid vào trạng thái bẫy lỗi. Check chỉ đơn giản làm nhiệm vụ kiểm tra tiến trình Squid đang chạy. Parse sẽ kiểm tra lỗi cú pháp trong squid.conf.
-u port chỉ cổng ICP sẽ sử dụng.
Trang 75
-z dùng để khởi tạo cache. Ta phải sử dụng tùy chọn này khi lần đầu tiên chạy Squid hoặc khi ta thêm một thư mục cache mới.
-D buộc Squid không kiểm tra DNS. Thường Squid sẽ không thực thi chừng nào nó kiểm tra được DNS server đang hoạt động.
-N ngăn Squid trở thành một tiến trình ẩn.
3.2.2. Khởi tạo cache
Trước khi khởi tạo cache ta cần phải kiểm tra xem file cấu hình squid.conf đã đúng cú pháp hay còn có lỗi nào nữa không bằng hàm parse.
Nếu ta không thấy thông báo lỗi nào chứng tỏ file cấu hình đã match lệ. Ngược lại Squid sẽ chỉ ra mỗi ở dòng nào và những yếu tố gây nên lỗi. Cần phải khắc phục hết lỗi cú pháp trong file squid.conf thì mới tiếp tục. Khi khởi động Squid lần đầu tiên ta hoặc bất kể khi nào ta thêm một cache_dir vào file cấu hình squid.conf, ta cần phải tạo thư mục cache.
3.3. Chạy thử chƣơng trình
Một khi ta đã thành công khởi tạo được thư mục cache, ta nên chạy thử Squid trên màn hình dòng lệnh để kiểm lỗi. Sử dụng –N để Squid thực thi không trở thành một tiến trình ẩn và –d1 để hiển thị những thông tin cần xem.
Ta sẽ thấy dạng như sau.
# squid3 –N –d1 # squid3 -z
Trang 76
Một khi ta thấy được thông báo Ready to serve requests điều đó có nghĩa là Squid đã thực thi thành công và đang sẳng sàng lắng nghe yêu cầu từ người dùng. Ta có thể kiểm tra bằng lệnh sau.
Nếu như ta thấy được những nội dung HTML của trang web hiển thị lên màn hình dòng lệnh, ta đã thành công. Khi đó, ta có thể ngắt chương trình bằng Ctrl+C và cho phép Squid thực thi dưới dạng tiến trình ẩn.
Nếu chương trình được cài đặt từ Repository thông qua lệnh apt-get thì ta có thể thực hiện thao tác khởi động, dừng, hoặc khởi động lại thông qua script.
Script trên cũng là cách cho Squid tự khởi động mỗi khi khởi động máy. Ta hoàn toàn có thể dùng script trên để dừng Squid hoặc an toàn hơn ta có thể sử dụng hàm –k shutdown.
Nếu có thay đổi nội dung cấu hình trong squid.conf ta có thể khởi động lại bằng script trên hoặc chỉ với hàm –k reconfigure. Khi thực hiện hàm này, Squid sẽ đọc lại những cấu hình trong file squid.conf. Nếu như file cấu hình không có vấn đề gì thì Squid sẽ quay lại phục vụ với cấu hình mới.
3.4. Access Control trong Squid
# sudo /etc/init.d/squid3 start|stop|restart # squidclient http://www.squid-cache.org/ zfirewall@ubuntu:~$ sudo squid3 -N -d1
2009/10/31 09:44:11| Starting Squid Cache version 3.0.STABLE8 for i486-pc-linux-gnu...
2009/10/31 09:44:11| Process ID 4229
2009/10/31 09:44:11| With 1024 file descriptors available 2009/10/31 09:44:11| Performing DNS Tests...
2009/10/31 09:44:11| Successful DNS name lookup tests... <...>
2009/10/31 09:44:12| Set Current Directory to /var/spool/squid3 2009/10/31 09:44:12| Loaded Icons.
2009/10/31 09:44:12| Accepting HTTP connections at 0.0.0.0, port 3128, FD 17.
2009/10/31 09:44:12| Accepting ICP messages at 0.0.0.0, port 3130, FD 18.
2009/10/31 09:44:12| HTCP Disabled.
Trang 77
3.4.1. Access Control Element cơ sở
ACL (access control list) Element là những khối điều khiển truy cập trong Squid. Đó là cách ta chỉ ra những mẫu dải địa chỉ IP, địa chỉ cổng, hay chuỗi URL. Mỗi ACL Element có một tên và ta sẽ sử dụng tên đó để viết luật truy cập. Cú pháp cơ bản của một ACL Element như sau.
Trong hầu hết các trường match ta thường liệt kê nhiều giá trị trên cùng một ACL Element. Tuy nhiên ta có thể có nhiều dòng acl với cùng một tên. Ví dụ, hai ACL Element sau là tương đương.
Squid có xấp xỉ 25 loại ACL khác nhau, và một vài trong số đó có cùng loại cơ sở. Chẳng hạn, cả src và dst đều sử dụng địa chỉ IP là kiểu cơ sở. Squid có một số kiểu cơ sở sau đây:
3.4.1.1. Địa chỉ IP
Được sử dụng bởi các ACL Element src, dst, myip.
Squid có cho phép ta chỉ ra giới hạn địa chỉ IP rất rõ ràng. Ta có thể chỉ ra dải địa chỉ là một mạng con, đoạn địa chỉ, và tên miền. Ta có thể sử dụng nhiều cách để chỉ ra đoạn địa chỉ mà ta muốn. Chẳng hạn, những acl sau là tương đương.
Khi ta ghi ra mặc nạ mạng, Squid sẽ kiểm tra xem mặt nạ mạng đó có match hay không. Giả sử ta có một acl là acl mylocal 127.0.0.1/8. Squid sẽ báo lỗi vì mặc nạ mạng /8 (255.0.0.0) có giá trị 0 ở 3 octet còn lại,
acl zhost src 172.16.44.21/255.255.255.255
acl zhost src 172.16.44.21/32
acl zhost src 172.16.44.21 acl Http_ports port 80 8000 8080
acl Http_ports port 80 acl Http_ports port 8000 acl Http_ports port 8080
Trang 78
trong khi đó 127.0.0.1 lại có giá trị 1 ở octet cuối cùng. Để sửa lại cho chính xác ta nên viết là acl mylocal 127.0.0.1/32 hoặc 127.0.0.0/8.
Ta có thể liệt kê liên tiếp một số mạng con bằng cách viết acl mynetwork src 172.16.10.0-172.16.19.0/24. Acl này sẽ tương đương với nhiều mạng con 172.16.x.0/24.
Squid lưu trữ các ACL địa chỉ IP trong bộ nhớ trong một cấu trúc dữ liệu được gọi là cây splay. Cấu trúc cây này có những đặc tính mạnh mẽ. Nó có thể tự động điều chỉnh khi thực hiện quá trình dò tìm. Khi một phần tử được trùng khớp trong danh sách, phần tử đó trở thành gốc mới của cây. Với cách này những phần tử thường xuyên được trùng hớp sẽ càng về gần với gốc của cây, và như thế sẽ giảm thiểu thời gian cho những lần kiểm tra sau.
Mọi mạng con trong cùng một ACL không được trùng nhau. Squid sẽ cảnh báo nếu ta viết một ACL như sau.
3.4.1.2. Tên miền
Được sử dụng bởi ACL Element srcdomain, dstdomain, và chỉ thị
cache_host_domain.
Một tên miền đơn gian là một tên DNS hoặc một khu vực (zone). Ví dụ ta có những tên miền match lệ sau.
Những ACL về tên miền có thể hơi khác biệt trong việc match với tên miền và những miền con trong đó. Khi một ACL tên miền bắt đầu với một dấu chấm, Squid sẽ xem đó là một wildcard, và sẽ match với tất cả mọi tên con trong miền đó và kể cả tên miền đó. Ngược lại, ACL tên miền đó không bắt đầu bằng dấu chấm, squid sẽ sử dụng đúng cú pháp so sánh
www.squid-cache.org squid-cache.org org
acl Foo src 1.2.3.0/24 acl Foo src 1.2.3.4/32
Trang 79
chuỗi. Hostname phải trùng khớp với chuỗi thì mới được xem là match. Ta