Saturday, July 3, 2010

Xây dựng Linux router và proxy với iptables + squid

Nguồn: http://opensource.com.vn/opensource/linux/centos/106-xay-dung-linux-router-va-proxy-voi-iptables-squid.html

Linux router là một hệ thống đứng giữa Internal network và Internet hoặc phân cách một network và một network khác. Linux router là một firewall được xây dựng bằng Netfilter/iptables, luôn có sẵn trên hầu hết các bản phân phối của Linux.



Nếu bạn là một người dùng bình thường truy cập internet thông qua modem thông thường, bạn không cần thiết phải có một firewall vì IP của bạn thường xuyên thay đổi, bạn không sử dụng một dịch vụ nào đặc biệt cần được bảo vệ, và hạn chế bởi một tường lửa chuyên dụng.

Đối với môi trường doanh nghiệp, việc triển khai nhiều hệ thống, dịch vụ cần sự bảo mật, và tối ưu trong quản lí, cả mạng Lan và các truy xuất từ bên ngoài vào, tường lửa là một nhu cầu thiết yếu và tối cần thiết. Các sản phẩm router phần cứng thường rất mắc và cần sự hỗ trợ tương đối từ phía cung cấp, trong khi việc xây dựng riêng một Linux firewall là việc không quá khó, tốn ít tài nguyên + tiền bạc, mà còn có thể xây dựng một hệ thống all in one tùy theo nhu cầu và mục đích, quản lí chặt chẽ và quan trọng là khả năng bền bỉ mà bản thân Linux mang lại.

Bài viết này sẽ cố gắng đưa ra một mô hình cụ thể, cách cài đặt và vận hành một Linux Firewall, transparent proxy, DHCP server trên một máy chủ Linux.

Mô hình thực hiện với máy chủ có cấu hình : Pentium Dual Core 2.8 GB, 1GB Ram và 80GB hard disk, sử dụng centos 5.3 enterprise với các gói cài đặt chuẩn, không có giao diện đồ họa.

Trước tiên hãy mô tả một chút về mô hình network mà ta cố gắng xây dựng: Một công ty sử dụng đường truyền cáp quang từ FPT, với đường truyền này công ty được cung cấp một đia chỉ IP tĩnh 111.111.111.111, đường truyền đi qua một router, sau đó đi vào mạng bên trong. Nhu cầu của công ty cần một vài dịch vụ web, mail, ftp, vpn....và chia cách, quản lí truy cập từ bên ngoài vào LAN bằng một firewall, proxy.

  1. Kiểm sóat luồng truy cập từ bên ngoài vào mạng LAN.

  2. Cấm các truy cập bất hợp lệ từ LAN ra internet

  3. Cấm sử dụng các dịch vụ chat (Instant message) từ LAN.

  4. Xây dựng một DHCP server tự động cung cấp IP cho mạng LAN.

Mô hình mạng được miêu tả như hình.

alt

Cách thức họat động: Linux router có 2 netwok cards:

eth0 là địa chỉ mặt ngoài tiếp xúc với Modem có địa chỉ là 192.168.1.2

eth1 là địa chỉ mặt trong tiếp xúc với LAN có địa chỉ là 172.16.0.1

Trên Router ta triển khai DHCP server cung cấp IP cho toàn bộ mạng LAN. Cũng trên server này ta xây dựng router và squid proxy để thực hiện các yêu cầu đưa ra.

  1. DHCP server: Đây là dịch vụ đơn giản và dễ dàng nhất trong bài viết này. Gói cài đặt được cung cấp sẵn + một vài thay đổi nhỏ trong cấu hình là ta đã cấp được IP cho toàn bộ mạng LAN.

Dùng yum để download và cài đặt dhcpd:

  1. [hungnv@home ~]$ sudo yum
  2. install dpcp dhcp-devel
  3. [sudo] password for hungnv:

Mở file /etc/dhcpd.conf, xóa trắng nếu có nội dung và thêm vào tương tự:


  1. [hungnv@home ~]$ vim /etc/dhcpd.conf

  2. #
  3. # DHCP Server Configuration file.
  4. # see /usr/share/doc/dhcp*/dhcpd.conf.sample
  5. #
  6. ddns-update-style none;
  7. deny bootp;
  8. authoritstive;
  9. subnet 172.16.0.0 netmask 255.255.0.0
  10. {
  11. option subnet-mask 255.255.0.0;
  12. option domain-name "opensource.com.vn";
  13. option routers 172.16.0.1;
  14. option domain-name-servers ns1.opensource.com.vn, ns2.opensource.com.vn, dns.fpt.vn;
  15. #option netbios-name-servers 192.168.0.2;
  16. range dynamic-bootp 172.16.0.20 172.16.0.120;
  17. default-lease-time 31200;
  18. max-lease-time 62400;
  19. }

Khởi động dhcp server


  1. [root @home ~]#
  2. service dhcpd restart
  3. Shutting down dhcpd: [ OK ]
  4. Starting dhcpd: [ OK ]

Ở client, dùng dhclient để lấy IP:


  1. [user@client~]# dhclient eth0

Sau đó dùng ifconfig để xem IP hiện tại của client này.

Squid như là một transparent proxy:

Cài đặt:

Mở file /etc/squid/squid.conf

Thêm vào nội dung bên dưới


  1. acl manager proto cache_object
  2. acl localhost src 127.0.0.1/32
  3. acl localnet src 172.16.0.0/16
  4. acl all src 0/0
  5. http_port 172.16.0.1:1234
  6. # Define safe ports to be allowed by transparent proxy
  7. acl SSL_ports port 443 563
  8. acl Safe_ports port 25 #smtp server
  9. acl Safe_ports port 143 #Imap mail server
  10. acl Safe_ports port 6789 #ssh mapped port
  11. acl Safe_ports port 80 # http
  12. acl Safe_ports port 21 # ftp
  13. acl Safe_ports port 443 # https
  14. acl Safe_ports port 1025-65535 # unregistered ports
  15. acl Safe_ports port 6222 #Jabber server
  16. acl Safe_ports port 993 #imap over ssl
  17. acl Safe_ports port 7025 #Local mail delivery
  18. acl Safe_ports port 7036 #Mysql local
  19. acl Safe_ports port 7071 #Zimbra admin cosole

  20. # Deny yahoo messsenger
  21. # Yahoo! Messenger
  22. acl ym dstdomain .yahoo.com
  23. acl ym dstdomain .us.il.yimg.com .msg.yahoo.com .pager.yahoo.com
  24. acl ym dstdomain .rareedge.com .ytunnelpro.com .chat.yahoo.com
  25. acl ym dstdomain .voice.yahoo.com .address.yahoo.com

  26. acl ymregex url_regex yupdater.yim ymsgr myspaceim

  27. #Other protocols Yahoo!Messenger uses ??
  28. acl ym dstdomain .skype.com .imvu.com

  29. http_access deny ym
  30. http_access deny ymregex

  31. acl CONNECT method CONNECT
  32. http_access allow localnet
  33. http_access allow manager localhost
  34. http_access allow proxypass
  35. http_access deny manager
  36. http_access deny !Safe_ports
  37. http_access deny CONNECT !SSL_ports

  38. http_access deny all

  39. icp_access deny all
  40. hierarchy_stoplist cgi-bin ?
  41. cache_mem 256 MB
  42. cache_dir ufs /var/spool/squid 2048 16 256
  43. cache_mgr hungnv@opensource.com.vn
  44. cache_effective_user squid
  45. cache_effective_group squid

  46. access_log /var/log/squid/access.log squid

  47. refresh_pattern ^ftp: 1440 20% 10080
  48. refresh_pattern ^gopher: 1440 0% 1440
  49. refresh_pattern (cgi-bin|\?) 0 0% 0
  50. refresh_pattern . 0 20% 4320

  51. visible_hostname opensource.com.vn

  52. icp_port 3130

  53. always_direct allow all

  54. forwarded_for off

  55. coredump_dir /var/spool/squid

Trong đoạn cấu hình trên, ta đã cấu hình cho squid chặn các dịch vụ IM như yahoo và skype, danh sách các protocol bị chặn các bạn có thể xem ở: http://wiki.squid-cache.org/ConfigExamples/ phần instant message.

Tiếp theo là phần cài đặt router. Nếu ta đã biết rõ được nhu cầu của mình cần gì và có được sơ đồ những dịch vụ cần thiết, việc thiết lập router/firewall là không hề khó. Iptables là dịch vụ có sẵn trên centos, cho nên ta không cần phải cài đặt.

  1. #!/bin/sh
  2. # Script makes a linux box acts as an Linux Router.
  3. # 22-10-2009
  4. # By hungnv@opensource.com.vn and some others from the internet :)
  5. #
  6. echo -e "\n\n\n Installing iptables script..."
  7. # Name of Internal Interface
  8. LANIF="eth1"
  9. # Enter Lan Network
  10. IPLAN="172.16.0.0/16"
  11. # ipaddress of internal interface
  12. LANIP="172.16.0.1/16"
  13. # Name of External Interface
  14. WANIF="eth0"
  15. # ipaddress of external interface
  16. EXTIP="192.168.1.2"
  17. echo "Preparing..."
  18. /sbin/depmod -a
  19. /sbin/modprobe ip_tables
  20. /sbin/modprobe ip_conntrack
  21. /sbin/modprobe ip_conntrack_ftp
  22. /sbin/modprobe ip_conntrack_irc
  23. /sbin/modprobe iptable_nat
  24. /sbin/modprobe ip_nat_ftp
  25. /sbin/modprobe ip_nat_irc

  26. echo " Enabling IP forwarding..."
  27. echo "1" > /proc/sys/net/ipv4/ip_forward
  28. echo "1" > /proc/sys/net/ipv4/ip_dynaddr

  29. echo " External interface: $EXTIF"
  30. echo " External interface IP address is: $EXTIP"
  31. echo " Loading firewall server rules..."
  32. ALL="0.0.0.0/0"
  33. # Set default policy to DROP
  34. iptables -P INPUT DROP
  35. iptables -F INPUT
  36. iptables -P OUTPUT DROP
  37. iptables -F OUTPUT
  38. iptables -P FORWARD DROP
  39. iptables -F FORWARD
  40. iptables -F -t nat
  41. # Flush the user chain.. if it exists
  42. if [ "`iptables -L | grep drop-and-log-it`" ]; then
  43. iptables -F drop-and-log-it
  44. fi
  45. # Delete all User-specified chains
  46. iptables -X

  47. # Reset all IPTABLES counters
  48. iptables -Z

  49. # Creating a DROP chain
  50. iptables -N drop-and-log-it
  51. iptables -A drop-and-log-it -j LOG --log-level info
  52. iptables -A drop-and-log-it -j REJECT
  53. echo -e " - Loading INPUT rulesets"

  54. # loopback interfaces are valid.
  55. iptables -A INPUT -i lo -s $ALL -d $ALL -j ACCEPT

  56. # local interface, local machines, going anywhere is valid
  57. iptables -A INPUT -i $INTIF -s $INTNET -d $ALL -j ACCEPT
  58. # remote interface, claiming to be local machines, IP spoofing, get lost
  59. iptables -A INPUT -i $EXTIF -s $INTNET -d $ALL -j drop-and-log-it
  60. # remote interface, any source, going to permanent PPP address is valid
  61. iptables -A INPUT -i $EXTIF -s $ALL -d $EXTIP -j ACCEPT
  62. # Allow any related traffic coming back to the MASQ server in
  63. iptables -A INPUT -i $EXTIF -s $ALL -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT

  64. # Catch all rule, all other incoming is denied and logged.
  65. iptables -A INPUT -s $ALL -d $ALL -j drop-and-log-it
  66. echo -e " - Loading OUTPUT rulesets"
  67. #######################################################################
  68. # OUTPUT: Outgoing traffic from various interfaces. All rulesets are
  69. # already flushed and set to a default policy of DROP.
  70. #
  71. # loopback interface is valid.
  72. iptables -A OUTPUT -o lo -s $ALL -d $ALL -j ACCEPT

  73. # local interfaces, any source going to local net is valid
  74. iptables -A OUTPUT -o $INTIF -s $EXTIP -d $INTNET -j ACCEPT

  75. # local interface, any source going to local net is valid
  76. iptables -A OUTPUT -o $INTIF -s $INTIP -d $INTNET -j ACCEPT
  77. # outgoing to local net on remote interface, stuffed routing, deny
  78. iptables -A OUTPUT -o $EXTIF -s $ALL -d $INTNET -j drop-and-log-it
  79. # anything else outgoing on remote interface is valid
  80. iptables -A OUTPUT -o $EXTIF -s $EXTIP -d $ALL -j ACCEPT
  81. # Catch all rule, all other outgoing is denied and logged.
  82. iptables -A OUTPUT -s $ALL -d $ALL -j drop-and-log-it
  83. echo -e " - Loading FORWARD rulesets"
  84. iptables -A FORWARD -i $EXTIF -o $INTIF -m state --state ESTABLISHED,RELATED -j ACCEPT
  85. iptables -A FORWARD -i $INTIF -o $EXTIF -j ACCEPT

  86. # Catch all rule, all other forwarding is denied and logged.
  87. iptables -A FORWARD -j drop-and-log-it

  88. # Enable SNAT (MASQUERADE) functionality on $EXTIF
  89. iptables -t nat -A POSTROUTING -o $EXTIF -j SNAT --to $EXTIP

  90. #######################################################################
  91. # For Squid Server
  92. ###
  93. #
  94. INTIP="172.16.0.1"
  95. iptables -t nat -A PREROUTING -i $INTIF --protocol tcp --dport 80 -j DNAT --to $INTIP:$SQUID_PORT
  96. # if it is same system
  97. iptables -t nat -A PREROUTING -i $EXTIF --protocol tcp --dport 80 -j REDIRECT --to-port $SQUID_PORT

  98. echo -e " Setting up firewall complete\n\n"

Lưu script trên với tên tùy ý, cho tùy chọn execute ( +x ) và đặt vào /etc/rc.local để script chạy lúc khởi động,

Lúc này bạn test thử truy cập internet và thêm vào các phần khác theo nhu cầu riêng của mình.

Xin lưu ý rằng các script cũng như lệnh nói đến trong bài viết này chỉ nhằm mục đích tạo ra một dhcp server, proxy và firewall “có thể” làm việc, không hề có bất cứ tính năng gì kèm theo. Muốn đầy đủ, phải hiểu được nhu cầu cụ thể của từng môi trường, như tiêu chí của bài viết nói đến.

No comments:

Router Packet Networking

Đây là video ngắn khá hay, mô tả đường đi của một gói tin trên Mạng Internet.