Cách cô lập server trong mạng riêng bằng Iptables
Trong hướng dẫn này, ta sẽ dạy bạn cách sử dụng Iptables với Mạng riêng DigitalOcean. Ta cũng sẽ trình bày lý do tại sao bạn muốn làm điều này và cung cấp một ví dụ về cách thực hiện điều này trong môi trường của bạn . Ví dụ được đưa ra trong hướng dẫn này sẽ giải thích khái niệm theo cách mà bạn có thể điều chỉnh cấu hình cho phù hợp với nhu cầu của bạn .Tùy chọn mạng riêng của DigitalOcean cấp network interface thứ hai cho VPS, giao diện này chỉ có thể truy cập được đối với các server khác được cung cấp trên cùng một account cũng nằm trong cùng một trung tâm dữ liệu. Điều này nghĩa là dữ liệu được gửi qua giao diện riêng tư của Server chỉ những người trong group của bạn hoặc có quyền truy cập vào password DO của bạn mới có thể truy cập được.
Lưu ý: Hướng dẫn này bao gồm bảo mật IPv4. Trong Linux, bảo mật IPv6 được duy trì riêng biệt với IPv4. Ví dụ: iptables
chỉ duy trì các luật firewall cho địa chỉ IPv4 nhưng nó có một đối tác IPv6 được gọi là ip6tables
, được dùng để duy trì các luật firewall cho địa chỉ mạng IPv6.
Nếu VPS của bạn được cấu hình cho IPv6, hãy nhớ bảo mật cả network interface IPv4 và IPv6 của bạn bằng các công cụ thích hợp. Để biết thêm thông tin về các công cụ IPv6, hãy tham khảo hướng dẫn này: Cách Cấu hình Công cụ để Sử dụng IPv6 trên VPS Linux
.
Tình huống mẫu
Đối với ví dụ của ta , ta sẽ sử dụng môi trường được tạo bởi hướng dẫn sau: Cách tối ưu hóa hiệu suất WordPress với nhân bản MySQL trên Ubuntu 14.04
.
Đây là sơ đồ về môi trường trông như thế nào:
Môi trường ví dụ sử dụng năm VPS (và iptables không được cấu hình ):
- haproxy-www : Trình cân bằng tải Reverse Proxy
- wordpress-1 : Server ứng dụng đầu tiên
- wordpress-2 : Server ứng dụng thứ hai
- mysql-1 : Server database MySQL Master
- mysql-2 : Server database MySQL Slave
Nếu cài đặt của bạn không giống như thế này, bạn vẫn có thể làm theo. Ngoài ra, nếu bạn muốn đọc về cách cài đặt VPS với mạng riêng hoặc kiến thức cơ bản về iptables, thì đây là một vài liên kết mà bạn có thể thấy hữu ích (hướng dẫn này giả sử bạn biết những điều cơ bản về iptables):
- Cách cài đặt và sử dụng mạng riêng DigitalOcean
- Cách bật mạng riêng DigitalOcean trên các server hiện tại
- Cách thức hoạt động của firewall Iptables
- Cách cài đặt firewall bằng Iptables trên Ubuntu 14.04
Nếu bạn đã quen với các khái niệm và muốn xem cài đặt iptables, vui lòng bỏ qua phần Tổng quan về Cấu hình Iptables .
Mục tiêu của ta
Khi ta hoàn thành hướng dẫn này, ta sẽ có một môi trường trông giống như sơ đồ sau:
Tất cả các server trong vùng mạng riêng chỉ có thể được giao tiếp với các server khác trong mạng riêng này (hộp màu cam). Bộ cân bằng tải sẽ có thể truy cập được qua Internet và cũng được liên kết với mạng riêng. Việc thực thi policy này sẽ được thực hiện thông qua iptables trên mỗi server .
Lưu ý : Để chặn lưu lượng truy cập vào giao diện công khai của bạn, bạn có thể tắt giao diện công khai của bạn hoặc cài đặt các luật firewall để đạt được hiệu quả tương tự với Iptables. Ta sẽ sử dụng tùy chọn firewall vì ta có thể cấu hình nó chặn lưu lượng mạng không mong muốn, đồng thời cho phép server của ta truy cập Internet khi nó bắt đầu kết nối (điều này hữu ích như download các bản cập nhật trên server ).
Các cách truy cập vào VPS của bạn
Trước khi tìm hiểu cách khóa mạng riêng của bạn, ta sẽ thảo luận về các phương pháp khác nhau để truy cập vào server của bạn (đặc biệt là dòng lệnh). Biết tất cả các phương pháp kết nối với server của bạn là đặc biệt quan trọng vì bạn có thể tự khóa mình khỏi server của bạn nếu không cẩn thận.
Nếu bạn có cài đặt mạng riêng trên VPS DigitalOcean của bạn , bạn có ba cách để truy cập nó:
- Giao diện công khai
- Giao diện riêng tư
- Quyền truy cập console console
Giao diện công khai
Giao diện công cộng có thể truy cập thông qua Internet global . Điều này nghĩa là bạn hoặc bất kỳ ai khác trên Internet đều có thể truy cập giao diện này trừ khi nó bị khóa.
Giao diện công khai là cần thiết trên các server cần truy cập được qua Internet, vì vậy khách hàng hoặc user của bạn có thể kết nối với bất kỳ dịch vụ nào bạn đang cung cấp (ví dụ: trang web hoặc ứng dụng). Nếu user cần truy cập được, địa chỉ IP của giao diện công cộng thường được ánh xạ tới một domain (ví dụ: example.com) qua DNS.
Mỗi VPS đều có giao diện công khai được bật theo mặc định. Trong hướng dẫn này, ta sẽ sử dụng iptables để hạn chế giao diện công khai chỉ chấp nhận lưu lượng mạng cần thiết để ứng dụng của ta hoạt động bình thường (tức là HTTP).
Giao diện riêng tư
Giao diện riêng tư chỉ có thể truy cập được đối với các VPS khác trên cùng một mạng riêng. Trong trường hợp của DigitalOcean, điều này nghĩa là chỉ các VPS khác được cung cấp trong cùng một account mới có thể truy cập giao diện riêng tư.
Nếu bạn được kết nối với nhiều VPS trong cùng một account , bạn có thể kết nối với giao diện riêng của VPS khác thông qua SSH. Ví dụ: bạn có thể SSH tới giao diện công khai của haproxy-www và sau đó SSH tới giao diện riêng tư của mysql-1 từ đó. Điều này rất hữu ích nếu bạn sử dụng iptables để loại bỏ các kết nối SSH khỏi giao diện công cộng của một số server của bạn.
Trong hướng dẫn này, ta sẽ giới hạn lưu lượng mạng trên các giao diện riêng tư chỉ với các VPS trong “mạng riêng” đã xác định của ta (hộp màu cam trong sơ đồ trên) và một số lưu lượng mạng cần thiết khác (giữa bộ cân bằng tải và server ứng dụng) .
Quyền truy cập console console
Nếu bạn mất quyền truy cập vào cả giao diện công cộng và riêng tư, bạn có thể kết nối với VPS của bạn thông qua quyền truy cập console . Trong thế giới thực, điều này tương tự như kết nối bàn phím, chuột và màn hình trực tiếp với server của bạn. Lưu ý bạn luôn có thể truy cập vào VPS của bạn theo cách này, nếu bạn vô tình tắt cả hai giao diện hoặc dịch vụ SSH của bạn .
Lưu ý : Nếu tất cả thông tin đăng nhập VPS của bạn đều được xác thực bằng SSH key , bạn cần đặt lại password root thông qua console để đăng nhập qua console .
Xác định các yêu cầu về giao diện / truy cập cổng
Trước khi tiếp tục, điều quan trọng là phải xác định các yêu cầu về giao diện và quyền truy cập cổng của bạn. Nhiều ứng dụng sử dụng các cổng mặc định hoặc có thể được cấu hình để liên kết với các giao diện và cổng cụ thể.Không thay đổi cấu hình iptables của bạn cho đến khi bạn chắc chắn về nhu cầu policy của bạn vì firewall được cấu hình sai có thể làm hỏng ứng dụng của bạn.
Dưới đây là bảng phân tích nhu cầu truy cập mạng trong kịch bản ví dụ của ta :
- haproxy-www :
- Internet (công cộng) / cổng 80
- Server WordPress (riêng tư) / cổng 80
- wordpress-1 : (tất cả đều riêng tư)
- haproxy_www / cổng 80
- wordpress-2 / các cổng glusterFS khác nhau
- Server MySQL / cổng 3306
- wordpress-2 : (tất cả đều riêng tư)
- haproxy_www / cổng 80
- wordpress-1 / các cổng glusterFS khác nhau
- Server MySQL / cổng 3306
- mysql-1 : (tất cả đều riêng tư)
- Server / cổng WordPress 3306
- mysql-2 / cổng 3306
- mysql-2 : Server database MySQL Slave
- Server / cổng WordPress 3306
- mysql-1 / cổng 3306
Bạn cũng cần cho phép SSH với ít nhất một trong các giao diện công cộng và SSH giữa tất cả các server trên vùng mạng riêng. Trong ví dụ này, ta sẽ cho phép SSH công khai tới một VPS khác được gọi là tunnel-1 và chỉ SSH riêng tư trên các server khác - điều này nghĩa là ta cần chuyển SSH qua tunnel -1 đến SSH tới bất kỳ server nào khác. Về mặt kỹ thuật, bạn có thể sử dụng bất kỳ (hoặc tất cả) VPS của bạn cho mục đích này.
Bây giờ ta biết những gì ta cần firewall của bạn để chấp nhận và có khả năng bị rớt, hãy bắt đầu cấu hình nó.
Tổng quan về cấu hình Iptables
Dưới đây là tổng quan về cách ta sẽ cấu hình iptables để đáp ứng nhu cầu của ta :
- Thả theo mặc định
- Cho phép SSH từ network interface riêng sang VPS tunnel-1
- Cho phép lưu lượng truy cập Internet được khởi tạo từ server của bạn
- Cho phép rõ ràng lưu lượng mạng riêng cụ thể (theo địa chỉ IP và / hoặc cổng)
Hãy bắt đầu với haproxy-www , server công khai duy nhất của ta . Lưu ý trong các lệnh iptables
, eth0 đề cập đến giao diện công cộng của VPS và eth1 đề cập đến giao diện riêng tư của VPS – nếu tên giao diện của bạn khác, vui lòng thay thế chúng khi thích hợp.
Cấu hình Server Công cộng (haproxy-www)
SSH đến đường hầm-1 :
<pre>
ssh <span class = “highlight”> user </span> @ <span class = “highlight”> tunnel 1 public_IP </span>
</pre>
Từ đây, SSH đến giao diện riêng tư của haproxy-www :
<pre>
ssh <span class = “highlight”> user </span> @ <span class = “highlight”> haproxy www private_IP </span>
</pre>
Trên haproxy-www , đặt tất cả các chuỗi mặc định thành CHẤP NHẬN và xóa mọi luật hiện có:
sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -F
Cho phép đường hầm-1 tới SSH qua giao diện riêng tư của nó tới haproxy-www:
<pre>
sudo iptables -A INPUT -p tcp -s <span class = “highlight”> tunnel 1 IP riêng </span> –dport <span class = “highlight”> 22 </span> -i <span class = “highlight” > eth1 </span> -j CHẤP NHẬN
sudo iptables -A OUTPUT -p tcp -d <span class = “highlight”> tunnel 1 IP riêng </span> –sport <span class = “highlight”> 22 </span> -o <span class = “highlight” > eth1 </span> -m state –state ESTABLISHED -j CHẤP NHẬN
</pre>
Cho phép lưu lượng truy cập lặp lại trên server của bạn. Điều này cho phép server của bạn sử dụng 127.0.0.1 hoặc localhost:
sudo iptables -A INPUT -i lo -j ACCEPT sudo iptables -A OUTPUT -o lo -j ACCEPT
Cho phép lưu lượng truy cập và riêng tư được khởi tạo từ server của bạn. Điều này sẽ cho phép server của bạn truy cập Internet để thực hiện những việc như download các bản cập nhật hoặc phần mềm:
<pre>
sudo iptables -I OUTPUT -o <span class = “highlight”> eth0 </span> -d 0.0.0.0/0 -j CHẤP NHẬN
sudo iptables-I INPUT -i <span class = “highlight”> eth0 </span> -m state –state ĐÃ THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN
</pre>
Cho phép tất cả truy cập HTTP (cổng 80) trên giao diện công cộng. Điều này là cần thiết để user có thể truy cập trang web của ta qua http://www.example.com/ :
<pre>
sudo iptables -A INPUT -i <span class = “highlight”> eth0 </span> -p tcp –dport <span class = “highlight”> 80 </span> -m state – trạng thái MỚI, ĐÃ THÀNH LẬP -j CHẤP NHẬN
sudo iptables -A OUTPUT -o <span class = “highlight”> eth0 </span> -p tcp –sport <span class = “highlight”> 80 </span> -m state –state THÀNH LẬP -j CHẤP NHẬN
</pre>
Cho phép cả hai server WordPress truy cập vào cổng 80 thông qua địa chỉ IP riêng của chúng:
<pre>
sudo iptables -A INPUT -p tcp -s <span class = “highlight”> wordpress 1 IP riêng </span> –sport 80 -j CHẤP NHẬN
sudo iptables -A OUTPUT -p tcp -d <span class = “highlight”> wordpress 1 IP riêng </span> –dport 80 -j CHẤP NHẬN
sudo iptables -A INPUT -p tcp -s <span class = “highlight”> wordpress 2 IP riêng </span> –sport 80 -j CHẤP NHẬN
sudo iptables -A OUTPUT -p tcp -d <span class = “highlight”> wordpress 2 IP riêng </span> –dport 80 -j CHẤP NHẬN
</pre>
Bây giờ ta đã cho phép tất cả lưu lượng mạng cần thiết, ta có thể loại bỏ tất cả lưu lượng khác bằng cách đặt DROP
làm hành vi mặc định cho mỗi chuỗi iptables:
sudo iptables -P INPUT DROP sudo iptables -P OUTPUT DROP sudo iptables -P FORWARD DROP
Đến đây bạn đã hoàn tất việc cấu hình firewall của haproxy-www, bạn cần đảm bảo mọi thứ hoạt động bình thường. Nếu bạn hài lòng với cấu hình của bạn , bạn có thể lưu nó bằng cách cài đặt gói iptables-dai dẳng với các lệnh apt sau:
sudo apt-get update sudo apt-get install iptables-persistent
Trong quá trình cài đặt iptables-dai dẳng, nó sẽ hỏi bạn có muốn lưu cài đặt firewall hiện tại của bạn không. Trả lời có.
Bây giờ firewall haproxy-www cho phép những điều sau:
- SSH từ tunnel -1 qua mạng riêng
- Lưu lượng truy cập lặp lại
- Hoạt động Internet mà haproxy-www bắt đầu
- HTTP trên Internet công cộng
- HTTP giữa chính nó và các server ứng dụng WordPress
- Không có lưu lượng truy cập đến từ các nguồn khác
Hãy chuyển sang bảo vệ các server còn lại của ta .
Cấu hình server mạng riêng
Lưu ý : Thực hiện tất cả các bước này cho tất cả các server còn lại: wordpress-1 , wordpress-2 , mysql-1 và mysql-2 . Ta sẽ đề cập đến các server này, nói chung, là VPS riêng trong phần này.
Do số lượng lớn các network interface và cổng yêu cầu giao tiếp trong mạng riêng, ta sẽ đơn giản hóa mọi thứ bằng cách liệt kê các địa chỉ IP cần thiết vào danh sách trắng thay vì chỉ cho phép kết hợp địa chỉ IP và cổng cụ thể. Ngoài ra, ta sẽ cho phép lưu lượng đi theo mặc định và chỉ hạn chế lưu lượng đến.
SSH đến đường hầm-1 :
<pre>
ssh <span class = “highlight”> user </span> @ <span class = “highlight”> tunnel 1 public_IP </span>
</pre>
Từ đây, SSH đến giao diện riêng tư của private -VPS :
<pre>
ssh <span class = “highlight”> user </span> @ <span class = “highlight”> private VPS private_IP </span>
</pre>
Trên private-VPS , đặt tất cả các chuỗi mặc định thành CHẤP NHẬN và xóa mọi luật hiện có:
sudo iptables -P INPUT ACCEPT sudo iptables -P OUTPUT ACCEPT sudo iptables -P FORWARD ACCEPT sudo iptables -F
Cho phép tunnel-1 tới SSH qua giao diện riêng tư của nó với private-VPS:
<pre>
sudo iptables -A INPUT -p tcp -s <span class = “highlight”> tunnel 1 private_IP </span> –dport <span class = “highlight”> 22 </span> -i <span class = “highlight”> eth1 </span> -j CHẤP NHẬN
</pre>
Cho phép lưu lượng truy cập lặp lại trên server của bạn. Điều này cho phép server của bạn sử dụng 127.0.0.1 hoặc localhost:
sudo iptables -A INPUT -i lo -j ACCEPT
Cho phép lưu lượng truy cập và riêng tư được khởi tạo từ server của bạn. Điều này sẽ cho phép server của bạn truy cập Internet để thực hiện những việc như download các bản cập nhật hoặc phần mềm:
<pre>
sudo iptables-I INPUT -i <span class = “highlight”> eth0 </span> -m state –state ĐÃ THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN
</pre>
Danh sách trắng tất cả các server chỉ cần quyền truy cập vào vùng mạng riêng (bạn có thể bỏ qua mục nhập cho server bạn đang làm việc):
<pre>
sudo iptables -A INPUT -p tcp -s <span class = “highlight”> wordpress 1 IP riêng </span> -j CHẤP NHẬN
sudo iptables -A INPUT -p tcp -s <span class = “highlight”> wordpress 2 IP riêng </span> -j CHẤP NHẬN
sudo iptables -A INPUT -p tcp -s <span class = “highlight”> mysql 1 IP riêng </span> -j CHẤP NHẬN
sudo iptables -A INPUT -p tcp -s <span class = “highlight”> mysql 2 private IP </span> -j CHẤP NHẬN
</pre>
Chỉ trên cả hai server WordPress , cho phép truy cập HTTP haproxy-www (cổng 80), vì vậy nó có thể truy xuất các trang:
<pre>
sudo iptables -A INPUT -p tcp -s <span class = “highlight”> haproxy www private IP </span> –sport 80 -j CHẤP NHẬN
sudo iptables -A OUTPUT -p tcp -d <span class = “highlight”> haproxy www private IP </span> –dport 80 -j CHẤP NHẬN
</pre>
Thả chuỗi INPUT và FORWARD theo mặc định. Lưu ý ta đang để mặc định của OUTPUT là CHẤP NHẬN, vì ta tin tưởng các server trên mạng riêng của bạn :
sudo iptables -P INPUT DROP sudo iptables -P FORWARD DROP
Đến đây bạn đã hoàn tất việc cấu hình firewall của private-VPS, bạn cần đảm bảo mọi thứ hoạt động bình thường. Nếu bạn hài lòng với cấu hình của bạn , bạn có thể lưu nó bằng cách cài đặt gói iptables-dai dẳng với các lệnh apt sau:
sudo apt-get update sudo apt-get install iptables-persistent
Trong quá trình cài đặt iptables-dai dẳng, nó sẽ hỏi bạn có muốn lưu cài đặt firewall hiện tại của bạn không. Trả lời có.
Bây giờ firewall riêng-VPS cho phép những điều sau:
- SSH từ tunnel -1 qua mạng riêng
- Lưu lượng truy cập lặp lại
- Hoạt động Internet mà VPS riêng khởi tạo
- Tất cả lưu lượng mạng đi
- Tất cả lưu lượng mạng đến giữa các server đã được đưa vào danh sách trắng (tức là tất cả các server trong khu vực mạng riêng)
- Không có lưu lượng truy cập đến từ các nguồn khác
Khắc phục sự cố: Danh sách Iptables và Ghi log
Nếu bạn cấu hình firewall của bạn và thấy rằng ứng dụng của bạn ngừng hoạt động, cách tốt nhất để khắc phục sự cố đó là xem danh sách policy và log .
Hiển thị cấu hình Iptables
Để xem cấu hình iptables hoặc danh sách policy , hãy chạy lệnh sau:
sudo iptables -vL --line-numbers
Điều này sẽ hiển thị tất cả các chuỗi và luật mà bạn đã cài đặt , với số dòng. Ngoài ra, nó hiển thị số lượng gói tin bị giảm. Nếu bạn đang mong đợi không có gói nào bị rơi, hãy kiểm tra log .
Đọc log Iptables
Tạo một chuỗi mới có tên là LOG:
iptables -N LOG
Định tuyến INPUT / OUTPUT / FORWARD tới chuỗi LOG (thay thế CHAIN
bằng chuỗi bạn muốn theo dõi, chẳng hạn như “INPUT”):
<pre>
iptables -A <span class = “highlight”> INPUT </span> -j ĐĂNG NHẬP
</pre>
Bây giờ đăng nhập các gói bằng lệnh này:
iptables -A LOG -m limit --limit 60/min -j LOG --log-prefix "Iptables DROP: " --log-level 7
Đến đây bạn có thể theo dõi thông báo hệ thống của bạn để xem gói nào đang bị loại bỏ.
Trong Ubuntu, các tin nhắn có thể được đọc trong thời gian thực bằng lệnh sau:
sudo tail -f /var/log/syslog
Trong CentOS, các tin nhắn có thể được đọc trong thời gian thực bằng lệnh sau:
sudo tail -f /var/log/messages
Các bản ghi sẽ liệt kê giao diện, cổng nguồn, cổng đích và một số thông tin khác về mỗi gói tin bị loại bỏ. Điều này sẽ giúp bạn tìm ra bất kỳ vấn đề nào mà bạn có thể gặp phải.
Kết luận
Sau khi làm theo hướng dẫn này, bạn sẽ có một nền tảng tốt để sử dụng iptables để bảo vệ VPS của bạn khỏi Internet công cộng và khỏi các VPS khác trong cùng một mạng riêng được chia sẻ (tức là cùng một trung tâm dữ liệu). Lưu ý bạn cần cập nhật firewall khi thêm server mới hoặc thay đổi cài đặt server của bạn .
Các tin liên quan
Cách thiết lập firewall bằng Iptables trên Ubuntu 14.042014-05-06
Cách thức hoạt động của firewall Iptables
2014-05-02
Cách thiết lập firewall Iptables cơ bản trên Centos 6
2013-04-16
Cách thiết lập firewall Iptables cơ bản trên Centos 6
2013-04-16