Mô tả của iptables Kiến thức cơ bản về iptables sử dụng Debian làm ví dụ qua con mắt của một em bé. Cung cấp quyền truy cập vào các dịch vụ trên mạng cục bộ

Mọi máy tính kết nối vào mạng đều có nguy cơ tiềm ẩn. Có rất nhiều mối đe dọa trên mạng, từ các chương trình sẽ cố gắng xâm nhập hệ thống bằng mọi cách, cho đến những tin tặc muốn giành quyền truy cập vào máy tính mà họ cần. Và phần mềm được cài đặt trên máy tính của bạn có thể chứa những lỗ hổng không xác định và chưa được sửa chữa, có thể trở thành lỗ hổng bảo mật.

Nếu điều này không phù hợp lắm với máy tính gia đình, vì chúng được kết nối với mạng thông qua bộ định tuyến và NAT, giúp ẩn chúng khỏi mạng bên ngoài, thì đối với máy chủ, điều này phù hợp hơn bao giờ hết. TRONG hệ điều hành Linux có tường lửa iptables rất linh hoạt và đáng tin cậy được tích hợp trong kernel.

Với sự trợ giúp của chương trình này, hệ thống được bảo vệ khỏi sự xâm nhập từ bên ngoài, chuyển hướng cổng và nhiều hành động khác với lưu lượng truy cập. Nhưng nhược điểm của nó là hơi khó cài đặt. Bài viết này sẽ xem xét việc thiết lập iptables cho người mới sử dụng. Tôi hy vọng rằng sau này bạn sẽ có thể tự tin sử dụng nó khả năng cơ bản iptables.

Hệ thống con iptables và Netfilter đã được tích hợp vào nhân Linux từ khá lâu. Tất cả các gói mạng đi qua máy tính, được máy tính gửi hoặc được gửi đến máy tính, đều được hạt nhân định tuyến thông qua bộ lọc iptables. Ở đó, các gói này có thể được kiểm tra và sau đó với mỗi lần kiểm tra, nếu nó vượt qua, hành động được chỉ định trong đó sẽ được thực hiện. Ví dụ: gói được chuyển tới kernel để gửi chương trình mục tiêu, hoặc bị loại bỏ.

Các loại gói

Tất cả các gói được chia thành ba loại: đến, đi và đi. Thư đến là những thư được gửi đến máy tính này, thư đi là những thư được gửi từ máy tính này tới mạng. Và các gói chuyển tiếp là các gói chỉ cần được chuyển tiếp thêm, chẳng hạn như nếu máy tính của bạn đang hoạt động như một bộ định tuyến.

Theo đó, trong bộ lọc iptables, tất cả các gói được chia thành ba chuỗi tương tự nhau:

  • Đầu vào- xử lý các gói tin và kết nối đến. Ví dụ: nếu bất kỳ người dùng bên ngoài nào cố gắng kết nối với máy tính của bạn qua ssh hoặc bất kỳ trang web nào gửi nội dung của nó cho bạn theo yêu cầu của trình duyệt. Tất cả các gói này sẽ kết thúc trong chuỗi này;
  • phía trước- chuỗi này được sử dụng để chuyển các kết nối. Điều này bao gồm các gói được gửi đến máy tính của bạn nhưng không dành cho máy tính của bạn, chúng chỉ được gửi qua mạng tới đích. Như tôi đã nói, điều này được quan sát thấy trên các bộ định tuyến hoặc chẳng hạn như nếu máy tính của bạn phát wifi;
  • đầu ra- Chuỗi này được sử dụng cho các gói tin và kết nối gửi đi. Điều này bao gồm các gói được tạo khi bạn cố gắng ping một trang web hoặc khi bạn khởi chạy trình duyệt của mình và cố gắng mở bất kỳ trang web nào.

Nhưng nếu bạn nghĩ rằng chỉ cần đóng hoàn toàn Chuỗi đầu vào để tăng tính bảo mật thì bạn đã nhầm to rồi. Khi mạng hoạt động, cả chuỗi đầu vào và đầu ra đều được sử dụng. Ví dụ: bạn đang cố gắng ping, dữ liệu được gửi qua đầu ra nhưng phản hồi lại đến qua đầu vào. Điều tương tự cũng xảy ra khi duyệt trang web và các hành động khác. Nhưng chuỗi chuyển tiếp có thể không được sử dụng nếu máy tính của bạn không phải là bộ định tuyến. Vì vậy việc cấu hình iptables phải được thực hiện rất cẩn thận.

Quy tắc và hành động

Trước khi chuyển sang tạo danh sách các quy tắc iptables, bạn cần xem xét cách chúng hoạt động và chúng là gì. Đối với mỗi loại gói, bạn có thể đặt một bộ quy tắc sẽ được kiểm tra lần lượt xem gói có tuân thủ hay không và nếu gói đó khớp thì hành động được chỉ định trong quy tắc sẽ được áp dụng cho gói đó. Các quy tắc tạo thành một chuỗi nên đầu vào, đầu ra và chuyển tiếp được gọi là chuỗi, chuỗi quy tắc. Có thể có một số hành động:

  • CHẤP NHẬN- cho phép gói tin đi xa hơn dọc theo chuỗi quy tắc;
  • LÀM RƠI- gỡ bỏ gói;
  • TỪ CHỐI- từ chối gói hàng, một thông báo sẽ được gửi đến người gửi rằng gói hàng đã bị từ chối;
  • ĐĂNG NHẬP- tạo một bản ghi về gói trong tệp nhật ký;
  • XẾP HÀNG- gửi gói đến ứng dụng người dùng.

Các quy tắc có thể kiểm tra bất kỳ kết quả trùng khớp nào, chẳng hạn như theo ip, theo cổng người nhận hoặc người gửi, tiêu đề gói, v.v. Nếu một gói không khớp với bất kỳ quy tắc nào thì hành động mặc định sẽ được áp dụng cho gói đó, thường là CHẤP NHẬN.

Khi chúng ta đã tìm ra các quy tắc, chúng ta có thể quay trở lại dây chuyền. Ngoài những điều được liệt kê ở trên, còn có hai chuỗi quy tắc bổ sung:

  • định tuyến trước- gói tin đi vào chuỗi này trước khi được iptables xử lý, hệ thống chưa biết nó sẽ được gửi đi đâu, vào, ra hay chuyển tiếp;
  • định tuyến sau- tất cả các gói chuyển tiếp đã vượt qua chuỗi chuyển tiếp sẽ đến đây.

Nhưng đó không phải là tất cả. Chúng tôi cũng có các bảng iptables, bạn cũng nên xử lý bảng này.

bảng ipatable

Phía trên chuỗi quy tắc trong iptables còn có một mức độ trừu tượng khác và đây là các bảng. Có một số bảng trong hệ thống và tất cả chúng đều có bộ tiêu chuẩn chuỗi đầu vào, chuyển tiếp và đầu ra. Các bảng được thiết kế để thực hiện các hành động khác nhau trên các gói, chẳng hạn như sửa đổi hoặc lọc. Bây giờ điều này không quá quan trọng đối với bạn và chỉ cần biết rằng việc lọc gói iptables được thực hiện trong bảng bộ lọc là đủ. Nhưng chúng ta sẽ xem xét tất cả:

  • thô- được thiết kế để làm việc với bao thô khi chúng chưa được xử lý;
  • mang thai- dành cho việc sửa đổi các gói;
  • tự nhiên- cung cấp chức năng tự nhiên nếu bạn muốn sử dụng máy tính của mình làm bộ định tuyến;
  • lọc- bảng chính để lọc các gói, được sử dụng theo mặc định.

Hầu hết mọi thứ đều có lý thuyết, bây giờ chúng ta cùng xem công dụng nhé dòng lệnh iptables, được sử dụng để quản lý hệ thống iptables.

Tiện ích iptables

Hệ thống con iptables và netfilter được tích hợp vào kernel, nhưng một bộ tiện ích để quản lý tất cả những thứ này không phải lúc nào cũng được cung cấp cùng với hệ thống. Để cài đặt tiện ích trên Ubuntu, gõ:

sudo apt cài đặt iptables

Và trên các bản phân phối dựa trên Fedora, việc cài đặt iptables được thực hiện hơi khác một chút:

sudo yum cài đặt iptables

Sau khi quá trình cài đặt iptables hoàn tất, bạn có thể chuyển sang cấu hình, nhưng trước tiên hãy xem cú pháp của tiện ích. Thông thường lệnh có nội dung như thế này hình thức chung:

-t chuỗi hành động bảng Tùy chọn bổ sung

Bây giờ chúng ta hãy xem các tham số iptables, bảng cho biết bảng sẽ làm việc, tham số này có thể bị bỏ qua, hành động là Yêu cầu hành động, ví dụ: tạo hoặc xóa quy tắc và Tùy chọn bổ sung mô tả hành động và quy tắc sẽ được thực hiện.

Vẫn còn phải xem xét các hành động chính mà iptables cho phép bạn thực hiện:

  • -MỘT- thêm quy tắc vào chuỗi;
  • -VỚI- kiểm tra tất cả các quy tắc;
  • -D- xóa quy tắc;
  • -TÔI- chèn quy tắc với số lượng mong muốn;
  • -L- hiển thị tất cả các quy tắc trong chuỗi hiện tại;
  • -S- hiển thị tất cả các quy tắc;
  • -F- xóa tất cả các quy tắc;
  • -N- tạo một chuỗi;
  • -X- xóa chuỗi;
  • -P- đặt hành động mặc định.

Tùy chọn bổ sung cho quy tắc:

  • -P- chỉ định giao thức, một trong các tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp,
    mh;
  • -S- chỉ định địa chỉ IP của thiết bị gửi gói;
  • -d- cho biết địa chỉ IP của người nhận;
  • -Tôi- giao diện mạng đầu vào;
  • -o- giao diện mạng đi;
  • -j- chọn một hành động nếu quy tắc phù hợp.

Bây giờ bạn có thể chuyển sang xem các ví dụ về cách cấu hình iptables.

Ví dụ về cấu hình iptables

Chúng ta sẽ xem xét một số ví dụ cơ bản để bạn có thể củng cố những gì bạn đã đọc ở trên.

Danh sách các quy tắc

Trước tiên, hãy xem cách xem các quy tắc iptables, tùy chọn -L là đủ cho việc này:

Bạn cũng có thể chỉ định chuỗi mong muốn để chỉ hiển thị các quy tắc cho chuỗi đó:

iptables -L ĐẦU VÀO

Xóa quy tắc

Bạn không thể đơn giản vô hiệu hóa iptables bằng cách dừng dịch vụ cập nhật quy tắc iptables qua systemd hoặc thậm chí bằng cách xóa bộ tiện ích cấu hình. Hệ thống con hoạt động ở cấp kernel và không phụ thuộc vào những gì bạn đã cài đặt ở đó. Vì vậy, nếu bạn làm sai điều gì đó, bạn sẽ cần phải làm rõ các quy tắc. Để làm điều này, hãy chạy:

Hoặc chỉ dành cho một chuỗi cụ thể:

sudo iptables -F Đầu vào

Hãy để tôi nhắc bạn rằng tất cả những hành động này được thực hiện cho bảng mặc định - bộ lọc.

Quy tắc mặc định

Như tôi đã nói, nếu không có quy tắc nào khớp với gói thì hành động mặc định sẽ được áp dụng cho gói đó. Nó có thể được chỉ định bằng tùy chọn -p:

sudo iptables -p CHẤP NHẬN ĐẦU VÀO
$ sudo iptables -p CHẤP NHẬN ĐẦU RA
$ sudo iptables -p TIẾN LÊN THẢ

Trong ví dụ này, chúng tôi cho phép chuỗi INPUT và OUTPUT, nhưng vô hiệu hóa FORWARD.

Chặn gói

Để chặn các gói, chúng ta có thể sử dụng hành động DROP; chúng ta có thể lọc các gói cần chặn theo nhiều tiêu chí, ví dụ: giao thức, địa chỉ IP, mặt nạ mạng, cổng và nhiều tiêu chí khác.

Lệnh sẽ trông như thế này, cho phép bạn thêm quy tắc iptables để chặn tất cả các gói đến từ 10.10.10.10:

sudo iptables -A INPUT -s 10.10.10.10 -j THẢ

Và bây giờ các gói gửi đi đến cùng một địa chỉ:

Việc chặn dải IP được thực hiện theo cách tương tự. Để thực hiện việc này, bạn cần sử dụng mặt nạ mạng 10.10.10.0/24. Đây sẽ là tất cả các địa chỉ bắt đầu từ 10.10.10.0 đến 10.10.10.255:

sudo iptables -A INPUT -s 10.10.10.0/24 -j DROP

Hoặc một phiên bản mở rộng của mặt nạ:

sudo iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j THẢ

Bạn cũng có thể chặn tất cả các kết nối ssh đến:

sudo iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

Như bạn có thể thấy, việc thêm quy tắc iptables rất đơn giản.

Xóa quy tắc

Việc xóa các quy tắc iptables được thực hiện tương tự như cách tạo quy tắc mới, chỉ thay vì tùy chọn A, bạn cần sử dụng tùy chọn D. Trước tiên, hãy xem danh sách các quy tắc:

Ví dụ: đây là cách bạn có thể xóa quy tắc iptables được tạo lần thứ hai:

sudo iptables -A OUTPUT -s 10.10.10.10 -j THẢ

Bạn cũng có thể xóa hoàn toàn iptables bằng cách chạy lệnh với tùy chọn -F:

Nhiều lần tôi nhận thấy rằng ngay cả những người thông minh nói chung cũng hoàn toàn những lỗi lầm không thể tha thứ. Ví dụ: họ mở cổng mà cơ sở dữ liệu chạy trên toàn bộ Internet. Điều này thường xảy ra với những người mới bắt đầu DevOps, những người đã viết mã cả đời và giờ đây trách nhiệm của họ cũng bao gồm cả việc thiết lập máy chủ. Có những hướng dẫn hữu ích trên Internet về cách thiết lập tường lửa cơ bản trong Linux và *nix khác, nhưng thường đây là những trang tính trên nhiều màn hình. Vì vậy, tôi hy vọng hướng dẫn ngắn gọn hơn này sẽ hữu ích cho ai đó.

Quan trọng! Rất dễ nhầm tưởng tường lửa của một máy đến mức bạn không thể truy cập được nữa. Đặc biệt nó liên quan Đám mây lưu trữ. Ví dụ: nếu trong AWS bạn đóng tất cả các cổng từ 1024 đến 65536, vì lý do nào đó, máy sẽ bị đóng sau khi khởi động lại mọi thứ nói chung cổng. Nếu bạn được lưu trữ trên đám mây, hãy định cấu hình tường lửa tốt hơn thông qua giao diện web do hosting cung cấp.

Một lưu ý nhỏ về thuật ngữ. Tường lửa được tích hợp trong nhân Linux được gọi là Netfilter và iptables là một tiện ích để quản lý tường lửa này. Nhiều người lầm tưởng tường lửa có tên là iptables. Cái này sai. Bằng cách nói điều gì đó như “Tôi lọc các gói bằng iptables”, bạn đang cho người khác thấy sự thiếu hiểu biết của mình.

Nói chung, loại vấn đề nào có thể được giải quyết bằng Netfilter:

  • Cho phép/từ chối lưu lượng truy cập đến cổng cụ thể thông qua các giao thức cụ thể (IPv4/IPv6, TCP/UDP) từ các địa chỉ được chỉ định (IP, MAC) hoặc mạng con;
  • Mọi thứ đều giống nhau đối với lưu lượng truy cập đi;
  • Ví dụ: bạn có thể bỏ qua hoàn toàn tất cả các gói ICMP;
  • Thiết lập NAT, xem bài viết về bộ định tuyến dựa trên Raspberry Pi;
  • Tôi nghe nói rằng những chuyên gia thực sự biết cách thiết lập biện pháp bảo vệ chống lại DDoS và bạo lực cũng như hạn chế quyền truy cập vào mạng ứng dụng cụ thể, người dùng hoặc nhóm và làm những điều điên rồ khác;

Tôi sẽ lưu ý rằng cá nhân tôi lúc đầu, tiện ích iptables có vẻ cực kỳ bất tiện so với ipfw trong FreeBSD. May mắn thay, sau khi làm việc với nó một thời gian, tất cả các cờ như -A, -D, -j và những cờ khác đều trở nên quen thuộc, vì vậy hãy kiên nhẫn. Hãy xem xét các lệnh cơ bản.

Hiển thị tất cả các quy tắc:

iptables -L -n

Bạn có thể nhận thấy rằng Netfilter có một số “chuỗi” - ít nhất là INPUT, OUTPUT và FORWARD. Cá nhân tôi cũng có chuỗi DOCKER trên máy của mình. Lần đầu tiên, bạn có thể coi hai cái đầu tiên tương ứng là tất cả lưu lượng truy cập đến và đi và tạm thời quên đi phần còn lại. Rất có thể bạn sẽ không bao giờ cần chúng nữa.

Xóa tất cả các quy tắc:

iptables -F

Thay đổi chính sách (hành vi mặc định) của chuỗi:

iptables -P ĐẦU VÀO THẢ
iptables -P CHẤP NHẬN ĐẦU VÀO

Từ chối quyền truy cập từ máy chủ/mạng con:

iptables -A INPUT -s 123.45.67.89 -j THẢ
iptables -A INPUT -s 123.45.0.0/ 16 -j THẢ

Bạn cũng có thể sử dụng tên miền:

iptables -A INPUT -s example.ru -j DROP

Cấm kết nối đi:

iptables -A ĐẦU RA -d 123.45.67.89 -j THẢ

Bạn có thể sử dụng phủ định trong các quy tắc:

iptables -A ĐẦU VÀO! -s 123,45,67,89 -j THẢ

Xóa quy tắc theo số của nó trong chuỗi:

iptables -D ĐẦU VÀO 1

Xóa quy tắc dựa trên chức năng của nó:

iptables -D INPUT -s 123.45.67.89 -j THẢ

Tùy chọn -p chỉ định giao thức. Bạn có thể sử dụng tất cả, icmp, tcp, udp hoặc số giao thức từ /etc/protocols. Lá cờ - -sport cho biết cổng mà gói được gửi và - -dport chỉ định cổng đích:

iptables -A INPUT -p tcp --sport 80 -j CHẤP NHẬN
iptables -A INPUT -p tcp --dport 80 -j CHẤP NHẬN

Chèn quy tắc vào đầu chuỗi:

iptables -TÔI NHẬP ...

Hoặc bạn có thể chỉ định một vị trí cụ thể:

iptables -I NHẬP 3 ...

iptables-save > /etc/ iptables.rules

Khôi phục quy tắc:

iptables-khôi phục< / etc/ iptables.rules

Bây giờ chúng ta hãy xem xét một số ví dụ thực tế. Ví dụ: đây là giao diện của mô phỏng netsplit trong thử nghiệm kiểm tra hành vi của một ứng dụng sử dụng Cụm Akka:

chạy (nút1, s "iptables -A INPUT -s $node2 -j THẢ")
chạy (nút1, s "iptables -A INPUT -s $node3 -j THẢ")
chạy (nút1, s "iptables -A ĐẦU RA -d $node2 -j THẢ")
chạy (nút1, s "iptables -A ĐẦU RA -d $node3 -j THẢ")

Quá trình khôi phục diễn ra theo cách tương tự, chỉ có cờ -A được thay thế bằng cờ -D.

Một vi dụ khac. Bạn cần tìm hiểu cổng nào đang nghe trên máy và đóng những cổng không cần thiết. Chúng tôi lên xe và nói:

netstat -tuwpln

Đầu ra ví dụ:

Kết nối Internet đang hoạt động (chỉ máy chủ)
Proto Recv-Q Send-Q Địa chỉ cục bộ Địa chỉ nước ngoài Bang Tên PID/Prog
tcp 0 0 0.0.0.0:80 0.0.0.0:* LẮNG NGHE 3210/nginx
tcp 0 0 0.0.0.0:4369 0.0.0.0:* NGHE 1789/epmd
tcp 0 0 0.0.0.0:22 0.0.0.0:* NGHE 797/sshd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* NGHE 990/postgres

Nginx và SSHd nhìn vào Internet, điều này là bình thường. PostgreSQL chỉ lắng nghe giao diện cục bộ nên cũng không có vấn đề gì với điều đó. Nhưng epmd nhô ra (bạn có thể kiểm tra nó bằng telnet từ một máy khác) và điều này không tốt. Bạn chỉ có thể đóng cổng 4369. Cách thực hiện việc này đã được trình bày ở trên. Hoặc bạn có thể tiến xa hơn nữa và từ chối tất cả các kết nối từ bên ngoài đến cổng 81 trở lên.

Tường lửa đáng tin cậy là một trong những những khía cạnh quan trọng nhất bảo vệ bất kỳ hệ điều hành hiện đại nào. Số đông Bản phân phối Linux chứa một số công cụ tường lửa khác nhau. Hướng dẫn này dành riêng cho một trong những hướng dẫn phổ biến nhất - iptables.

Vì vậy, theo mặc định, iptables là tường lửa tiêu chuẩn có trong hầu hết các bản phân phối Linux (nftables đang được phát triển để thay thế nó). Trên thực tế, iptables là giao diện người dùngđể điều khiển hệ thống netfilter, từ đó điều khiển ngăn xếp mạng Linux. iptables so sánh từng gói đến với một bộ quy tắc đã thiết lập và sau đó quyết định phải làm gì với gói đó tiếp theo.

Cuộc thảo luận xoay quanh cách hoạt động chính xác của iptables. Bài viết này tập trung vào các ví dụ thực tế chứng minh sự sáng tạo bộ cơ bản quy tắc cho máy chủ Ubuntu 14.04.

Các lệnh iptables cơ bản

Phần này chứa các lệnh cơ bản mà bạn có thể tạo tập hợp phức tạp quy tắc và quản lý toàn bộ giao diện iptables.

Nhớ: lệnh iptables phải được chạy với quyền root. Điều này có nghĩa là bạn cần thực hiện một trong những thao tác sau:

  • đăng nhập với tư cách người dùng root;
  • sử dụng su hoặc sudo -i để mở rộng shell gốc;
  • bắt đầu tất cả các lệnh bằng sudo (cách được khuyến nghị trong Ubuntu).

TRONG hướng dẫn này Tùy chọn cuối cùng được áp dụng.

Vì vậy, trước tiên bạn cần xem danh sách các quy tắc iptables hiện tại. Để thực hiện việc này, hãy sử dụng cờ -L:

sudo iptables -L
Chuỗi INPUT (CHẤP NHẬN chính sách)


đích nguồn prot opt
Chuỗi OUTPUT (CHẤP NHẬN chính sách)
đích nguồn prot opt

Như bạn có thể thấy, danh sách chứa ba chuỗi mặc định (INPUT, OUTPUT và FORWARD), mỗi chuỗi có một chính sách mặc định được đặt (trên khoảnh khắc nàyđây là CHẤP NHẬN). Bạn cũng có thể xem tên cột. Nhưng danh sách này không bao gồm các quy tắc đó vì Ubuntu không có bộ quy tắc mặc định.

Sử dụng cờ -S, danh sách này có thể được xem ở định dạng khác phản ánh các lệnh cần thiết để kích hoạt các quy tắc và chính sách:

sudo iptables -S
-P CHẤP NHẬN ĐẦU VÀO
-P CHUYỂN TIẾP
-P CHẤP NHẬN ĐẦU RA

Để sao chép cấu hình, bạn chỉ cần nhập sudo iptables ở đầu mỗi dòng kết quả. (Tùy thuộc vào cấu hình của bạn, quy trình này có thể phức tạp hơn một chút khi kết nối từ xa; nếu các quy tắc cho phép kết nối hiện tại chưa được đặt, bạn không nên đặt chính sách DROP.)

Để đặt lại các quy tắc hiện tại (nếu có), hãy nhập:

sudo iptables -F

Một lần nữa, trên ở giai đoạn này Chính sách mặc định rất quan trọng vì nó sẽ không bị thay đổi bởi lệnh trước đó mặc dù tất cả các quy tắc sẽ bị xóa khỏi chuỗi.

Trước khi đặt lại quy tắc cho kết nối từ xa, bạn phải đảm bảo rằng chính sách CHẤP NHẬN được đặt trong chuỗi INPUT và OUTPUT. Việc này được thực hiện như thế này:

sudo iptables -P CHẤP NHẬN ĐẦU VÀO
sudo iptables -P CHẤP NHẬN ĐẦU RA
sudo iptables -F

Khi bạn đã tạo các quy tắc cho phép kết nối từ xa, bạn có thể đặt chính sách DROP. Vì vậy, hãy chuyển sang việc tạo ra các quy tắc.

Tạo quy tắc iptables

Như đã đề cập ở trên, hướng dẫn này tập trung vào làm việc với chuỗi INPUT vì nó chịu trách nhiệm về lưu lượng truy cập đến. Đầu tiên, chúng ta cần xem xét quy tắc đã được đề cập - quy tắc cho phép kết nối SSH hiện tại.

Nó trông như thế này:

sudo iptables -A INPUT -m conntrack --ctstate THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN

Tất nhiên, lúc đầu nó có vẻ cực kỳ phức tạp; Để hiểu quy tắc này, hãy tự làm quen với các thành phần của nó:

  • -MỘT ĐẦU VÀO: cờ -A thêm ( nối thêm) quy tắc đến cuối chuỗi. Phần lệnh này yêu cầu iptables thêm quy tắc vào cuối chuỗi INPUT.
  • -m conntrack: ngoài một tập hợp các chức năng cơ bản, iptables còn có một tập hợp các phần mở rộng hoặc mô-đun chịu trách nhiệm Tính năng bổ sung bức tường lửa. Phần này lệnh chỉ ra rằng người dùng cần truy cập vào các chức năng của mô-đun conntrack. Mô-đun này cho phép các lệnh quyết định phải làm gì với gói dựa trên mối quan hệ của nó với các kết nối trước đó.
  • --ctstate: một trong các lệnh có sẵn khi gọi mô-đun conntrack. Lệnh này cho phép bạn theo dõi mối quan hệ của các gói với các gói khác đã xem trước đó. Nó được đặt thành THÀNH LẬP (chấp nhận các gói là một phần của kết nối hiện có) và LIÊN QUAN (chấp nhận các gói được liên kết với kết nối đã được thiết lập). Đây là một phần của quy tắc chịu trách nhiệm về phiên SSH hiện tại.
  • jCHẤP NHẬN: Chỉ định hành động (đích) sẽ thực hiện trên gói phù hợp với quy tắc. Trong trường hợp này, iptables sẽ chấp nhận các gói đáp ứng tiêu chí trước đó.

Quy tắc này phải được đặt ngay từ đầu để đảm bảo rằng các kết nối hiện tại khớp với quy tắc, được chấp nhận và thoát khỏi chuỗi mà không đạt đến quy tắc DROP.

Bằng cách yêu cầu danh sách các quy tắc, bạn có thể thấy những thay đổi:

sudo iptables -L
Chuỗi INPUT (CHẤP NHẬN chính sách)
đích nguồn prot opt
CHẤP NHẬN tất cả -- mọi nơi mọi nơi ctstate LIÊN QUAN, THÀNH LẬP
Chuỗi Forward (chính sách CHẤP NHẬN)
đích nguồn prot opt
Chuỗi OUTPUT (CHẤP NHẬN chính sách)
đích nguồn prot opt

Đã làm quen với cú pháp cơ bản, tạo thêm một số quy tắc chấp nhận kết nối.

Chấp nhận các kết nối quan trọng khác

Trước đây, iptables đã nhận được lệnh không đặt lại tất cả các kết nối hiện tại mà còn chấp nhận tất cả các kết nối liên quan đến chúng. Bây giờ bạn cần tạo quy tắc chấp nhận các kết nối không đáp ứng tiêu chí trên.

Để lại hai cổng mở: Cổng SSH(Hướng dẫn này sử dụng cổng 22 mặc định; nếu giá trị đã chođã được thay đổi, đừng quên nhập giá trị mới); Ngoài ra, giả sử rằng trên máy tính này, máy chủ web đang chạy trên cổng 80 theo mặc định (không thêm quy tắc này nếu không phải như vậy).

Vì vậy, các dòng bạn cần sử dụng để tạo các quy tắc như vậy trông như thế này:

sudo iptables -A INPUT -p tcp --dport 22 -j CHẤP NHẬN
sudo iptables -A INPUT -p tcp --dport 80 -j CHẤP NHẬN

Như bạn có thể thấy, chúng rất giống với quy tắc đầu tiên; có lẽ họ còn có nhiều hơn thế Cấu trúc đơn giản. Tùy chọn mới:

  • Ptcp: Tùy chọn này cho phép các gói sử dụng TCP (giao thức hướng luồng được hầu hết các ứng dụng sử dụng vì nó cung cấp khả năng liên lạc đáng tin cậy) đi qua.
  • cổng: Tùy chọn này khả dụng khi sử dụng cờ -p tcp. Cô chỉ cổng đến, mà cổng gói phải khớp. Quy tắc đầu tiên cho phép các gói TCP được gửi đến cổng 22 và quy tắc thứ hai chấp nhận lưu lượng TCP được gửi đến cổng 80.

Bây giờ chúng ta cần tạo một quy tắc CHẤP NHẬN khác để đảm bảo rằng máy chủ hoạt động như mong đợi. Thông thường, các dịch vụ giao tiếp bằng cách trao đổi gói tin; Để thực hiện việc này, họ sử dụng giao diện vòng giả mạng - cái gọi là thiết bị loopback, hướng lưu lượng truy cập trở lại nguồn của nó chứ không phải đến các máy tính khác.

Nghĩa là, nếu dịch vụ 1 cần liên lạc với dịch vụ 2 để nghe các kết nối trên cổng 4555 thì dịch vụ 1 sẽ gửi gói đến cổng 4555 bằng thiết bị loopback. Hành vi này phải được cho phép vì nó một điều kiện quan trọng vận hành chính xác nhiều chương trình.

Để thực hiện việc này, hãy thêm quy tắc sau:

sudo iptables -I INPUT 1 -i lo -j CHẤP NHẬN

Nó hơi khác so với các quy tắc trước đó; hãy nhìn kỹ hơn vào nó:

  • TÔIĐẦU VÀO 1: Cờ -I yêu cầu iptables chèn quy tắc. Cờ này khác với cờ -A (chỉ đơn giản là thêm quy tắc vào cuối chuỗi); nó chỉ định chuỗi trong đó quy tắc sẽ được thêm vào và vị trí của quy tắc trong đó. TRONG trong trường hợp này, quy tắc phải được chèn vào ngay đầu chuỗi INPUT, do đó tất cả các quy tắc sẽ di chuyển một vị trí. Quy tắc này nên được đặt ở đầu chuỗi vì đây là một trong những quy tắc chính và không nên phụ thuộc vào các quy tắc khác.
  • Tôi: thành phần này Các quy tắc cho phép các gói sử dụng giao diện lo (“lo” là tên gọi khác của thiết bị loopback). Điều này có nghĩa là bất kỳ gói nào sử dụng giao diện này, phải được chấp nhận.

Để xem các quy tắc hiện tại, hãy sử dụng cờ -S, vì cờ -L không xuất ra một số thông tin (ví dụ: giao diện mà quy tắc bị ràng buộc, điều này rất quan trọng trong trường hợp quy tắc cuối cùng):

sudo iptables -S
-P CHẤP NHẬN ĐẦU VÀO
-P CHUYỂN TIẾP
-P CHẤP NHẬN ĐẦU RA
-A INPUT -i lo -j CHẤP NHẬN
-A INPUT -m conntrack --ctstate LIÊN QUAN, THÀNH LẬP -j CHẤP NHẬN
-A INPUT -p tcp -m tcp --dport 22 -j CHẤP NHẬN
-A INPUT -p tcp -m tcp --dport 80 -j CHẤP NHẬN

Tạo quy tắc DROP

Vì vậy, hiện tại, 4 quy tắc đã được tạo để chấp nhận các gói dựa trên các tiêu chí nhất định. Tuy nhiên, máy chủ hiện không chặn bất kỳ gói nào khác.

Nếu một gói đi qua chuỗi INPUT và không khớp với bất kỳ quy tắc nào trong bốn quy tắc, chính sách mặc định (ACCEPT) sẽ được thực thi, chính sách này sẽ chấp nhận gói theo cách này hay cách khác. Bây giờ nó cần phải được thay đổi.

Điều này có thể được thực hiện theo hai cách, có những khác biệt khá đáng kể.

Cách đầu tiên là chỉnh sửa chính sách mặc định của chuỗi INPUT; để làm loại này:

sudo iptables -P ĐẦU VÀO THẢ

Chính sách này sẽ giám sát và loại bỏ tất cả các gói không khớp với bất kỳ quy tắc chuỗi INPUT nào. Một hậu quả của kiểu thiết kế này là nó sẽ loại bỏ các gói ngay cả sau khi các quy tắc đã được thiết lập lại.

Tất nhiên, điều này làm tăng mức độ bảo mật của máy chủ; tuy nhiên, điều này có thể gây ra hậu quả nghiêm trọng nếu người dùng không còn cách nào khác để kết nối với máy chủ. Thông thường, các nhà cung cấp dịch vụ lưu trữ cung cấp bảng điều khiển web để kết nối với máy chủ trong trường hợp có sự cố vấn đề tương tự. Bảng điều khiển này hoạt động như một bảng điều khiển ảo kết nối cục bộ, vì vậy iptables sẽ không phản hồi nó.

Bạn có thể yêu cầu máy chủ tự động đặt lại kết nối nếu các quy tắc bị xóa. Điều này sẽ làm cho máy chủ an toàn hơn và khó truy cập hơn. Điều này cũng có nghĩa là bạn có thể chèn các quy tắc vào cuối chuỗi và tất cả các gói không mong muốn sẽ bị loại bỏ.

Một cách tiếp cận khác là thêm quy tắc vào cuối chuỗi để loại bỏ tất cả các gói không khớp, trong khi vẫn duy trì chính sách CHẤP NHẬN.

Để trả lại chính sách CHẤP NHẬN cho chuỗi INPUT, hãy nhập:

sudo iptables -P CHẤP NHẬN ĐẦU VÀO

Bây giờ bạn có thể thêm quy tắc vào cuối chuỗi này để loại bỏ tất cả các gói không khớp:

sudo iptables -A INPUT -j DROP

Trong điều kiện hoạt động bình thường, kết quả sẽ giống hệt như khi sử dụng chính sách DROP. Quy tắc này loại bỏ mọi gói đến được nó, ngăn các gói không phù hợp với quy tắc đến máy chủ.

Về cơ bản, cách tiếp cận thứ hai được sử dụng khi cần duy trì chính sách CHẤP NHẬN chấp nhận lưu lượng truy cập. Nghĩa là, ngay cả khi tất cả các quy tắc được đặt lại, người dùng vẫn có thể truy cập vào máy trên mạng. Cách tiếp cận này cho phép bạn thực hiện các hành động mặc định mà không phải thay đổi chính sách sẽ được áp dụng cho chuỗi trống.

Tất nhiên, điều này cũng có nghĩa là bất kỳ quy tắc nào cần thêm vào cuối chuỗi đều phải đến trước quy tắc đặt lại. Điều này có thể được thực hiện bằng cách tạm thời xóa quy tắc đặt lại:

sudo iptables -D INPUT -j THẢ
sudo iptables -A INPUT new_rule
sudo iptables -A INPUT -j DROP

hoặc bằng cách chèn quy tắc mới vào cuối chuỗi (nhưng trước quy tắc đặt lại), chỉ định số dòng. Để nhập quy tắc trên dòng 4, hãy nhập:

sudo iptables -I INPUT 4 new_rule

Nếu có nhiều quy tắc thì việc tính số dòng theo cách thủ công khá khó khăn; trong trường hợp này, iptables có thể đánh số dòng:

sudo iptables -L --line-numbers
Chuỗi INPUT (DROP chính sách)

1 CHẤP NHẬN tất cả -- mọi nơi mọi nơi
2 CHẤP NHẬN tất cả -- mọi nơi mọi nơi ctstate LIÊN QUAN, THÀNH LẬP
3 CHẤP NHẬN tcp -- mọi nơi mọi nơi tcp dpt:ssh
4 CHẤP NHẬN tcp -- mọi nơi mọi nơi tcp dpt:http
Chuỗi Forward (chính sách CHẤP NHẬN)
num target prot opt ​​nguồn đích
Chuỗi OUTPUT (CHẤP NHẬN chính sách)
num target prot opt ​​nguồn đích

Điều này cho phép bạn xác minh rằng quy tắc đã được nhập đúng dòng.

Lưu cài đặt iptables

Theo mặc định, tất cả các quy tắc chưa được lưu vẫn có hiệu lực cho đến khi máy chủ khởi động lại lần tiếp theo; Ngay sau khi khởi động lại, các quy tắc chưa được lưu sẽ bị mất.

Trong một số trường hợp, điều này rất hữu ích vì nó cho phép những người dùng vô tình chặn chính họ có được quyền truy cập vào máy chủ. Tuy nhiên, trong hầu hết các trường hợp, việc lưu các quy tắc và tải chúng khi máy chủ khởi động vẫn thuận tiện hơn.

Điều này có thể được thực hiện theo nhiều cách; cách đơn giản nhất là sử dụng gói iptables-persistent, có thể tải xuống từ Kho lưu trữ Ubuntu mặc định:

cập nhật sudo apt-get
sudo apt-get cài đặt iptables-kiên trì

Trong quá trình cài đặt, gói sẽ chỉ định xem các quy tắc hiện tại có cần được lưu để sử dụng trong tương lai hay không. tải xuống tự động; Nếu các quy tắc hiện tại đã được kiểm tra (cho phép kết nối SSH) và đáp ứng tất cả các yêu cầu, chúng có thể được lưu lại.

Khi cài đặt hoàn tất, nó sẽ xuất hiện dịch vụ mớiđược gọi là iptables-persistent, nó sẽ chạy khi máy chủ được khởi động lại và tiếp tục các quy tắc đã cài đặt.

Kết quả

Hướng dẫn này giúp bạn định cấu hình tường lửa theo yêu cầu của người dùng. Tất nhiên, còn có nhiều tiện ích tương tự khác và một số tiện ích trong số đó có thể dễ sử dụng hơn; tuy nhiên, iptables là một trong những công cụ tốt nhất, nếu chỉ vì nó thể hiện một số cấu trúc cơ bản của netfilter và được bao gồm trong nhiều hệ thống.

Thẻ: ,

Giới thiệu và lịch sử

Bộ lọc mạng - bức tường lửa(hay còn gọi là tường lửa, còn gọi là tường lửa, hay còn gọi là tường lửa...) đã được tích hợp sẵn trong nhân Linux kể từ phiên bản 2.4. Netfilter được điều khiển bởi tiện ích iptables(Đối với IPv6 - ip6tables). Trước bộ lọc mạng/iptablesđã từng là Ipchain, được bao gồm trong nhân Linux 2.2. Trước ipchains trong Linux đã có cái gọi là ipfw (Tường lửa IPV4), được chuyển từ BSD. Tiện ích quản lý - ipfwadm. Dự án netfilter/iptables được thành lập vào năm 1998. Tác giả là Rusty Russell (ông cũng là người dẫn dắt các phát triển trước đây). Năm 1999, Netfilter Core Team (viết tắt là coreteam) được thành lập. Tường lửa được phát triển có tên chính thức là netfilter. Vào tháng 8 năm 2003, Harald Welte trở thành người đứng đầu coreteam.

Dự án ipchainsipfwadmđã thay đổi hoạt động của ngăn xếp giao thức Nhân Linux, bởi vì trước khi xuất hiện bộ lọc mạng Không có điều khoản nào trong kiến ​​trúc hạt nhân để bổ sung thêm các mô-đun quản lý gói. iptables giữ nguyên ý chính ipfwadm- một danh sách các quy tắc bao gồm các tiêu chí và một hành động được thực hiện nếu gói đáp ứng các tiêu chí. TRONG ipchains một khái niệm mới đã được giới thiệu - khả năng tạo chuỗi quy tắc mới và chuyển gói giữa các chuỗi và trong iptables, khái niệm này đã được mở rộng thành bốn bảng (trong netfilter hiện đại - nhiều hơn bốn), phân định chuỗi quy tắc theo nhiệm vụ: lọc, NAT và sửa đổi gói. Ngoài ra, iptables đã mở rộng khả năng phát hiện trạng thái của Linux, cho phép tạo tường lửa hoạt động ở cấp phiên.

Kiến trúc Netfilter/iptables

Điều kiện tiên quyết ()

Như đã đề cập ở trên, để Netfilter hoạt động, bạn cần có kernel phiên bản 2.6 (hoặc ít nhất là 2.3.15). Ngoài ra, nếu cần, các cài đặt CONFIG_NETFILTER, CONFIG_IP_NF_IPTABLES, CONFIG_IP_NF_FILTER (bảng bộ lọc), CONFIG_IP_NF_NAT (bảng nat), CONFIG_BRIDGE_NETFILTER, cũng như nhiều cài đặt khác mô-đun bổ sung: CONFIG_IP_NF_CONNTRACK (theo dõi kết nối), CONFIG_IP_NF_FTP (mô-đun trợ giúp để theo dõi kết nối FTP), CONFIG_IP_NF_MATCH_* ( các loại bổ sung mẫu khớp gói: LIMIT, MAC, MARK, MULTIPORT, TOS, TCPMSS, STATE, UNCLEAN, OWNER), CONFIG_IP_NF_TARGET_* (các hành động bổ sung trong quy tắc: REJECT, MASQUERADE, REDIRECT, LOG, TCPMSS), CONFIG_IP_NF_COMPAT_IPCHAINS để tương thích với ipchains, CONFIG_BRIDGE_NF_EB TABLES và CONFIG_BRIDGE_EBT_* để làm việc ở chế độ cầu nối, các chế độ khác là CONFIG_IP_NF_* và CONFIG_IP6_NF_*. Việc chỉ định CONFIG_PACKET cũng rất hữu ích.

Như đã thấy, bàn tự nhiênmang thai có thể sửa đổi người nhận hoặc người gửi gói mạng. Đây là lý do tại sao gói mạng được kiểm tra nhiều lần dựa trên bảng định tuyến.

Cơ chế phát hiện trạng thái (conntrack)

Ở trên trong văn bản, khái niệm “định nghĩa trạng thái” đã được đề cập nhiều lần, nó xứng đáng có một chủ đề riêng để thảo luận, tuy nhiên tôi sẽ đề cập ngắn gọn về nó; câu hỏi này trong bài viết hiện tại. Nói chung, cơ chế xác định trạng thái (hay còn gọi là máy trạng thái, hay còn gọi là liên lạc sự phản đối theo dõi ing, hay còn gọi là theo dõi) là một phần của bộ lọc gói và cho phép bạn xác định gói thuộc về kết nối/phiên nào. Conntrack phân tích trạng thái của tất cả các gói ngoại trừ những gói được đánh dấu là NOTRACK trong bảng thô. Dựa vào trạng thái này, gói thuộc về được xác định mới kết nối (trạng thái MỚI), đã thành lập kết nối (trạng thái THÀNH LẬP), thêm vàođến một cái đã tồn tại ( CÓ LIÊN QUAN), hoặc để " đến người khác" (không thể phát hiện) kết nối (trạng thái KHÔNG HỢP LỆ). Trạng thái của gói được xác định bằng cách phân tích các tiêu đề của gói TCP được truyền. mô-đun conntrack cho phép bạn triển khai tường lửa cấp phiên (thứ năm). Để kiểm soát cơ chế này, hãy sử dụng tiện ích conntrack, cũng như tham số tiện ích iptables: -m conntrack hoặc -m trạng thái(lỗi thời). conntrack lưu trữ trạng thái của các kết nối hiện tại trong kernel. Chúng có thể được xem trong tệp /proc/net/nf_conntrack (hoặc /proc/net/ip_conntrack) .

Để ngăn những suy nghĩ trở nên hỗn độn, tôi nghĩ thông tin ngắn gọn này sẽ đủ để hiểu thêm tài liệu.

Quản lý các quy tắc lọc mạng Netfilter (sử dụng lệnh iptables)

tiện ích iptables là một giao diện để điều khiển tường lửa bộ lọc mạng. Lệnh này cho phép bạn chỉnh sửa quy tắc bảng, bảng và chuỗi. Như tôi đã nói - mọi quy tắc là một bản ghi/chuỗi chứa các gói mạng được lựa chọn và các gói phù hợp với một quy tắc nhất định. lệnh iptables Yêu cầu quyền root để hoạt động.

Nói chung, định dạng lệnh như sau:

IP có thể [-t]

Tất cả các tham số trong ngoặc vuông - không bắt buộc. Mặc định là bảng lọc, nếu bạn cần chỉ định bảng khác thì bạn nên sử dụng phím -t chỉ ra tên. Sau khi tên bảng được chỉ định để xác định hành động ( Ví dụ: chèn quy tắc hoặc thêm quy tắc vào cuối chuỗi hoặc xóa quy tắc). thiết lập các tham số lựa chọn. cho biết hành động nào sẽ được thực hiện nếu tiêu chí lựa chọn trong quy tắc khớp ( Ví dụ: chuyển gói đến một chuỗi quy tắc khác, “thả” gói, đưa ra thông báo lỗi cho nguồn...).

Dưới đây là các lệnh và tham số của tiện ích iptables:

Tham số Sự miêu tả Ví dụ
Đội
--chắp thêm (-A) Thêm quy tắc đã chỉ định vào CUỐI danh sách trong chuỗi đã chỉ định và bảng đã chỉ định. iptables -A tiêu chí Forward -j hành động
--xóa (-D) Loại bỏ (các) quy tắc được chỉ định bởi (các) số hoặc (các) quy tắc. Ví dụ đầu tiên xóa tất cả các quy tắc có số 10,12 trong tất cả các chuỗi, trong các bảng lọc, ví dụ thứ hai xóa quy tắc đã chỉ định khỏi bảng mangle trong chuỗi PREROUTING. iptables -D 10.12
iptables -t mangle -D Tiêu chí TRƯỚC -j hành động
--đổi tên chuỗi (-E) Thay đổi tên chuỗi. iptables -E OLD_CHAIN ​​​​NEW_CHAIN
--xả (-F) Xóa tất cả các quy tắc của bảng hiện tại. Đối với tất cả các gói liên quan đến các kết nối đã được thiết lập, hãy áp dụng hành động đầu cuối CHẤP NHẬN - bỏ qua iptables -F
--chèn (-I) Chèn quy tắc đã chỉ định vào vị trí được chỉ định bởi số. iptables -I TIẾN LÊN 5 tiêu chí -j hành động
--list (viết tắt -L) Xem các quy tắc hiện có (không chỉ định rõ ràng bảng - bảng lọc của tất cả các chuỗi được hiển thị). iptables -L
--chính sách (-P) Đặt chính sách mặc định cho chuỗi nhất định. iptables -t mangle -P TRƯỚC THẢ
--thay thế (-R) Thay thế quy tắc được chỉ định bởi số bằng quy tắc được chỉ định trong tiêu chí. iptables -R POSROUTING 7 | tiêu chí -j hành động
--xóa chuỗi (-X) Xóa TẤT CẢ các chuỗi được tạo thủ công (chỉ giữ lại INPUT, OUTPUT, Forward, PREROUTING và POSTROUTING tiêu chuẩn). iptables -X
--không (-Z) Đặt lại bộ đếm dữ liệu được truyền trong chuỗi. iptables -Z ĐẦU VÀO
Tùy chọn
--số (-n) Không giải quyết các địa chỉ và giao thức trong quá trình xuất.
--số dòng Chỉ định số quy tắc ở đầu ra (có thể được sử dụng kết hợp với -L). iptables -L --số dòng
--giúp đỡ (-h) chúng ta sẽ ở đâu nếu không có cô ấy?
-t bảng Chỉ định tên của bảng mà hành động cần được thực hiện. Ví dụ đặt lại bảng nat trong tất cả các chuỗi. iptables -t nat -F
--tiết (-v) Kết luận chi tiết. iptables -L -v

Tiêu chí (tham số) để chọn gói mạng của lệnh iptables

Tiêu chí lựa chọn gói tin mạngđược bí mật chia thành nhiều nhóm: Tiêu chí chung, Tiêu chí ngầm, Tiêu chí rõ ràng. có thể được sử dụng trong bất kỳ quy tắc nào, chúng không phụ thuộc vào loại giao thức và không yêu cầu tải các mô-đun mở rộng. (Tôi sẽ gọi nó là không chung chung), những tiêu chí đó được tải ngầm và trở nên khả dụng, ví dụ: khi chỉ định một tiêu chí chung --giao thức tcp|udp|icmp. Trước khi sử dụng, bạn cần kết nối mở rộng bổ sung(đây là những điều đặc biệt bổ sung cho bộ lọc mạng). Tiện ích mở rộng bổ sung được tải bằng tham số -m hoặc --cuộc thi đấu. Vì vậy, ví dụ, nếu chúng ta định sử dụng tiêu chí tình trạng, thì chúng ta phải chỉ định rõ ràng điều này trong dòng quy tắc: -m trạng tháiở bên trái của tiêu chí được sử dụng. Sự khác biệt giữa rõ ràngngầm định không chung chung Tiêu chí là những cái rõ ràng cần được tải một cách rõ ràng và những cái ngầm được tải tự động.

Có thể sử dụng ở mọi tiêu chí dấu hiệu! trước giá trị tiêu chí. Điều này có nghĩa là quy tắc này bao gồm tất cả các gói tin không tương ứng với tham số này. Ví dụ: tiêu chuẩn --giao thức ! tcp sẽ có nghĩa là tất cả các gói tin Không các giao thức TCP phải tuân theo quy tắc. Tuy nhiên phiên bản mới nhất iptables (cụ thể là 1.4.3.2 trở lên) không còn hỗ trợ cú pháp này và yêu cầu sử dụng --giao thức ! tcp, MỘT ! --giao thức tcp, đưa ra lỗi sau:

Việc sử dụng phủ định nội vị trí (`--option ! this`) không được dùng nữa mà thay vào đó là ngoại vị trí (`! --option this`).

Dưới đây được đưa ra dưới dạng bảng Các tham số lựa chọn gói thường được sử dụng:

Tham số Sự miêu tả Ví dụ
Thông số chung
--giao thức
(viết tắt -p)
Xác định giao thức. Tùy chọn tcp, udp, icmp, tất cả hoặc bất kỳ giao thức nào khác được xác định trong /etc/protocols iptables -A INPUT -p tcp
--nguồn
(-s, --src)
Địa chỉ IP của nguồn gói. Có thể được định nghĩa theo nhiều cách:
  • Máy chủ duy nhất: hosting.domain.tld hoặc địa chỉ IP: 10.10.10.3
  • Nhóm địa chỉ (mạng con): 10.10.10.3/24 hoặc 10.10.10.3/255.255.255.0

Chúng tôi đặc biệt khuyên bạn không nên sử dụng các tên miền yêu cầu truy vấn DNS để phân giải vì DNS của bộ lọc mạng có thể không hoạt động chính xác trong giai đoạn cấu hình. Ngoài ra, hãy lưu ý rằng tên chỉ được phân giải một lần - khi thêm quy tắc vào chuỗi. Sau đó, địa chỉ IP tương ứng với tên này có thể thay đổi, nhưng điều này sẽ không ảnh hưởng đến các quy tắc đã được viết sẵn (chúng sẽ vẫn giữ nguyên địa chỉ cũ). Nếu bạn chỉ định Tên miền, phân giải thành nhiều địa chỉ IP, một quy tắc riêng sẽ được thêm vào cho mỗi địa chỉ.

iptables -A INPUT -s 10.10.10.3
--điểm đến
(-d)
Địa chỉ IP của đích đến của gói. Có thể được định nghĩa theo nhiều cách (xem --source). iptables -A INPUT --destination 192.168.1.0/24
--trong giao diện
(-Tôi)
Xác định giao diện mà gói tin đến. Hữu ích cho NAT và các máy có nhiều giao diện mạng. Được sử dụng trong chuỗi INPUT, FORWARD và PREROUTING. Có thể sử dụng dấu "+", điều đó có nghĩa là việc sử dụng tất cả các giao diện bắt đầu bằng tên + (ví dụ: eth+ - tất cả các giao diện eth). iptables -t nat -A PREROUTING --in-interface eth0
--giao diện ngoài
(-o)
Xác định giao diện mà gói sẽ rời đi. Hữu ích cho NAT và các máy có nhiều giao diện mạng. Được sử dụng trong chuỗi OUTPUT, FORWARD và POSTROUTING. Có thể sử dụng dấu "+". iptables -t nat -A POSTROUTING --in-interface eth1
Tham số ngầm định (không chia sẻ)
-p proto -h hiển thị trợ giúp về các tham số ngầm định của giao thức proto. iptables -p icmp -h
--cổng nguồn
(--thể thao)
Cổng nguồn, chỉ có thể dùng cho giao thức --protocol tcp hoặc --protocol udp iptables -A INPUT --protocol tcp --source-port 25
--destination-port
(--dport)
Cổng đích, chỉ có thể áp dụng cho giao thức --protocol tcp hoặc --protemocol udp iptables -A INPUT --protocol udp --destination-port 67
Thông số rõ ràng
-m trạng thái --state(lỗi thời)
hay còn gọi là
-m conntrack --ctstate

Tình trạng kết nối. Tùy chọn có sẵn:

  • MỚI(Tất cả các gói thiết lập kết nối mới)
  • THÀNH LẬP(Tất cả các gói thuộc về kết nối được thiết lập)
  • CÓ LIÊN QUAN(Các gói không thuộc về kết nối đã thiết lập nhưng được liên kết với kết nối đó. Ví dụ: FTP trong chế độ hoạt động công dụng kết nối khác nhauđể truyền dữ liệu. Những kết nối này có liên quan.)
  • KHÔNG HỢP LỆ(Các gói không thể được xác định vì lý do này hay lý do khác. Ví dụ: lỗi ICMP không thuộc về các kết nối hiện có)
  • v.v. (chi tiết hơn trong tài liệu)
iptables -A INPUT -m state --state MỚI, THÀNH LẬPiptables -A INPUT -m conntrack --ctstate MỚI, THÀNH LẬP
-m mac --mac-nguồn bộ Địa chỉ MAC nút mạng ai đã gửi gói tin. Địa chỉ MAC phải được chỉ định ở dạng XX:XX:XX:XX:XX:XX. -m mac --mac-nguồn 00:00:00:00:00:0

Hành động trên gói

Tiêu đề này sẽ được viết lại chính xác hơn là " Hành động trên các gói phù hợp với tiêu chí lựa chọn". Vì vậy, để hoàn thành bất kỳ hành động trên gói, bạn cần chỉ định khóa -j (--nhảy) và chỉ ra những hành động cụ thể cần thực hiện.

Các hành động trên gói có thể nhận các giá trị sau:

  • CHẤP NHẬN- gói lá chuỗi này và được chuyển cho người tiếp theo (nghĩa đen - CHẤP NHẬN).
  • LÀM RƠI- loại bỏ gói thỏa mãn điều kiện, trong khi gói không được truyền đến các bảng/chuỗi khác.
  • TỪ CHỐI- loại bỏ gói bằng cách gửi tin nhắn ICMP đến người gửi, trong khi gói không được truyền đến các bảng/chuỗi khác.
  • TRỞ LẠI- đưa gói trở lại chuỗi trước đó và tiếp tục truyền nó bắt đầu từ quy tắc tiếp theo.
  • SNAT nguồn trong gói. Chỉ có thể được sử dụng trong chuỗi POSTROUTING và OUTPUT trong bảng nat.
  • DNAT- áp dụng dịch địa chỉ cuộc hẹn trong gói. Có thể được sử dụng trong một chuỗi ĐANG TRƯỚC trong bảng nat. (trong trường hợp đặc biệt - trong chuỗi OUTPUT)
  • ĐĂNG NHẬP- ghi nhật ký gói (được gửi tới daemon) và xử lý nó theo các quy tắc khác.
  • MASQUERADE- được sử dụng thay thế SNAT nếu có kết nối với IP động (chỉ có thể được chỉ định trong chuỗi ĐĂNG KÝ bảng nat).
  • ĐÁNH DẤU- được sử dụng để đặt nhãn trên các gói và chuyển sang các quy tắc xử lý tiếp theo.
  • và vân vân.

Ngoài những hành động này, còn có những hành động khác có thể được tìm thấy trong tài liệu (có lẽ tôi sẽ sớm bổ sung bài viết khi phát triển chủ đề). Một số hành động có tham số bổ sung.

Bảng dưới đây cung cấp các ví dụ và mô tả về các tham số bổ sung:

Tham số Sự miêu tả Ví dụ
DNAT (Dịch địa chỉ mạng đích)
--đến-đích chỉ định địa chỉ IP nào sẽ được thay thế làm địa chỉ đích. Trong ví dụ, trong tất cả các gói giao thức tcp đến địa chỉ 1.2.3.4, địa chỉ đã cho sẽ được thay thế bằng 4.3.2.1. iptables -t nat -A TRƯỚC -p tcp -d 1.2.3.4 -j DNAT --to-destination 4.3.2.1
ĐĂNG NHẬP
--mức đăng nhập Được sử dụng để đặt mức ghi nhật ký (). Trong ví dụ, mức ghi nhật ký tối đa được đặt cho tất cả các gói tcp trong bảng lọc của chuỗi FORWARD. iptables -A FORWARD -p tcp -j LOG --gỡ lỗi cấp độ log
--log-tiền tố Chỉ định văn bản (tiền tố) sẽ đứng trước tất cả các tin nhắn iptables. (rất thuận tiện cho việc sử dụng sau này) Tiền tố có thể chứa tối đa 29 ký tự, bao gồm cả dấu cách. Trong ví dụ, tất cả các gói tcp trong bảng bộ lọc của chuỗi INPUT có tiền tố bộ lọc INRUT được gửi tới syslog. iptables -A INPUT -p tcp -j LOG --log-tiền tố "INRUT-filter"
--log-ip-tùy chọn Cho phép bạn nhập vào thông tin khác nhau từ tiêu đề gói IP. iptables -A TIẾN LÊN -p tcp -j LOG --log-ip-options
và vân vân...

Điều này kết thúc lý thuyết về bộ lọc mạng netfilter/iptables. Ở bài viết tiếp theo tôi sẽ đưa ví dụ thực tếđể hiểu lý thuyết này.

Bản tóm tắt

Trong bài viết này, chúng tôi đã xem xét rất ngắn gọn các khái niệm cơ bản về bộ lọc mạng trong Linux. Vì vậy, hệ thống con netfilter/iptables là một phần của nhân Linux và được sử dụng để tổ chức kế hoạch khác nhau lọc và thao tác các gói mạng. Trong trường hợp này, mỗi gói đi từ giao diện mạng, trong đó anh ta đến và đi xa hơn dọc theo một tuyến đường nhất định, tùy thuộc vào việc anh ta có ý định hay không hệ thống cục bộ hoặc "không cục bộ". Mỗi chuỗi bao gồm một tập hợp các bảng chứa một bộ quy tắc tuần tự. Mỗi quy tắc bao gồm một tiêu chí/tiêu chí nhất định để chọn gói mạng và một số hành động với gói đáp ứng các tiêu chí này. Theo các quy tắc đã cho, bất kỳ hành động nào cũng có thể được thực hiện trên gói (Ví dụ: chuyển sang chuỗi tiếp theo/chuỗi khác, đặt lại gói, sửa đổi nội dung hoặc tiêu đề, v.v.). Mỗi chuỗi và mỗi bảng đều có mục đích, chức năng và vị trí riêng trong đường dẫn gói. Ví dụ: để lọc các gói, bảng bộ lọc được sử dụng, bảng này được chứa trong ba chuỗi tiêu chuẩn và có thể được chứa trong các chuỗi do người dùng chỉ định. Đường dẫn của gói kết thúc tại giao diện mạng gửi đi hoặc bằng cách gửi đến một quy trình/ứng dụng cục bộ.

Văn học

Khá nhiều thông tin thú vị bằng tiếng Nga được chứa ở đây:

  • http://www.opennet.ru/docs/RUS/iptables/
  • http://ru.wikibooks.org/wiki/Iptables

Tài liệu chuyên sâu hơn có sẵn bằng ngôn ngữ tư sản ở đây:

  • http://www.frozentux.net/documents/isysctl-tutorial/
  • http://www.netfilter.org/documentation/index.html

Trân trọng, McSim!

Nguyên tắc thiết lập

Cú pháp chung để sử dụng iptables là:

iptables -t<таблица> <команда> <цепочка>[con số]<условие> <действие>

<таблица>

quy tắc netfilter được phân phối trên 4 bảng, mỗi bảng có mục đích riêng (xem thêm chi tiết bên dưới). Nó được biểu thị bằng công tắc -t, nhưng nếu thông số này không được chỉ định, hành động sẽ được thực hiện cho bảng mặc định - bộ lọc.

<команда>

Các lệnh cho biết loại hành động chúng tôi thực hiện trên netfilter, ví dụ: tạo hoặc xóa quy tắc.

<цепочка>

Mỗi bảng có các chuỗi, trong đó các quy tắc được tạo ra cho mỗi bảng. Ví dụ: đối với bảng lọc ở trên, có ba chuỗi được xác định trước - INPUT (gói đến), OUTPUT (gói gửi đi) và FORWARD (gói chuyển tiếp).

[con số]

Một số lệnh yêu cầu chỉ định số quy tắc, chẳng hạn như để xóa hoặc chỉnh sửa.

<условие>

Một điều kiện mô tả các tiêu chí để đưa ra một quy tắc cụ thể.

<действие>

Thực ra, chúng ta phải làm gì với gói hàng nếu nó đáp ứng các tiêu chí của điều kiện?

* Công bằng mà nói, điều đáng chú ý là phím hành động không nhất thiết phải ở cuối. Chỉ là định dạng này thường được tìm thấy nhiều nhất trong hướng dẫn và làm cho các quy tắc dễ đọc hơn.

khóa iptables và ví dụ về việc sử dụng chúng

Để làm việc với bảng (iptables -t)

Hãy để tôi nhắc bạn rằng tất cả các quy tắc trong netfilter đều được phân phối trên các bảng. Để làm việc với một bảng cụ thể, bạn phải sử dụng khóa chuyển -t.

Đội

Các phím sau xác định các hành động mà tiện ích iptables thực hiện.

Chìa khóa Mô tả và ví dụ
-MỘT Thêm quy tắc vào cuối danh sách:
iptables -A INPUT -s 192.168.0.15 -j THẢ
từ chối tin nhắn đến từ 192.168.0.15.
-D Xóa một quy tắc:
iptables -D ĐẦU VÀO 10
xóa quy tắc trong chuỗi INPUT với số 10.
-TÔI Chèn quy tắc vào một phần cụ thể của danh sách:
iptables -I INPUT 5 -s 192.168.0.15 -j THẢ
chèn quy tắc thứ 5 vào danh sách.
-R Thay thế quy tắc.
iptables -R ĐẦU RA 5 -s 192.168.0.15 -j CHẤP NHẬN
thay thế quy tắc thứ 5 của chúng tôi từ cấm sang cho phép.
-F Đặt lại các quy tắc trong một chuỗi.
iptables -F ĐẦU VÀO
-Z Đặt lại số liệu thống kê.
iptables -Z ĐẦU VÀO
-N Tạo một chuỗi.
iptables -N CHUỖI MỚI
-X Xóa một chuỗi
iptables -X CHAINNEW
-P Xác định quy tắc mặc định.
iptables -P ĐẦU VÀO THẢ
-E Đổi tên một chuỗi.
iptables -E CHAINNEW CHAINOLD

Điều kiện

Các phím này xác định các điều kiện của quy tắc.

Chìa khóa Mô tả và ví dụ
-P Giao thức mạng. Các tùy chọn hợp lệ là TCP, UDP, ICMP hoặc ALL.
iptables -A INPUT -p tcp -j CHẤP NHẬN
cho phép tất cả các kết nối tcp đến.
-S Địa chỉ nguồn - tên máy chủ, địa chỉ IP hoặc mạng con theo ký hiệu CIDR.
iptables -A INPUT -s 192.168.0.50 -j THẢ
từ chối tin nhắn đến từ nút 192.168.0.50
-d Địa chỉ đích. Nguyên tắc sử dụng tương tự như phím -s trước đó.
iptables -A ĐẦU RA -d 192.168.0.50 -j THẢ
từ chối gửi đi tới nút 192.168.0.50
-Tôi Bộ điều hợp mạng, thông qua đó các gói đến (INPUT).
iptables -A INPUT -i eth2 -j DROP
vô hiệu hóa lưu lượng truy cập đến cho giao diện Ethernet eth2.
-o Bộ điều hợp mạng mà các gói được gửi từ đó (OUTPUT).
iptables -A ĐẦU RA -o eth3 -j CHẤP NHẬN
Cho phép tin nhắn gửi đi từ giao diện Ethernet eth3.
--dport Cảng đến.
iptables -A INPUT -p tcp --dport 80 -j CHẤP NHẬN
Cho phép cuộc gọi đến trên cổng 80.
--thể thao Cổng nguồn.
iptables -A INPUT -p tcp --sport 1023 -j DROP
cấm tin nhắn đến từ cổng 1023.

Các phím được liệt kê cũng hỗ trợ xây dựng bằng cách sử dụng dấu hiệu ! . Nó đảo ngược điều kiện, ví dụ,
iptables -A INPUT -s ! 192.168.0.50 -j THẢ
sẽ từ chối kết nối tới tất cả các máy chủ ngoại trừ 192.168.0.50.

hành động

Các hành động sẽ được thực hiện trên gói phù hợp với tiêu chí của điều kiện. Mỗi bảng có tập hợp các hành động được phép riêng. Được chỉ định bằng phím -j.

Bàn Hoạt động Sự miêu tả
lọc CHẤP NHẬN Cho phép gói.
LÀM RƠI Từ chối gói.
TỪ CHỐI Cấm gửi tin nhắn đến nguồn.
tự nhiên MASQUERADE Đối với các gói gửi đi, thay thế địa chỉ IP nguồn bằng địa chỉ của giao diện mà gói sẽ rời đi.
SNAT Tương tự như MASQUERADE, nhưng chỉ ra một giao diện mạng cụ thể có địa chỉ sẽ được sử dụng để giả mạo.
DNAT Thay thế địa chỉ cho các gói đến.
CHUYỂN HƯỚNG Chuyển hướng yêu cầu đến một cổng khác trên cùng hệ thống.
mang thai T.O.S. Sửa đổi trường TOS (ưu tiên lưu lượng truy cập).
DSCP Thay đổi DSCP (cũng ưu tiên lưu lượng truy cập).
TTL Thay đổi TTL (tuổi thọ gói).
H.L. Tương tự như TTL, nhưng dành cho IPv6.
ĐÁNH DẤU Đánh dấu gói. Được sử dụng để lọc hoặc tạo hình tiếp theo.
KẾT NỐI Đánh dấu kết nối.
TCPMSS Thay đổi giá trị MTU.

Ví dụ về các lệnh iptables thường được sử dụng

Lệnh chung

Xem quy tắc với số của họ:

iptables -L --số dòng

Đối với mỗi bảng, bạn cần xem xét các quy tắc riêng biệt:

iptables -t nat -L --line-numbers

Xóa tất cả các quy tắc:

Đặt quy tắc mặc định:

iptables -P ĐẦU VÀO THẢ

iptables -P ĐẦU RA THẢ

* trong các ví dụ này, theo mặc định, quy tắc từ chối (DROP) sẽ hoạt động đối với tất cả các gói đến (INPUT) và gửi đi (OUTPUT).

Chấp nhận tất cả

Cách 1: Bằng cách thêm quy tắc:

iptables -I NHẬP 1 -j CHẤP NHẬN

iptables -I ĐẦU RA 1 -j CHẤP NHẬN

iptables -I TIẾN LÊN 1 -j CHẤP NHẬN

* Ba lệnh này sẽ tạo ra các quy tắc cho phép tất cả các gói đến, đi và chuyển tuyến.

Cách 2. Làm sạch quy tắc:

* ở đây trước tiên chúng tôi xóa tất cả các quy tắc (-F), sau đó đặt chính sách mặc định để cho phép đến, đi và chuyển tiếp (-S).

Phương pháp 3. Vô hiệu hóa dịch vụ (tiện lợi khi tắt tạm thời tường lửa để chẩn đoán sự cố):

dừng dịch vụ iptables

Làm việc với các quy tắc

Thêm quy tắc vào cuối danh sách:

iptables -A INPUT -p tcp --dport 25 -j CHẤP NHẬN

iptables -A INPUT -p tcp -s ! 192.168.0.25 --dport 993 -i eth0 -j CHẤP NHẬN

Thêm phạm vi cổng:

iptables -A INPUT -p tcp --dport 3000:4000 -j CHẤP NHẬN

* trong trường hợp này, từ 3000 đến 4000.

Chèn quy tắc:

iptables -I TIẾN LÊN 15 -p udp -d 8.8.8.8 --dport 53 -i eth1 -j CHẤP NHẬN

Chặn một địa chỉ IP cụ thể để kết nối trên cổng 25:

iptables -I INPUT 1 -s 1.1.1.1 -p tcp --dport 25 -j DROP

Cổng chuyển tiếp

Có hai phương pháp cấu hình.

1. Quy tắc PREROUTING + POSTROUTING:

iptables -t nat -A TRƯỚC -p tcp -m tcp -d 19.8.232.80 --dport 22 -j DNAT --to-destination 192.168.1.15:2222

iptables -t nat -A POSTROUTING -p tcp -m tcp -s 192.168.1.15 --sport 2222 -j SNAT --to-source 19.8.232.80:22

* Ở đâu 19.8.232.80 — địa chỉ mà chúng tôi lắng nghe các yêu cầu kết nối; 22 - cổng chuyển tiếp; 192.168.1.15 — địa chỉ IP nội bộ mà chúng tôi chuyển tất cả các yêu cầu đến; 2222 - cổng nội bộ.

2. Quy tắc TRƯỚC + CHUYỂN TIẾP:

iptables -t nat -A TRƯỚC -p tcp -i eth1 --dport 22 -j DNAT --to-destination 192.168.1.15:2222

iptables -A Forward -p tcp -d 192.168.1.15 --dport 22 -m state --state MỚI, THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN