Hệ thống firewall trên linux kernel 2.4 & Netfilter Iptables
- Thứ năm - 25/09/2008 00:50
- |In ra
- |Đóng cửa sổ này
Nâng câÌp tưÌ€ kernel 2.2, kernel 2.4 đưa ra râÌt nhiêÌ€u tiÌnh năng mơÌi giuÌp Linux hoaÌ£t đôÌ£ng tin câÌ£y hơn vaÌ€ hỗ trơÌ£ cho nhiêÌ€u thiêÌt biÌ£. MôÌ£t trong những tiÌnh năng mơÌi của noÌ đoÌ laÌ€ hỗ trơÌ£ Netfilter Iptables ngay trong kernel, giuÌp thao taÌc trên packet hiêÌ£u quả hơn so vơÌi caÌc đaÌ€n anh trươÌc đoÌ như Ipfwadm trong kernel 2.0 vaÌ€ Ipchains trong kernel 2.2, tuy vẫn hỗ trơÌ£ cho caÌc bôÌ£ lêÌ£nh cũ. ThiêÌt lâÌ£p firewall theo kiểu loÌ£c packet (packet filtering “ loÌ£c goÌi thông tin) vơÌi Ipfwadm hoăÌ£c Ipchains coÌ nhiêÌ€u haÌ£n chêÌ: thiêÌu caÌc tiÌch hơÌ£p câÌ€n thiêÌt để mở rôÌ£ng tiÌnh năng, khi sử duÌ£ng loÌ£c packet cho caÌc giao thưÌc thông thươÌ€ng vaÌ€ chuyển đổi điÌ£a chỉ maÌ£ng (Network Address Translation - NAT) thiÌ€ thưÌ£c hiêÌ£n hoaÌ€n toaÌ€n taÌch biêÌ£t maÌ€ không coÌ đươÌ£c tiÌnh kêÌt hơÌ£p. Netfilter vaÌ€ Iptables trên kernel 2.4 giải quyêÌt tôÌt caÌc haÌ£n chêÌ trên, uyển chuyển hơn vaÌ€ coÌ thêm nhiêÌ€u tiÌnh năng khaÌc maÌ€ Ipfwadm vaÌ€ Ipchains không coÌ.
Nguyên TăÌc LaÌ€m ViêÌ£c Của Netfilter VaÌ€ Iptables
Netfilter laÌ€ thaÌ€nh phâÌ€n cơ bản API (Application Program Interface) cho pheÌp giao diêÌ£n ở caÌc lơÌp trên như Iptables coÌ thể duÌ€ng noÌ để thao taÌc trên caÌc maÌ£ng goÌi. HiêÌ£n nay Netfilter đưa ra bôÌn module cho caÌc lơÌp trên sử duÌ£ng đoÌ laÌ€ Ipfwadm+ipchains, Iptables, Connection tracking vaÌ€ Nat. Trong Iptables điÌ£nh nghĩa sẵn caÌc bảng sau:
1. Filter: DuÌ€ng để thao taÌc trên caÌc packet
2. Nat: Sử duÌ£ng để thưÌ£c hiêÌ£n NAT, viÌ duÌ£ như duÌ€ng để che caÌc điÌ£a chỉ xuâÌt phaÌt tưÌ€ trong maÌ£ng LAN khi chuÌng đi ra ngoaÌ€i internet maÌ€ ngaÌ€y nay hâÌ€u hêÌt caÌc maÌ£ng đêÌ€u sử duÌ£ng.
3. Mangle: ThươÌ€ng duÌ€ng để đaÌnh dâÌu caÌc packet duÌ€ng cho những muÌ£c điÌch như QoS hoăÌ£c chuyển hươÌng packet.
Stateless Packet Filtering
DaÌ£ng bôÌ£ loÌ£c không biêÌt đươÌ£c quan hêÌ£ của những packet vaÌ€o vơÌi packet đi trươÌc noÌ hoăÌ£c đi sau noÌ, goÌ£i laÌ€ cơ chêÌ loÌ£c không phân biêÌ£t đươÌ£c traÌ£ng thaÌi của caÌc packet hoăÌ£c nôm na laÌ€ loÌ£c thuÌ£ đôÌ£ng (stateless packet filtering), trong kernel 2.0 hoăÌ£c 2.2 thiÌ€ Ipfwadm hoăÌ£c Ipchains chỉ thưÌ£c hiêÌ£n đươÌ£c đêÌn mưÌc đôÌ£ naÌ€y. VơÌi caÌc firewall không phân biêÌ£t đươÌ£c quan hêÌ£ của caÌc packet vơÌi nhau, chuÌng ta goÌ£i laÌ€ firewall chăÌ£n thuÌ£ đôÌ£ng (stateless firewalling). LoaÌ£i firewall naÌ€y khoÌ coÌ thể bảo vêÌ£ đươÌ£c maÌ£ng bên trong trươÌc caÌc kiểu tâÌn công phaÌ hoaÌ£i như DoS, SYN flooding, SYN cookie, ping of death, packet fragmentation... hay caÌc hacker chỉ câÌ€n duÌ€ng công cuÌ£ doÌ€ maÌ£ng như nmap chẳng haÌ£n laÌ€ coÌ thể biêÌt đươÌ£c caÌc traÌ£ng thaÌi của caÌc hosts năÌ€m sau firewall. ĐiêÌ€u naÌ€y không xảy ra vơÌi firewall tiÌch cưÌ£c (stateful firewall).
Stateful Packet Filtering
VơÌi moÌ£i packet đi vaÌ€o maÌ€ bôÌ£ loÌ£c coÌ thể biêÌt đươÌ£c quan hêÌ£ của chuÌng như thêÌ naÌ€o đôÌi vơÌi packet đi trươÌc hoăÌ£c đi sau noÌ, viÌ duÌ£ như caÌc traÌ£ng thaÌi băÌt tay ba lâÌ€n trươÌc khi thưÌ£c hiêÌ£n môÌ£t kêÌt nôÌi trong giao thưÌc TCP/IP (SYN, SYN/ACK, ACK), goÌ£i laÌ€ firewall coÌ thể phân biêÌ£t đươÌ£c traÌ£ng thaÌi của caÌc packet hay nôm na laÌ€ firewall tiÌch cưÌ£c (stateful firewalling). VơÌi loaÌ£i firewall naÌ€y, chuÌng ta coÌ thể xây dưÌ£ng caÌc quy tăÌc loÌ£c để coÌ thể ngăn chăÌ£n đươÌ£c ngay cả caÌc kiểu tâÌn công phaÌ hoaÌ£i như SYN flooding hay Xmas tree... Hơn thêÌ nữa Iptables coÌ€n hỗ trơÌ£ khả năng giơÌi haÌ£n tôÌc đôÌ£ kêÌt nôÌi đôÌi vơÌi caÌc kiểu kêÌt nôÌi khaÌc nhau tưÌ€ bên ngoaÌ€i, cưÌ£c kyÌ€ hữu hiêÌ£u để ngăn chăÌ£n caÌc kiểu tâÌn công tưÌ€ chôÌi phuÌ£c vuÌ£ (DoS) maÌ€ hiêÌ£n nay vẫn laÌ€ môÌi đe doaÌ£ haÌ€ng đâÌ€u đôÌi voÌi caÌc website trên thêÌ giơÌi. MôÌ£t đăÌ£c điểm nổi bâÌ£t nữa của Iptables laÌ€ noÌ hỗ trơÌ£ chưÌc năng doÌ€ tiÌ€m chuỗi tương ưÌng (string pattern matching), chưÌc năng cho pheÌp phaÌt triển firewall lên môÌ£t mưÌc cao hơn, coÌ thể đưa ra quyêÌt điÌ£nh loaÌ£i bỏ hay châÌp nhâÌ£n packet dưÌ£a trên viêÌ£c giaÌm saÌt nôÌ£i dung của noÌ. ChưÌc năng naÌ€y coÌ thể đươÌ£c xem như laÌ€ can thiêÌ£p đươÌ£c đêÌn mưÌc ưÌng duÌ£ng như HTTP, TELNET, FTP... măÌ£c duÌ€ thưÌ£c sưÌ£ Netfilter Iptables vẫn chỉ hoaÌ£t đôÌ£ng ở mưÌc maÌ£ng (lơÌp 3 theo mô hiÌ€nh OSI 7 lơÌp).
ThưÌ£c HiêÌ£n
Chi tiêÌt vêÌ€ mô tả caÌc bảng vaÌ€ caÌc tham sôÌ trong iptables caÌc baÌ£n coÌ thể tham khảo taÌ£i điÌ£a chỉ http://www.unixcircle.com/iptables/i...-tutorial.html. Sau đây tôi sẽ triÌ€nh baÌ€y caÌch thưÌ£c hiêÌ£n cuÌ£ thể trên hêÌ£ điêÌ€u haÌ€nh RedHat Linux 7.1 để minh hoaÌ£.
RedHat 7.1 đươÌ£c đoÌng goÌi vơÌi kernel 2.4.2 vaÌ€ đã đươÌ£c biên diÌ£ch để hỗ trơÌ£ cho Netfilter vaÌ€ Iptables, tuy nhiên muôÌn sử duÌ£ng đâÌ€y đủ caÌc tiÌnh năng của Iptables noÌi trên thiÌ€ câÌ€n phải nâng câÌp Iptables lên phiên bản mơÌi nhâÌt 1.2.4 (http://netfilter.samba.org/iptables-1.2.4.tar.bz2) vaÌ€ biên diÌ£ch laÌ£i nhân Linux vơÌi phiên bản 2.4.16 (http://www.kernel.org/pub/linux/kern...-2.4.16.tar.gz, hiêÌ£n đã coÌ phiên bản 2.4.17).
Khi sử duÌ£ng Linux RedHat 7.1 laÌ€m chưÌc năng firewall, chuÌng ta nên caÌ€i đăÌ£t chêÌ đôÌ£ server vơÌi chêÌ đôÌ£ văn bản vaÌ€ loaÌ£i bỏ tâÌt cả caÌc chưÌc năng (daemon) không câÌ€n thiêÌt như sendmail, ftpd, httpd, telnetd, sshd, lpd v.v... chỉ nên login ngay taÌ£i maÌy để thao taÌc. LoaÌ£i bỏ phiên bản cũ của iptables trên maÌy nêÌu noÌ đã đươÌ£c đưa vaÌ€o trong quaÌ triÌ€nh caÌ€i đăÌ£t băÌ€ng lêÌ£nh rpm “e iptables.
Giải neÌn kernel 2.4.16 vaÌ€o thư muÌ£c /usr/src, chuÌng ta đươÌ£c source của kernel trong /usr/src/linux.
ViÌ duÌ£: tar zxvf linux-2.4.16.tar.gz
Giải neÌn iptables-1.2.4 vaÌ€o thư muÌ£c /usr/local/src chuÌng ta đươÌ£c /usr/local/src/iptables-1.2.4
Trong thư muÌ£c iptables-1.2.4, chuÌng ta thưÌ£c hiêÌ£n caÌc bươÌc sau để găÌn caÌc chưÌc năng của iptables-1.2.4 vaÌ€o kernel.
make pending-patches KERNEL_DIR=/usr/src/linux
Sau khi găÌn xong vaÌ€o kernel, chuÌng ta tiêÌp tuÌ£c thêm vaÌ€o những chưÌc năng mơÌi nhâÌt vưÌ€a đươÌ£c phaÌt triển để đưa vaÌ€o kernel, sử duÌ£ng lêÌ£nh sau:
make patch-o-matic KERNEL_DIR=/usr/src/linux
Khi thưÌ£c hiêÌ£n caÌc lêÌ£nh để găÌn vaÌ€o kernel như trên, chuÌng ta nên chuÌ yÌ đêÌn doÌ€ng traÌ£ng thaÌi mô tả chưÌc năng của goÌi thêm vaÌ€o, nêÌu haÌ€ng traÌ£ng thaÌi chỉ ra laÌ€ goÌi naÌ€y tôÌt (working) hay ổn điÌ£nh (stable) hoăÌ£c đang chuẩn biÌ£ đưa vaÌ€o hoaÌ£t đôÌ£ng (experimental) thiÌ€ coÌ thể đưa ngay vaÌ€o trong kernel, coÌ€n caÌc traÌ£ng thaÌi khaÌc thiÌ€ xem như laÌ€ vẫn coÌ€n đang thử nghiêÌ£m, baÌ£n cũng coÌ thể duÌ€ng những tiÌnh năng naÌ€y nêÌu thiÌch.
ChuÌ yÌ để coÌ thể sử duÌ£ng đươÌ£c chưÌc năng string pattern matching baÌ£n phải nhơÌ thêm vaÌ€o chưÌc năng CONFIG_IP_NF_MATCH_STRING trong khi thưÌ£c hiêÌ£n patch-o-matic. Qua kiểm nghiêÌ£m nêÌu caÌc goÌi trong patch-o-matic hoaÌ£t đôÌ£ng tôÌt thiÌ€ chuÌng sẽ đươÌ£c đưa thẳng vaÌ€o trong kernel ở caÌc phiên bản kêÌ tiêÌp.
TiêÌp tuÌ£c tiêÌn haÌ€nh biên diÌ£ch iptables, vẫn ở trong /usr/local/src/iptables-1.2.4
make KERNEL_DIR=/usr/src/linux
make install KERNEL_DIR=/usr/src/linux
LuÌc naÌ€y iptables đã đươÌ£c caÌ€i đăÌ£t trong /usr/local/sbin vaÌ€ /usr/local/lib
TiêÌn haÌ€nh biên diÌ£ch kernel 2.4.16:
Sau khi caÌc goÌi câÌ€n thiêÌt của Netfilter đã đươÌ£c đưa vaÌ€o kernel xong, chuÌng ta băÌt đâÌ€u biên diÌ£ch laÌ£i kernel vaÌ€ caÌc module của noÌ.
Chuyển vaÌ€o thư muÌ£c /usr/src/linux vaÌ€ đaÌnh lêÌ£nh: make menuconfig
Trên giao diêÌ£n câÌu hiÌ€nh naÌ€y, để tôÌi ưu kernel chuÌng ta chỉ nên đưa vaÌ€o những thiêÌt biÌ£ naÌ€o câÌ€n thiêÌt cho hêÌ£ điêÌ€u haÌ€nh vaÌ€ nên choÌ£n chưÌc năng laÌ€m router. MuÌ£c điÌch chiÌnh của chuÌng ta laÌ€ sử duÌ£ng Netfilter/Iptables nên trong phâÌ€n Network Options -> Netfilter Configuration chuÌng ta nên choÌ£n tâÌt cả caÌc chưÌc năng trong đoÌ. Sau khi choÌ£n xong thoaÌt ra khỏi menu vaÌ€ duÌ€ng caÌc lêÌ£nh sau để biên diÌ£ch:
make dep; make clean; make bzImage; make modules; make modules_install
QuaÌ triÌ€nh biên diÌ£ch nhanh hay châÌ£m tuyÌ€ thuôÌ£c vaÌ€o câÌu hiÌ€nh maÌy, sau khi quaÌ triÌ€nh biên diÌ£ch kêÌt thuÌc baÌ£n câÌ€n phải laÌ€m thêm môÌ£t sôÌ thủ tuÌ£c sau đây để hêÌ£ điêÌ€u haÌ€nh coÌ thể chaÌ£y đươÌ£c kernel mơÌi vưÌ€a biên diÌ£ch
Chuyển tâÌ£p tin /usr/src/linux/arch/i386/boot/bzImage vaÌ€o thư muÌ£c /boot.
ViÌ duÌ£: mv /usr/src/linux/arch/i386/boot/bzImage /boot/bzImage.fw
Chuyển tâÌ£p tin /usr/src/linux/System.map vaÌ€o thư muÌ£c /boot.
ViÌ duÌ£: mv /usr/src/linux/System.map /boot/System.map.fw
TaÌ£o liên kêÌt mơÌi : ln “fs /boot/System.map.fw /boot/System.map
Để đêÌ€ phoÌ€ng bâÌt trăÌc đôÌi vơÌi kernel mơÌi, baÌ£n nên taÌ£o thêm cho quaÌ triÌ€nh khởi đôÌ£ng maÌy môÌ£t menu để choÌ£n naÌ£p kernel băÌ€ng caÌch hiêÌ£u chỉnh tâÌ£p tin /etc/lilo.conf.
ViÌ duÌ£:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=30
message=/boot/message
linear
default=origin
image=/boot/vmlinuz-2.4.2-2
label=origin
read-only
root=/dev/hda8
image=/boot/bzImage.fw
label=firewall
read-only
root=/dev/hda8
Công viêÌ£c cuôÌi cuÌ€ng laÌ€ nhơÌ đaÌnh lêÌ£nh /sbin/lilo để naÌ£p laÌ£i câÌu hiÌ€nh trong tâÌ£p tin /etc/lilo.conf vaÌ€ reboot laÌ£i maÌy.
Sau đây laÌ€ môÌ£t sôÌ viÌ duÌ£ minh hoÌ£a để thiêÌt lâÌ£p môÌ£t firewall trên Linux
Giả sử local network laÌ€ 10.0.0.0/8 vaÌ€ firewall sử duÌ£ng hai card maÌ£ng, kêÌt nôÌi vơÌi internet băÌ€ng card maÌ£ng eth0 vaÌ€ vơÌi local network laÌ€ eth1.
ChôÌng Syn Flooding:
iptables -A FORWARD -p tcp ”syn -m limit ”limit 1/s -j ACCEPT
ChôÌng Scan Port:
iptables -A FORWARD -p tcp ”tcp-flags SYN,ACK,FIN,RST RST -m limit ”limit 1/s -j ACCEPT
ChôÌng Ping of Death:
iptables -A FORWARD -p icmp ”icmp-type echo-request -m limit ”limit 1/s -j ACCEPT
Cho caÌc packet đã thiêÌt lâÌ£p kêÌt nôÌi tiêÌp tuÌ£c đi qua firewall:
iptables -A FORWARD -m state ”state ESTABLISHED,RELATED -j ACCEPT
ChôÌng giả maÌ£o điÌ£a chỉ nôÌ£i bôÌ£ tưÌ€ bên ngoaÌ€i để xâm nhâÌ£p:
iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
Chuyển đổi điÌ£a chỉ tưÌ€ trong maÌ£ng nôÌ£i bôÌ£ ra bên ngoaÌ€i (SNAT):
iptables -t nat -A POSTROUTING -o eth0 -j SNAT ”to 203.162.0.10
Chuyển đổi điÌ£a chỉ của web server tưÌ€ bên ngoaÌ€i vaÌ€o trong maÌ£ng nôÌ£i bôÌ£ (DNAT):
iptables -t nat -A PREROUTING -d 203.162.0.9 -p tcp ”dport 80 -j DNAT ”to 10.0.0.10
ThiêÌt lâÌ£p Transparent proxy băÌ€ng caÌch chuyển hươÌng port 80 đêÌn server squid proxy 10.0.0.9:
iptables -t nat -A PREROUTING -p tcp ”dport 80 -j DNAT ”to 10.0.0.9:3128
Chỉ cho maÌy tiÌnh trong maÌ£ng nôÌ£i bôÌ£ coÌ điÌ£a chỉ card maÌ£ng 00:C7:8F:72:14 đi ra:
iptables -A FORWARD -m state ”state NEW -m mac ”mac-source 00:C7:8F:72:14 -j ACCEPT
ThưÌ£c hiêÌ£n chia tải trên cả hai hươÌng inbound vaÌ€ outbound: (load balancing):
iptables -t nat -A POSTROUTING -o eth0 -m nth ”counter 7 ”every 3 ”packet 0 -j SNAT ”to-source 10.0.0.5
iptables -t nat -A POSTROUTING -o eth0 -m nth ”counter 7 ”every 3 ”packet 1 -j SNAT ”to-source 10.0.0.6
iptables -t nat -A POSTROUTING -o eth0 -m nth ”counter 7 ”every 3 ”packet 2 -j SNAT ”to-source 10.0.0.7
ChưÌc năng ưu tiên thông lươÌ£ng đôÌi vơÌi truy câÌ£p web:
iptables -A PREROUTING -t mangle -p tcp ”sport 80 -j TOS ”set-tos Maximize-Throughput
Ngăn chăÌ£n sâu Nimda hay CodeRed (mưÌc ưÌng duÌ£ng):
iptables -I INPUT -j DROP -m string -p tcp -s 0.0.0.0/0 ”string c+dir
iptables -I INPUT -j DROP -m string -p tcp -s 0.0.0.0/0 ”string cmd.exe
iptables -I INPUT -j DROP -m string -p tcp -s 0.0.0.0/0 ”string default.ida
ĐêÌn đây chuÌng ta đã hoaÌ€n thaÌ€nh viêÌ£c xây dưÌ£ng môÌ£t hêÌ£ thôÌng firewall maÌ£nh mẽ coÌ thể đương đâÌ€u đươÌ£c vơÌi bâÌt kyÌ€ loaÌ£i tâÌn công naÌ€o vaÌ€ laÌ€ môÌ£t laÌ chăÌn tin câÌ£y cho hêÌ£ thôÌng maÌ£ng. BaÌ£n cũng coÌ thể kêÌt hơÌ£p thêm chưÌc năng cửa ngõ maÌ£ng ảo (VPN gateway) cho firewall băÌ€ng goÌi freeswan coÌ thể download taÌ£i www.freeswan.org.