Iptables: bảo mật mạng và lọc gói

Vì vậy, hôm nay chúng ta sẽ tìm hiểu IPTables này là loại quái thú gì và làm thế nào để chiến đấu, đánh bại và kiềm chế nó? :)

IPTables - tiện ích dòng lệnh, là giao diện chuẩn để quản lý hoạt động của tường lửa NETFilter (tường lửa hoặc tường lửa) cho nhân Linux bắt đầu từ phiên bản 2.4. Cần có đặc quyền superuser (root) để sử dụng tiện ích IPTables.

Đôi khi từ IPTables đề cập đến chính tường lửa NETFilter. Với sự trợ giúp của nó, bạn có thể quản lý khá linh hoạt (trong trường hợp này là việc xử lý các gói đến hoặc đi từ chúng tôi).

Ví dụ: bạn có thể từ chối một máy tính truy cập Internet, cho phép máy tính khác chỉ truy cập các trang web, “chuyển tiếp” (gán) một cổng được xác định trước cho máy tính thứ ba và gửi lại các gói “đáng ngờ” cho người gửi (để nó tự ngắt). Bạn có thể thay thế thông tin dịch vụ của các gói IP một cách “nhanh chóng” (người gửi, người nhận, TTL, v.v.) và nhiều thông tin khác mà bạn chưa nghĩ tới ngay.

Điều bạn nên biết về tường lửa, đối với người mới bắt đầu, là chúng được thiết kế để bảo vệ, vì vậy bạn cần nhớ kỹ rằng quy tắc cuối cùng ( chính sách) nên "cấm phần còn lại". Thứ hai, nhưng không kém phần quan trọng, hãy luôn chỉnh sửa các quy tắc hoặc Telnet một cách cẩn thận.

Những trường hợp quy tắc được cấu hình từ xa và sau khi áp dụng quy tắc, quản trị viên thiếu chú ý nhận thấy mình bị “cắt” khỏi máy chủ không hề bị cô lập! Và thật tốt nếu máy chủ cách đó hai bước, nhưng nếu nó ở đâu đó ở vương quốc xa xôi thì sao?


Tường lửa hoạt động như thế nào

Khi một gói đến tường lửa của chúng tôi, trước tiên nó sẽ đến , bị chặn bởi trình điều khiển thích hợp và sau đó được truyền đến kernel. Tiếp theo, gói đi qua một số bảng và sau đó được chuyển đến ứng dụng cục bộ hoặc được chuyển tiếp đến máy khác.

Thứ tự đóng gói được thể hiện trong bảng dưới đây:

Bước chân Bàn Xích Ghi chú
1 Cáp (tức là Internet)
2 Giao diện mạng (ví dụ eth0)
3 mang thai ĐANG TRƯỚC Thông thường, chuỗi này được sử dụng để thực hiện các thay đổi đối với tiêu đề gói, chẳng hạn như thay đổi các bit TOS, v.v.
4 tự nhiên ĐANG TRƯỚC Chuỗi này được sử dụng để dịch địa chỉ mạng đích. Dịch địa chỉ mạng nguồn được thực hiện sau, trong một chuỗi khác. Bất kỳ loại lọc nào trong chuỗi này chỉ có thể được thực hiện trong những trường hợp đặc biệt
5 Quyết định định tuyến tiếp theo, tức là. tại thời điểm này, gói sẽ được quyết định đi đâu - đến ứng dụng cục bộ hoặc tới nút mạng khác.
6 mang thai PHÍA TRƯỚC Sau đó, gói sẽ đi vào chuỗi FORWARD của bảng mangle, chỉ nên sử dụng chuỗi này trong những trường hợp đặc biệt khi cần thực hiện một số thay đổi đối với tiêu đề gói giữa hai điểm quyết định định tuyến.
7 Lọc PHÍA TRƯỚC Chỉ những gói đi đến máy chủ khác mới được tham gia chuỗi FORWARD. Tất cả việc lọc lưu lượng chuyển tiếp phải được thực hiện tại đây. Đừng quên rằng lưu lượng truy cập chảy qua chuỗi này theo cả hai hướng. Hãy chắc chắn tính đến trường hợp này khi viết quy tắc lọc.
8 mang thai ĐĂNG KÝ Chuỗi này nhằm mục đích thực hiện các thay đổi đối với tiêu đề gói sau khi quyết định định tuyến cuối cùng được đưa ra.
9 tự nhiên ĐĂNG KÝ Chuỗi này chủ yếu dành cho Dịch địa chỉ mạng nguồn. Không sử dụng nó để lọc trừ khi thực sự cần thiết. Việc hóa trang cũng được thực hiện ở đây.
10 Giao diện mạng đầu ra (ví dụ: eth1)
11 Cáp (hãy để nó là mạng LAN)

Như bạn có thể thấy, gói tin sẽ trải qua nhiều giai đoạn trước khi được truyền đi xa hơn. Ở mỗi giai đoạn, gói có thể bị dừng, có thể là do chuỗi iptables hoặc thứ gì khác, nhưng chúng tôi chủ yếu quan tâm đến iptables.

Lưu ý rằng không có chuỗi giao diện cụ thể hoặc bất cứ thứ gì tương tự. TẤT CẢ các gói di chuyển qua bộ định tuyến tường lửa của chúng tôi đều đi qua chuỗi FORWARD. Đừng sử dụng chuỗi INPUT để lọc các gói chuyển tuyến; đơn giản là chúng không đến được đó. Chỉ có dữ liệu dành cho cùng một máy chủ mới di chuyển qua chuỗi này.


quy tắc iptables

Hãy để tôi đưa ra ví dụ về một phần cấu hình bộ định tuyến của tôi: vlan332 là giao diện để tôi truy cập Internet, vlan333 là quyền truy cập vào mạng cục bộ của nhà cung cấp và 172.30.2.5 là máy tính của tôi.

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE

#Torrent
iptables -A TRƯỚC -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

#Mở cổng
iptables -A INPUT -p tcp --dport 53 -j CHẤP NHẬN #DNS TCP
iptables -A INPUT -p udp --dport 53 -j CHẤP NHẬN #DNS UDP
iptables -A INPUT -p tcp --dport 80 -j CHẤP NHẬN #máy chủ WEB

#Tất cả các “thả” đến khác (xóa)
iptables -A INPUT -i vlan332 -j THẢ

Vậy tất cả những điều này có ý nghĩa gì? Trước hết, để dễ đọc, tôi chia cấu hình thành các “phần” kèm theo chú thích, tức là. trong một phần có các quy tắc cho NAT, trong phần khác - chuyển tiếp cổng (PAT), trong phần thứ ba - chúng tôi cho phép các cổng máy chủ, v.v.

Hãy xem xét quy tắc thứ nhất và thứ hai (chúng chỉ khác nhau về giao diện mạng):

iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE

Dựa vào đó, chúng tôi thêm một quy tắc mới vào bảng nat (-t nat) cho chuỗi định tuyến sau (-A POSTROUTING), quy tắc này sẽ là quy tắc cuối cùng tại thời điểm lệnh được thực thi trong chuỗi (tức là đến cuối) . Rule sẽ được áp dụng trên giao diện gửi đi vlan332 (-o vlan332) và sẽ được chuyển tới MASQUERADE (-j MASQUERADE) những NAT đó.

Theo thuật ngữ của con người, mọi thứ thoát ra khỏi giao diện vlan332 phải được ẩn đằng sau NAT. Điều này có nghĩa là khi rời khỏi bộ định tuyến của chúng ta, địa chỉ người gửi sẽ là máy chủ của chúng ta chứ không phải máy tính của người dùng cuối nơi yêu cầu được gửi đi. phản hồi đến theo yêu cầu, quy trình ngược lại sẽ được thực hiện và gói sẽ được chuyển đến người gửi ban đầu. Tại sao điều này lại cần thiết sẽ được mô tả chi tiết trong bài viết về NAT.

Hãy chuyển sang nhóm quy tắc tiếp theo, cụ thể là phần được đánh dấu là "torrent". Phần này chỉ định các quy tắc chuyển tiếp cổng (PAT - Dịch địa chỉ cổng), tức là. để từ phía Internet, bạn có thể kết nối với cổng trên máy tính phía sau bộ định tuyến của chúng tôi. Nếu không có điều này, nhiều ứng dụng sẽ không thể hoạt động chính xác, chẳng hạn như mạng chia sẻ tệp torrent, DC++ và một số ứng dụng yêu cầu kết nối đến từ Internet. Hãy xem quy tắc bằng ví dụ về chuyển tiếp (gán) cổng cho máy khách Torrent

iptables -A TRƯỚC -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

Như trong quy tắc trước, chúng tôi chỉ định bảng và chuỗi (-A PREROUTING -t nat), chỉ định loại giao thức hợp lệ. Trong quy tắc TCP hiện tại (-p tcp) (trong một quy tắc UDP khác, mặc dù chúng có thể được chỉ định trong một quy tắc, thật không may, điều này không hiệu quả với tôi ngay cả với tài liệu chính thức và tôi vẫn chưa tìm ra giải pháp).

Cổng đích 9000 (--dport 9000), giao diện đến vlan332. Sử dụng hành động DNAT (-j DNAT), chúng tôi chỉ ra rằng chúng tôi cần thay thế địa chỉ người nhận bằng 172.30.2.5 (--to 172.30.2.5), tức là. - máy tính của chúng tôi. Hóa ra: chuyển hướng tất cả các kết nối đến qua TCP sang cổng 9000 sang IP 172.30.2.5.

iptables -A INPUT -p tcp --dport 53 -j CHẤP NHẬN #DNS TCP

Chúng tôi chỉ ra chuỗi INPUT, giao thức TCP, số cổng 53 (được sử dụng cho dịch vụ DNS) và hành động - cho phép. Bạn có thể nhận thấy rằng UDP được sử dụng cho các truy vấn DNS và điều này đúng. TCP được sử dụng để truyền thông tin về các vùng (miền) và vì máy chủ của tôi là máy chủ chính cho một số vùng nên tôi đã cho phép truy cập qua TCP.

Quy tắc cuối cùng, như tôi đã nói ở trên, là cấm mọi thứ khác không nằm trong bộ lọc. tôi đã viết iptables -A INPUT -i vlan332 -j THẢ những thứ kia. Xóa tất cả các gói tin đến giao diện vlan332.

Vì tường lửa này không có cấu hình cố định nên các quy tắc phải được nhập thủ công khi khởi động lại. Đây không phải là vấn đề, vì có các tập lệnh shell (tương tự như các tệp bat và cmd trong Windows) và khi được thực thi, chúng sẽ chạy các lệnh được viết trong đó.

Để thực hiện việc này, hãy tạo một tệp trong thư mục etc có tên tường lửa.sh bằng lệnh nano /etc/firewall.sh, tức là. Hãy mở nó ngay trong trình chỉnh sửa. Hãy nhập tất cả các quy tắc chúng ta cần vào đó và lưu nó bằng cách nhấn Ctrl+X.

Dưới đây là một số quy tắc cấu hình hoạt động có thể hữu ích cho bạn trong sử dụng hàng ngày. Dòng đầu tiên (#!/bin/sh) là bắt buộc vì nó chỉ định cách diễn giải các hướng dẫn này.

#!/bin/sh
PATH=/usr/sbin:/sbin:/bin:/usr/bin

# Xóa tất cả các quy tắc hiện có khỏi tất cả các bảng và chuỗi
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Cho phép mọi lưu lượng truy cập
iptables -A INPUT -i lo -j CHẤP NHẬN#Loopback
iptables -A INPUT -i eth0 -j CHẤP NHẬN#Giao diện nội bộ với mạng LAN
iptables -A INPUT -i eth2 -j CHẤP NHẬN#Giao diện nội bộ với LAN 2

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE#Enable NAT truy cập Internet
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE#Enable NAT đối với nhà cung cấp (mạng của nhà cung cấp)

#CỔNG CHUYỂN TIẾP
#Torrent
iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5#Chuyển tiếp cổng tới IP
iptables -A TRƯỚC -t nat -p udp --dport 9000 -i vlan332 -j DNAT --to 172.30.2.5

Kết nối #VPN, cho phép kết nối qua PPP, v.v.
iptables -A INPUT -p tcp -m tcp --dport 1723 -j CHẤP NHẬN
iptables -A INPUT -p gre -m state --state LIÊN QUAN, THÀNH LẬP -j CHẤP NHẬN

#Mở cổng máy chủ
iptables -A INPUT -p tcp --dport 23 -j CHẤP NHẬN #Cho phép truy cập qua SSH

#Xóa mọi thứ đang đến ("thả" - loại bỏ)
iptables -A INPUT -i vlan332 -j THẢ

# Cho phép chuyển tiếp; không có điều này, việc định tuyến gói sẽ không xảy ra
echo 1 > /proc/sys/net/ipv4/ip_forward

Sau đó, chúng tôi làm cho tệp có thể thực thi được, tức là:
chmod +x /etс/firewall.sh(hành hình).

Để tệp này được xử lý tự động khi tải, chúng tôi sẽ ghi đường dẫn đến tệp đó vào tệp “tự động tải”. Mở nano /etс/rc.local và thêm dòng /etс/firewall.sh trước exit 0. Nếu bạn cần sử dụng Vlan (mạng và giao diện ảo), thì bạn cần ghi dòng này vào tệp /etс/network/ các giao diện ở dạng sh /etс /firewall.sh lên giao diện vlan, ví dụ:

# Vlan sang INET
tự động vlan332
iface vlan332 inet tĩnh
địa chỉ xxx.xxx.xxx.xxx
mặt nạ mạng 255.255.255.252
# cổng xxx.xxx.xxx.xxx
vlan_raw_device eth1
lên sh /etс/firewall.sh

Điều này là cần thiết vì quá trình “tự động tải” sẽ diễn ra trước tiên và chỉ sau một thời gian, các giao diện Vlan của chúng ta mới xuất hiện và nếu không có giao diện thì quy tắc sẽ không được tạo.

Thật không may, tôi không có cơ hội mô tả đầy đủ hoạt động của bức tường lửa tuyệt vời này, nhưng có tài liệu tuyệt vời về nó bằng tiếng Nga (bản dịch hướng dẫn sử dụng ban đầu dành cho nhà phát triển), đây là địa chỉ của nó.

Sẽ không quá khó khăn, sau khi đọc dù chỉ một phần của nó hoặc đặt ra một tác vụ cụ thể, để giải quyết hầu hết các vấn đề liên quan đến tường lửa này và tự viết các quy tắc.

Xin chào tất cả mọi người! Để tiếp tục, tôi xuất bản bài viết thực tế này về Bộ lọc mạng Linux. Trong bài viết tôi sẽ xem xét ví dụ điển hình về việc thực hiện các quy tắc iptables trong Linux và cũng xem xét các cách lưu cấu hình iptables đã tạo.

Thiết lập netfilter/iptables cho máy trạm

Hãy bắt đầu với một nhiệm vụ cơ bản - triển khai tường lửa Linux trên máy tính để bàn. Trong hầu hết các trường hợp, trên các bản phân phối Linux dành cho máy tính để bàn, không có nhu cầu cấp thiết phải sử dụng tường lửa, bởi vì Các bản phân phối như vậy không chạy bất kỳ dịch vụ nào nghe cổng mạng, nhưng vì mục đích phòng ngừa, việc tổ chức bảo vệ sẽ không thừa. Vì lõi cũng không tránh khỏi lỗ hổng. Vì vậy, chúng tôi có Linux, với eth0, bất kể thông qua DHCP hay tĩnh...

Đối với cài đặt bức tường lửa Tôi cố gắng tuân thủ chính sách sau: cấm mọi thứ và sau đó là những gì cần được cho phép. Đó là những gì chúng ta sẽ làm trong trường hợp này. Nếu bạn có một hệ thống mới được cài đặt và bạn chưa thử định cấu hình bộ lọc mạng trên đó thì các quy tắc sẽ giống như thế này:

Netfilter:~# iptables -L Chain INPUT (chính sách CHẤP NHẬN) đích prot opt ​​nguồn đích Chain FORWARD (chính sách CHẤP NHẬN) đích prot opt ​​nguồn đích Chuỗi OUTPUT (chính sách ACCEPT) đích prot opt ​​nguồn đích

Điều này có nghĩa là chính sách mặc định cho bảng lọc trong tất cả các chuỗi - CHẤP NHẬN và không có quy tắc nào khác cấm bất cứ điều gì. Vì vậy trước tiên chúng ta hãy cấm MỌI THỨ, kể cả các gói(thậm chí đừng cố thực hiện việc này từ xa, bạn sẽ mất quyền truy cập ngay lập tức):

Netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -P Forward DROP

Với các lệnh này, chúng tôi cài đặt LÀM RƠI mặc định. Điều này có nghĩa là bất kỳ gói nào không có quy tắc cho phép rõ ràng sẽ tự động bị loại bỏ. Vì chúng tôi chưa đặt ra một quy tắc nào nên tất cả các gói đến máy tính của bạn sẽ bị từ chối, cũng như những gói mà bạn cố gắng gửi tới mạng. Để minh họa, bạn có thể thử ping máy tính của mình thông qua giao diện loopback:

Netfilter:~# ping -c2 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) byte dữ liệu. ping: sendmsg: Thao tác không được phép ping: sendmsg: Thao tác không được phép --- thống kê ping localhost --- 2 gói được truyền, 0 gói đã nhận, mất gói 100%, thời gian 1004ms

Trên thực tế, đây là một mạng hoàn toàn không hoạt động và điều này không tốt lắm, bởi vì... Một số daemon sử dụng giao diện loopback để liên lạc với nhau, giao diện này không còn hoạt động sau khi thực hiện các hành động. Điều này có thể làm gián đoạn hoạt động của các dịch vụ đó. Vì vậy, trước hết cần phải hãy cho phép các gói được truyền qua giao diện loopback đến và giao diện loopback đi trong bảng INPUT(để có thể nhận các gói đã gửi) và ĐẦU RA(về khả năng gửi gói) cho phù hợp. Vì vậy, hãy chắc chắn thực hiện:

Netfilter:~# iptables -A INPUT -i lo -j CHẤP NHẬN bộ lọc mạng:~# iptables -A OUTPUT -o lo -j CHẤP NHẬN

Sau này, ping tới localhost sẽ hoạt động:

Netfilter:~# ping -c1 127.0.0.1 PING 127.0.0.1 (127.0.0.1) 56(84) byte dữ liệu. 64 byte từ 127.0.0.1 (127.0.0.1): icmp_seq=1 ttl=64 time=0,116 ms --- 127.0.0.1 thống kê ping --- 1 gói được truyền, 1 gói đã nhận, mất gói 0%, thời gian 116 ms rtt phút/ trung bình/max/mdev = 0,116/0,116/0,116/0,116 ms

Nếu bạn không quá cuồng nhiệt trong việc thiết lập tường lửa, bạn có thể cho phép giao thức ICMP hoạt động:

Netfilter:~# iptables -A INPUT -p icmp -j CHẤP NHẬN bộ lọc mạng:~# iptables -A OUTPUT -p icmp -j CHẤP NHẬN

Sẽ an toàn hơn nếu chỉ định lệnh iptables tương tự sau:

Netfilter:~# iptables -A INPUT -p icmp --icmp-type 0 -j CHẤP NHẬN bộ lọc mạng:~# iptables -A INPUT -p icmp --icmp-type 8 -j CHẤP NHẬN netfilter:~# iptables -A OUTPUT -p icmp -j CHẤP NHẬN

Lệnh này sẽ cho phép các loại gói ICMP trở thành yêu cầu tiếng vang và trả lời tiếng vang, điều này sẽ cải thiện tính bảo mật.

Biết rằng máy tính của chúng tôi không bị nhiễm virus (phải không?) và nó chỉ thiết lập các kết nối gửi đi an toàn. Ngoài ra, biết rằng các kết nối an toàn là các kết nối từ cái gọi là. phạm vi cổng nhất thời, được chỉ định bởi kernel trong một tệp /proc/sys/net/ipv4/ip_local_port_range, Có thể cho phép kết nối đi từ các cổng an toàn này:

Netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j CHẤP NHẬN bộ lọc mạng:~# iptables -A OUTPUT -p UDP -- thể thao 32768:61000 -j CHẤP NHẬN

Nếu bạn không hoang tưởng về việc giới hạn các gói gửi đi, thì bạn có thể giới hạn bản thân ở một lệnh iptables cho phép tất cả các kết nối đi op cho tất cả các giao thức và cổng:

Netfilter:~# iptables -A OUTPUT -j ACCEPT netfilter:~# # hoặc đơn giản là đặt chính sách CHẤP NHẬN mặc định cho chuỗi OUTPUT netfilter:~# iptables -P OUTPUT ACCEPT

Hơn nữa, biết rằng trong các kết nối mạng netfilter có 4 trạng thái ( MỚI,THÀNH LẬPLIÊN QUAN vàKHÔNG HỢP LỆ) và các kết nối gửi đi mới từ máy tính cục bộ (với trạng thái MỚI) được cho phép trong hai lệnh iptables cuối cùng, các kết nối đã được thiết lập và các kết nối bổ sung có trạng thái THÀNH LẬP vàCÓ LIÊN QUAN theo đó, đồng thời biết rằng hệ thống cục bộ được truy cập thông qua , chúng tôi chỉ có thể cho phép các gói TCP và UDP được ứng dụng cục bộ yêu cầu tiếp cận máy tính của chúng tôi:

Netfilter:~# iptables -A INPUT -p TCP -m state --state THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN netfilter:~# iptables -A INPUT -p UDP -m state --state THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN -j

Đó là tất cả, thực sự! Nếu một số loại dịch vụ mạng vẫn đang chạy trên máy tính để bàn, thì bạn cần thêm các quy tắc thích hợp cho các kết nối đến và cho các kết nối đi. Ví dụ, để chạy máy chủ ssh chấp nhận và gửi yêu cầu trên cổng TCP 22, bạn cần thêm thông tin sau quy tắc iptables:

Netfilter:~# iptables -A INPUT -i eth0 -p TCP --dport 22 -j CHẤP NHẬN bộ lọc mạng:~# iptables -A OUTPUT -o eth0 -p TCP --sport 22 -j CHẤP NHẬN

Những thứ kia. đối với bất kỳ dịch vụ nào, bạn cần thêm một quy tắc vào chuỗi INPUT và OUTPUT, cho phép tương ứng nhận và gửi các gói bằng cổng này cho một giao diện mạng cụ thể (nếu bạn không chỉ định một giao diện thì nó sẽ được phép nhận/gửi gói trên bất kỳ giao diện nào).

Định cấu hình netfilter/iptables để cho phép nhiều máy khách kết nối với một kết nối.

Bây giờ chúng ta hãy nhìn vào Linux như một cổng kết nối mạng cục bộ với Internet bên ngoài. Hãy giả vờ như vậy giao diện eth0 được kết nối với Internet và có IP 198.166.0.200, và giao diện eth1 được kết nối với mạng cục bộ và có IP 10.0.0.1. Theo mặc định, trong nhân Linux chuyển tiếp gói thông qua chuỗi FORWARD(các gói không dành cho hệ thống cục bộ) bị tắt. Để kích hoạt tính năng này, bạn phải đặt giá trị 1 trong file :

Bộ lọc mạng:~# echo 1 > /proc/sys/net/ipv4/ip_forward

ĐẾN chuyển tiếp góiđược lưu sau khi khởi động lại, phải có trong tập tin /etc/sysctl.conf bỏ ghi chú (hoặc chỉ thêm) dòng net.ipv4.ip_forward=1.

Vì vậy, chúng tôi có một địa chỉ bên ngoài (198.166.0.200), có một số máy khách giả định trên mạng cục bộ có và gửi yêu cầu đến mạng bên ngoài. Nếu những máy khách này gửi yêu cầu tới mạng bên ngoài thông qua cổng “nguyên trạng” mà không chuyển đổi thì máy chủ từ xa sẽ không thể phản hồi chúng, bởi vì địa chỉ trả lại sẽ là người nhận từ "mạng cục bộ". Để sơ đồ này hoạt động chính xác, cần phải thay thế địa chỉ của người gửi bằng địa chỉ bên ngoài của cổng Linux. Điều này đạt được thông qua (giả mạo) trong , trong .

Netfilter:~# iptables -A FORWARD -m conntrack --ctstate THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN netfilter:~# iptables -A FORWARD -m conntrack --ctstate MỚI -i eth1 -s 10.0.0.1/24 -j CHẤP NHẬN bộ lọc mạng: ~# iptables -P Bộ lọc mạng THẢ PHÍA TRƯỚC:~# iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Vì vậy, theo thứ tự từ trên xuống dưới, chúng tôi giải quyết các kết nối đã được thiết lập trong chuỗi CHUYỂN TIẾP, bảng lọc, thì chúng tôi cho phép các kết nối mới được thiết lập trong chuỗi CHUYỂN TIẾP, bảng lọc, đến từ giao diện eth1 và từ mạng 10.0.0.1/24. Tất cả các gói khác đi qua CHUYỂN CHUYỂN chuỗi- vứt bỏ. Tiếp theo, chúng tôi thực hiện che giấu (thay thế địa chỉ người gửi gói trong tiêu đề) của tất cả các gói có nguồn gốc từ giao diện eth0.

Ghi chú. Có một khuyến nghị chung: sử dụng quy tắc -j MASQUERADE cho các giao diện có IP được lấy động (ví dụ: qua DHCP từ nhà cung cấp). Với IP tĩnh, -j MASQUERADE có thể được thay thế bằng -j SNAT -to-source IP_interface_eth0 tương tự. Ngoài ra, SNAT có thể “ghi nhớ” các kết nối đã thiết lập trong trường hợp giao diện không khả dụng trong thời gian ngắn. So sánh MASQUERADE và SNAT trong bảng:

Ngoài các quy tắc đã chỉ định, bạn cũng có thể thêm các quy tắc để lọc các gói dành cho máy chủ cục bộ - như được mô tả trong. Tức là thêm các quy tắc cấm và cho phép đối với các kết nối đến và đi:

Netfilter:~# iptables -P INPUT DROP netfilter:~# iptables -P OUTPUT DROP netfilter:~# iptables -A INPUT -i lo -j CHẤP NHẬN bộ lọc mạng:~# iptables -A OUTPUT -o lo -j CHẤP NHẬN bộ lọc mạng:~# iptables -A INPUT -p icmp --icmp-type 0 -j CHẤP NHẬN bộ lọc mạng:~# iptables -A INPUT -p icmp --icmp-type 8 -j CHẤP NHẬN bộ lọc mạng:~# iptables -A OUTPUT -p icmp -j CHẤP NHẬN netfilter:~# cat /proc/sys/net/ipv4/ip_local_port_range 32768 61000 netfilter:~# iptables -A OUTPUT -p TCP --sport 32768:61000 -j CHẤP NHẬN netfilter:~# iptables -A OUTPUT -p UDP -- sport 32768:61000 -j CHẤP NHẬN bộ lọc mạng:~# iptables -A INPUT -p TCP -m trạng thái --trạng thái THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN bộ lọc mạng: ~# iptables -A INPUT -p UDP -m trạng thái --trạng thái THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN

Kết quả là, nếu một trong các máy chủ mạng cục bộ, chẳng hạn như 10.0.0.2, cố gắng liên hệ với một trong các máy chủ Internet, chẳng hạn như 93.158.134.3 (ya.ru), bằng , địa chỉ nguồn của chúng sẽ được thay thế bằng địa chỉ bên ngoài địa chỉ cổng trong bảng POSTROUTING nat của chuỗi, tức là IP 10.0.0.2 gửi đi sẽ được thay thế bằng 198.166.0.200. Từ quan điểm của máy chủ từ xa (ya.ru), nó sẽ trông như thể chính cổng đang giao tiếp trực tiếp với nó. Khi máy chủ từ xa bắt đầu truyền dữ liệu trở lại, nó sẽ gửi dữ liệu cụ thể đến cổng, tức là 198.166.0.200. Tuy nhiên, tại cổng địa chỉ đích của các gói này sẽ được thay đổi thành 10.0.0.2, sau đó các gói sẽ được truyền đến người nhận thực sự trên mạng cục bộ. Đối với phép chuyển đổi ngược như vậy, không cần chỉ định quy tắc bổ sung nào - việc này sẽ được thực hiện tương tự hoạt động MASQUERADE, ghi nhớ máy chủ nào trên mạng cục bộ đã gửi yêu cầu và máy chủ nào cần trả lại phản hồi đã nhận.

Ghi chú: tốt nhất là ngầm chấp nhận, trước tất cả các lệnh iptables chuỗi rõ ràng mà các quy tắc sẽ được thêm vào:

Netfilter:~# iptables -F CHAINNAME

Cung cấp quyền truy cập vào các dịch vụ trên cổng

Giả sử rằng một dịch vụ nhất định đang chạy trên cổng của chúng tôi, dịch vụ này sẽ đáp ứng các yêu cầu đến từ Internet. Giả sử nó hoạt động trên một số cổng TCP nn. Để cung cấp quyền truy cập vào dịch vụ này, cần sửa đổi bảng bộ lọc trong chuỗi INPUT (để có thể nhận các gói mạng được gửi đến dịch vụ cục bộ) và bảng bộ lọc trong chuỗi OUTPUT (để cho phép phản hồi các yêu cầu đến).

Vì vậy, chúng tôi có các gói giả mạo (thay thế địa chỉ của người gửi bằng địa chỉ bên ngoài) sang mạng bên ngoài. Và cho phép chấp nhận tất cả các kết nối được thiết lập. Việc cung cấp quyền truy cập vào dịch vụ sẽ được thực hiện bằng cách sử dụng các quy tắc cho phép sau:

Netfilter:~# iptables -A INPUT -p TCP --dport nn -j CHẤP NHẬN bộ lọc mạng:~# iptables -A OUTPUT -p TCP --sport nn -j CHẤP NHẬN

Các quy tắc này cho phép các kết nối TCP đến tới cổng nn và các kết nối TCP đi từ cổng nn. Ngoài ra, bạn có thể thêm các tham số hạn chế bổ sung, ví dụ: chỉ cho phép các kết nối đến từ giao diện bên ngoài eth0 (phím -i eth0) và như thế.

Cung cấp quyền truy cập vào các dịch vụ trên mạng cục bộ

Giả sử rằng trên mạng cục bộ của chúng ta có một số máy chủ có IP X.Y.Z.1, máy chủ này phải đáp ứng các yêu cầu mạng từ mạng bên ngoài trên cổng TCP xxx. Để phản hồi dịch vụ chính xác từ mạng cục bộ xảy ra khi máy khách từ xa truy cập vào cổng IP bên ngoài xxx, cần chuyển tiếp các yêu cầu đến cổng IP bên ngoài xxx tới máy chủ tương ứng trên mạng cục bộ. Điều này đạt được bằng cách sửa đổi địa chỉ người nhận trong gói đến cổng được chỉ định. Hành động này được gọi là DNAT và được áp dụng trong chuỗi PREROUTING trong bảng nat. Và cũng cho phép chuyển các gói này trong chuỗi FORWARD trong bảng bộ lọc.

Một lần nữa, hãy đi theo con đường. Vì vậy, chúng tôi có các gói giả mạo (thay thế địa chỉ của người gửi bằng địa chỉ bên ngoài) sang mạng bên ngoài. Và cho phép chấp nhận tất cả các kết nối được thiết lập. Việc cung cấp quyền truy cập vào dịch vụ sẽ được thực hiện bằng cách sử dụng các quy tắc cho phép sau:

Netfilter:~# iptables -t nat -A PREROUTING -p tcp -d 198.166.0.200 --dport xxx -j DNAT --to-destination X.Y.Z.1 netfilter:~# iptables -A Forward -i eth0 -p tcp -d X.Y.Z. 1 --dport xxx -j CHẤP NHẬN

Lưu các quy tắc đã nhập khi khởi động lại

Tất cả các quy tắc được nhập vào bảng điều khiển sẽ được đặt lại về trạng thái ban đầu sau khi khởi động lại hệ điều hành (đọc - xóa). Để lưu tất cả các lệnh iptables đã nhập, có một số cách. Ví dụ, một trong số đó là đặt tất cả các quy tắc tường lửa trong tệp khởi tạo. Nhưng phương pháp này có một nhược điểm đáng kể: toàn bộ khoảng thời gian từ khi bắt đầu hệ thống con mạng cho đến khi bắt đầu dịch vụ cuối cùng và sau đó là tập lệnh RC.local từ SystemV, hệ điều hành sẽ không được bảo vệ. Ví dụ, hãy tưởng tượng một tình huống nếu một số dịch vụ (ví dụ NFS) khởi động lần cuối và một số lỗi xảy ra khi nó khởi động và trước khi tập lệnh RC.local được khởi chạy. Theo đó, RC.local không bao giờ khởi động và hệ thống của chúng tôi biến thành một lỗ hổng lớn.

Vì vậy, ý tưởng tốt nhất sẽ là khởi tạo quy tắc netfilter/iptables trong khi tải. Debian có một công cụ tuyệt vời cho việc này - thư mục /etc/network/if-up.d/, trong đó bạn có thể đặt các tập lệnh sẽ được khởi chạy khi mạng khởi động. Ngoài ra còn có các đội iptables-lưuiptables-khôi phục, thao tác này sẽ tạo một tập hợp các quy tắc netfilter từ kernel trở đi và khôi phục các quy tắc từ kernel tương ứng.

Vì thế, Thuật toán lưu iptables xấp xỉ như sau:

  • Chúng tôi định cấu hình tường lửa phù hợp với nhu cầu của bạn bằng cách sử dụng
  • tạo một tập hợp các quy tắc đã tạo bằng lệnh iptables-save > /etc/iptables.rules
  • tạo nên tập lệnh nhậpđã tạo kết xuất khi mạng khởi động (trong thư mục /etc/network/if-up.d/) và đừng quên làm cho nó có thể thực thi được:
# cat /etc/network/if-up.d/firewall #!/bin/bash /sbin/iptables-restore< /etc/iptables.rules exit 0 # chmod +x /etc/network/if-up.d/firewall

Đã nhận được kết xuất quy tắc lệnh iptables-save Nó có định dạng văn bản và do đó phù hợp để chỉnh sửa. Cú pháp đầu ra của lệnh iptables-save như sau:

# Được tạo bởi iptables-save v1.4.5 vào Thứ Bảy ngày 24 tháng 12 22:35:13 2011 *filter:INPUT ACCEPT :FORWARD ACCEPT ....... # comment -A INPUT -i lo -j ACCEPT -A INPUT ! -i lo -d 127.0.0.0/8 -j REJECT .......... -A Forward -j REJECT CAM KẾT # Đã hoàn thành vào Thứ Bảy ngày 24 tháng 12 22:35:13 2011 # Được tạo bởi iptables-save v1 .4.5 vào Thứ Bảy ngày 24 tháng 12 22:35:13 2011 *raw ...... CAM KẾT

Các dòng bắt đầu bằng # - nhận xét, dòng trên * - đây là tên các bảng, giữa tên bảng và chữ LÀM chứa các tham số được truyền cho lệnh iptables. tham số CAM KẾT- cho biết việc hoàn thành các tham số cho bảng trên. Các dòng bắt đầu bằng dấu hai chấm xác định các chuỗi chứa bảng này theo định dạng:

:chính sách chuỗi [gói:byte]

Ở đâu xích- tên chuỗi, chính sách- chính sách chuỗi mặc định cho bảng này, sau đó là bộ đếm gói và byte tại thời điểm lệnh được thực thi.

Tại RedHat chức năng lưu trữ lệnh iptablesđược thực thi khi mạng khởi động và dừng thực thi tệp /etc/sysconfig/iptables. Và việc quản lý tập tin này nằm ở daemon iptables.

Là một tùy chọn khác để lưu quy tắc, bạn có thể xem xét sử dụng tham số hướng lên trong tập tin /etc/mạng/giao diện với một đối số ở dạng tệp lưu trữ các lệnh iptables đặt ra các quy tắc cần thiết.

Điểm mấu chốt

Thế là đủ cho ngày hôm nay. Tôi chắc chắn sẽ xuất bản các triển khai tường lửa phức tạp hơn trong các bài viết sau.

Trân trọng, McSim!

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

Bộ lọc mạng- tường lửa (hay còn gọi là tường lửa, còn gọi là tường lửa, còn gọi là tường lửa...) đã được tích hợp vào 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, kể từ trước khi ra đời 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ài đặt CONFIG_NETFILTER, CONFIG_IP_NF_IPTABLES, CONFIG_IP_NF_FILTER (Bảng lọc), Config_IP_NF_NAT (Bảng NAT) Config_ip_ NF_MATCH_* ( các loại mẫu khớp gói bổ sung: 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 cho khả năng tương thích với ipchains, CONFIG_BRIDGE_NF_EBTABLES và CONFIG_BRIDGE_EBT_* để hoạt động ở chế độ cầu nối, các chế độ khác 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 về các 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ề vấn đề 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 trù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, các phiên bản mới nhất của iptables (đặc biệt 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 ra (địa chỉ cũ sẽ vẫn còn trong đó). Nếu bạn chỉ định một 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 được 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 state --state (không dùng nữa)
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 kết nối đã thiết lập)
  • CÓ LIÊN QUAN(Các gói không thuộc về một kết nối đã thiết lập nhưng được liên kết với kết nối đó. Ví dụ: FTP ở chế độ hoạt động sử dụng các kết nối khác nhau để truyền dữ liệu. Các kết nối này được liên kết.)
  • 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 Chỉ định địa chỉ MAC của nút mạng đã gửi gói. Đị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 rời khỏi chuỗi này và được chuyển sang chuỗ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 (nó chỉ được phép chỉ ra 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ỉ này 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 nhiều 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. Trong bài viết tiếp theo tôi sẽ đưa ra những ví dụ thực tế để nắm vững 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 các sơ đồ lọc khác nhau 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 mà nó đến và xa hơn dọc theo một tuyến đường chuỗi nhất định, tùy thuộc vào việc nó được dành cho hệ thống cục bộ hay hệ thống “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 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!

Chương trình giáo dục

Mặc dù thực tế là Internet có đầy đủ các bài viết về Iptables, nhưng tôi thường thấy các yêu cầu đề xuất một bộ quy tắc cho một tình huống cụ thể. Vì các tình huống khá điển hình nên bạn có thể cung cấp liên kết tới ghi chú này mà không cần giải thích. Tôi nhắc lại, đây không phải là truyện kể lại mà bắt buộc phải đọc. Nó đã đủ tốt rồi, nhưng chỉ là bộ quy tắc dành cho người mới bắt đầu với số lượng nhận xét tối thiểu.
Tất nhiên, có điều gì đó đáng nói để hiểu:
Chính sách, khóa -P. Trích dẫn từ hướng dẫn:

Đặt chính sách mặc định cho chuỗi nhất định. Chính sách mặc định xác định hành động được áp dụng cho các gói không nằm trong bất kỳ quy tắc nào trong chuỗi. Chính sách mặc định là DROP và ACCEPT.

Nói cách khác, nếu một gói đến giao diện mạng không được mô tả bởi bất kỳ quy tắc nào thì nó sẽ được xử lý theo chính sách mặc định. Từ đó, bạn có thể định cấu hình Iptables (và bất kỳ tường lửa nào) theo hai cách/chính sách:
1. Mọi thứ không bị cấm đều được phép. Những thứ kia. Mọi thứ đều được cho phép.
2. Mọi thứ đều bị cấm ngoại trừ những gì được cho phép rõ ràng.
Rõ ràng, cách tiếp cận thứ hai đúng hơn và sẽ được thảo luận thêm. Tôi khuyên bạn nên để chính sách OUTPUT là CHẤP NHẬN, nếu không bạn sẽ phải đối mặt với rất nhiều trục trặc. Khi đã hiểu rõ về Iptables, bạn sẽ hiểu lý do tại sao và có thể định cấu hình nó trong DROP.
Và một lưu ý quan trọng nữa. Điều này được hiểu rằng các quy tắc được áp dụng bởi tập lệnh chứ không phải được nhập từng quy tắc một từ bảng điều khiển. Trong trường hợp sau, sau lệnh iptable -P INPUT DROP, kết nối của phiên SSH đã thiết lập sẽ bị mất. Khi áp dụng quy tắc theo tập lệnh, phiên sẽ không bị ngắt, vì Tiếp theo là quy tắc cho phép chấp nhận các kết nối đã được thiết lập.

Trước khi áp dụng quy tắc, bạn phải xóa tất cả các chuỗi, bảng và chính sách hiện có:

Iptables -P INPUT CHẤP NHẬN iptables -P CHUYỂN TIẾP CHẤP NHẬN iptables -P OUTPUT CHẤP NHẬN iptables -t nat -P TRƯỚC KHI CHẤP NHẬN iptables -t nat -P CHẤP NHẬN SAU CHẤP NHẬN iptables -t nat -P OUTPUT CHẤP NHẬN iptables -t mangle -P TRƯỚC CHẤP NHẬN iptables -t mangle -P ĐẦU RA CHẤP NHẬN iptables -F iptables -t nat -F iptables -t mangle -F iptables -X iptables -t nat -X iptables -t mangle -X

Bộ quy tắc iptables tối thiểu cho máy tính để bàn

Nhiệm vụ: chặn tất cả các kết nối đến. Cuộc gọi đi không giới hạn.

# Quy tắc mặc định iptable -P INPUT DROP iptable -P FORWARD DROP iptable -P OUTPUT ACCEPT # Cho phép các kết nối đến từ localhost iptables -A INPUT -i lo -j ACCEPT # Cho phép các kết nối đến đã được thiết lập iptables -A INPUT -m state -- trạng thái THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN

Bộ quy tắc iptables tối thiểu cho máy chủ có ứng dụng

Nhiệm vụ: cấp quyền truy cập vào một dịch vụ, đặt nó là một máy chủ web chạy trên cổng 80, từ chối mọi thứ khác.
Vì đây là máy chủ nên cần phải cho phép kết nối để quản lý thông qua SSH. Bằng cách tương tự, bạn có thể mở bất kỳ cổng hoặc bộ cổng nào bạn muốn.

# Quy tắc mặc định iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT ACCEPT # Cho phép các kết nối đến từ localhost iptables -A INPUT -i lo -j ACCEPT # Cho phép các kết nối đến đã được thiết lập iptables -A INPUT -m state -- trạng thái THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN # Cho phép SSH iptables -A INPUT -p TCP --dport 22 -j CHẤP NHẬN # Cho phép cổng HTTP iptables -A INPUT -p TCP --dport 80 -j CHẤP NHẬN

Bộ quy tắc iptables tối thiểu cho một cổng

Nhiệm vụ: 1. Phân phối Internet tới mạng cục bộ bằng NAT. 2. Cho phép các máy từ mạng cục bộ truy cập vào máy chủ HTTP, HTTPS và DNS bên ngoài 3. Chuyển tiếp cổng tới máy chủ web nằm trên mạng cục bộ này.

### Biến # Giao diện tìm kiếm Internet INET_IF="eth0" # Địa chỉ IP trắng thuộc $INET_IF INET_IP="x.x.x.x" # Cổng TCP mà qua đó các máy từ mạng cục bộ được phép truy cập Internet FORWARD_TCP_PORTS="53,80,443 " # Cổng UDP mà qua đó các máy từ mạng cục bộ được phép truy cập Internet FORWARD_UDP_PORTS="53" # Mạng cục bộ LOCAL_NET="192.168.0.0/24" # Địa chỉ IP của máy chủ web cục bộ WEB_SERVER="192.168.0.10" # Đường dẫn đến sysctl SYSCTL=" /sbin/sysctl -w" # Cho phép chuyển tiếp các gói IPv4 trong kernel nếu [ "$SYSCTL" = "" ] sau đó echo "1" > /proc/sys/net/ipv4/ip_forward else $SYSCTL net.ipv4.ip_forward=" 1" fi ### Quy tắc mặc định iptables -P INPUT DROP iptables -P Forward DROP iptables -P OUTPUT ACCEPT ### INPUT # Cho phép các kết nối đến từ localhost iptables -A INPUT -i lo -j CHẤP NHẬN # Cho phép chấp nhận các kết nối đã được thiết lập iptables -A INPUT -m state --state THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN # Cho phép SSH iptables -A INPUT -p TCP --dport 22 -j CHẤP NHẬN ### CHUYỂN TIẾP # Cho phép các kết nối chuyển tiếp đã được thiết lập iptables -A FORWARD -m state --state THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN # Cho phép các máy mạng cục bộ truy cập Internet trên các cổng TCP được chỉ định iptables -A FORWARD -p TCP -s $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j CHẤP NHẬN iptables -A FORWARD -p TCP -d $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j CHẤP NHẬN # Cho phép các máy mạng cục bộ truy cập Internet trên các cổng UDP được chỉ định iptables -A FORWARD -p UDP -s $LOCAL_NET -m multiport --dport $FORWARD_UDP_PORTS -j CHẤP NHẬN iptables -A FORWARD -p UDP -d $LOCAL_NET -m multiport --dport $FORWARD_UDP_PORTS -j CHẤP NHẬN ### NAT # Kích hoạt NAT cho iptables mạng con cục bộ -t nat -A POSTROUTING - s $LOCAL_NET -o $INET_IF -j SNAT - -to-source $INET_IP # Chuyển tiếp cổng tới máy chủ web cục bộ iptables -t nat -A PREROUTING -p TCP -d $INET_IP --dport 80 -j DNAT --to -đích $WEB_SERVER:80

Cần lưu ý rằng nếu một cổng không phải danh sách $FORWARD_TCP_PORTS được chuyển tiếp thì nó phải được thêm vào đó, bởi vì nó sẽ bị loại bỏ bởi chính sách mặc định.
Kết quả là script iptables cho cổng sẽ trông như thế này. Khác với quy định trước đây.

#!/bin/sh # Xóa tất cả các quy tắc của iptables -P INPUT ACCEPT iptables -P Forward CHẤP NHẬN iptables -P OUTPUT CHẤP NHẬN iptables -t nat -P TRƯỚC KHI CHẤP NHẬN iptables -t nat -P POST CHẤP NHẬN iptables -t nat -P OUTPUT CHẤP NHẬN iptables -t mangle -P TRƯỚC KHI CHẤP NHẬN iptables -t mangle -P OUTPUT CHẤP NHẬN iptables -F iptables -t nat -F iptables -t mangle -F iptables -X iptables -t nat -X iptables -t mangle -X ### Biến # Giao diện tìm kiếm Internet INET_IF="eth0" # Địa chỉ IP trắng thuộc về $INET_IF INET_IP="x.x.x.x" # Mạng cục bộ LOCAL_NET="192.168.0.0/24" # Địa chỉ IP của máy chủ web cục bộ WEB_SERVER="192.168.0.10" # Kích hoạt các gói IPv4 chuyển tiếp trong kernel # Đường dẫn tới sysctl SYSCTL="/sbin/sysctl -w" if [ "$SYSCTL" = "" ] then echo "1" > /proc/sys/net/ipv4/ip_forward else $ SYSCTL net. ipv4.ip_forward="1" fi ### Quy tắc mặc định iptables -P INPUT DROP iptables -P Forward DROP iptables -P OUTPUT ACCEPT ### INPUT # Cho phép các kết nối đến từ iptables localhost -A INPUT -i lo - j CHẤP NHẬN # Cho phép chấp nhận các kết nối đã được thiết lập iptables -A INPUT -m state --state THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN # Chỉ cho phép SSH từ mạng cục bộ iptables -A INPUT -p TCP -s $LOCAL_NET --dport 22 -j CHẤP NHẬN # Chỉ cho phép yêu cầu lưu vào bộ nhớ đệm máy chủ DNS từ mạng cục bộ iptables -A INPUT -p TCP -s $LOCAL_NET --dport 53 -j CHẤP NHẬN iptables -A INPUT -p UDP -s $LOCAL_NET --dport 53 -j CHẤP NHẬN ## # FORWARD # Cho phép các kết nối chuyển tiếp đã được thiết lập iptables -A FORWARD -m state --state THÀNH LẬP, LIÊN QUAN -j CHẤP NHẬN # Cổng TCP trên đó các máy từ mạng cục bộ được phép truy cập Internet FORWARD_TCP_PORTS="80,443" # Cho phép các máy trên mạng cục bộ mạng cục bộ để truy cập Internet trên các cổng TCP được chỉ định iptables -A FORWARD -p TCP -s $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j ACCEPT iptables -A FORWARD -p TCP -d $LOCAL_NET -m multiport --dport $FORWARD_TCP_PORTS -j CHẤP NHẬN ### NAT # Kích hoạt NAT cho iptables mạng con cục bộ -t nat -A POSTROUTING -s $LOCAL_NET -o $INET_IF -j SNAT --to-source $INET_IP # Chuyển tiếp một cổng tới máy chủ web cục bộ đến một cổng không chuẩn iptables -t nat -A PREROUTING -p TCP - d $INET_IP --dport 80 -j DNAT --to-destination $WEB_SERVER:8090

Đầu ra của các quy tắc hiện hành

Xem các quy tắc cho bảng bộ lọc, tức là. lệnh sẽ hiển thị các quy tắc iptables cơ bản:

IPtables -L -n

Đối với một bảng cụ thể, ví dụ nat và mangle:

IPtables -t nat -L -n iptables -t mangle -L -n

Các khái niệm chính của iptables là:

    Quy tắc - bao gồm một tiêu chí, một hành động và một bộ đếm. Nếu gói đáp ứng các tiêu chí, một hành động sẽ được thực hiện trên gói đó và nó được tính vào bộ đếm. Có thể không có tiêu chí nào - khi đó tiêu chí “tất cả các gói” được ngầm định. Cũng không cần thiết phải chỉ định một hành động - nếu không có hành động đó, quy tắc sẽ chỉ hoạt động như một bộ đếm. Các quy tắc cho mỗi chuỗi được kích hoạt theo thứ tự chúng xuất hiện, vì vậy thứ tự rất quan trọng.

    • Tiêu chí - một biểu thức logic phân tích các thuộc tính của gói và/hoặc kết nối và xác định xem gói cụ thể này có tuân theo quy tắc hiện tại hay không. Các tiêu chí được kết nối bằng logic “VÀ”.

      Hành động - mô tả hành động cần được thực hiện với gói và/hoặc kết nối nếu chúng nằm trong phạm vi của quy tắc này. Các hành động sẽ được mô tả chi tiết hơn dưới đây.

      Bộ đếm là một thành phần của quy tắc cung cấp tính toán số lượng gói nằm trong tiêu chí của quy tắc nhất định. Bộ đếm cũng tính đến tổng khối lượng của các gói như vậy tính bằng byte.

    Một chuỗi là một chuỗi các quy tắc được sắp xếp theo thứ tự. Chuỗi có thể được chia thành tùy chỉnh và cơ bản.

    • Chuỗi cơ sở là chuỗi được tạo theo mặc định khi bảng được khởi tạo. Mỗi gói, tùy thuộc vào việc nó được dành cho chính máy chủ, được tạo ra bởi nó hay được truyền đi, phải trải qua tập hợp các chuỗi cơ bản của các bảng khác nhau được gán cho nó. Ngoài ra, chuỗi cơ bản khác với chuỗi người dùng ở chỗ có “chính sách mặc định”. Hành động này áp dụng cho những gói chưa được xử lý bởi các quy tắc khác trong chuỗi này và các chuỗi được gọi từ chuỗi đó. Tên chuỗi cơ sở luôn được viết bằng chữ in hoa (PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).

      Chuỗi người dùng - một chuỗi được tạo bởi người dùng. Chỉ có thể được sử dụng trong bảng riêng của nó. Khuyến cáo không nên sử dụng tên viết hoa cho các chuỗi như vậy để tránh nhầm lẫn với chuỗi cơ sở và các hành động có sẵn.

    Bảng là một tập hợp các chuỗi cơ bản và chuỗi người dùng được thống nhất bởi một mục đích chức năng chung. Tên của các bảng (cũng như các mô-đun tiêu chí) được viết bằng chữ thường, vì về nguyên tắc, chúng không thể xung đột với tên của chuỗi người dùng. Khi gọi lệnh iptables, bảng được chỉ định ở định dạng -t table_name. Nếu không được chỉ định rõ ràng, bảng lọc sẽ được sử dụng.

Phân tích cú pháp:

# Kết xuất quy tắc bảng bộ lọc$ sudo iptables-save -c -t filter # Bộ lọc bảng * bộ lọc # Chuỗi INPUT, Forward, OUTPUT, chính sách và bộ đếm của họ:CHẤP NHẬN ĐẦU VÀO [ 19302 :9473669 ] : CHẤP NHẬN CHUYỂN TIẾP [ 0 :0 ] : CHẤP NHẬN ĐẦU RA [ 5462736 :4247599532 ] # Quy tắc: "" - bộ đếm quy tắc, "-A INPUT" - chuỗi, "-i em1 -p tcp -m tcp --dport 22" - tiêu chí, "-j CHẤP NHẬN" - hành động[ 17 :1020 ] -A INPUT -i em1 -p tcp -m tcp --dport 22 -j CHẤP NHẬN CAM KẾT

Ngành kiến ​​​​trúc

Trong hệ thống netfilter, các gói được truyền qua chuỗi. Chuỗi là một danh sách các quy tắc có thứ tự và mỗi quy tắc có thể chứa các tiêu chí và một hành động hoặc chuyển đổi. Khi một gói đi qua chuỗi, hệ thống netfilter sẽ kiểm tra từng gói một xem gói có đáp ứng tất cả các tiêu chí của quy tắc tiếp theo hay không và nếu có thì nó sẽ thực hiện một hành động (nếu không có tiêu chí nào trong quy tắc thì hành động đó sẽ được thực hiện). cho tất cả các gói đi qua quy tắc). Có rất nhiều tiêu chí có thể. Ví dụ: một gói phù hợp với tiêu chí –source 192.168.1.1 nếu tiêu đề gói chỉ ra rằng nguồn là 192.168.1.1. Kiểu nhảy đơn giản nhất, –jump, chỉ chuyển tiếp gói tin tới đầu chuỗi khác. Bạn cũng có thể chỉ định một hành động bằng cách sử dụng –jump. Các hành động tiêu chuẩn có sẵn trong tất cả các chuỗi là CHẤP NHẬN (bỏ qua), DROP (xóa), QUEUE (gửi tới chương trình bên ngoài để phân tích) và RETURN (quay lại chuỗi trước đó để phân tích). Ví dụ, các lệnh

Iptables -A INPUT --source 192.168.1.1 --jump CHẤP NHẬN iptables -A INPUT --jump other_chain

có nghĩa là “thêm các quy tắc sau vào cuối chuỗi INPUT: bỏ qua các gói từ 192.168.1.1 và gửi mọi thứ còn lại để phân tích đến other_chain.”

Dây chuyền

Có 5 loại chuỗi tiêu chuẩn được tích hợp trong hệ thống:

    PREROUTING - để xử lý ban đầu các gói tin đến.

    INPUT - dành cho các gói đến được gửi trực tiếp đến quy trình cục bộ (máy khách hoặc máy chủ).

    CHUYỂN TIẾP - đối với các gói đến được chuyển tiếp đến đầu ra (lưu ý rằng các gói được chuyển tiếp trước tiên phải đi qua chuỗi PREROUTING, sau đó là FORWARD và POSTROUTING).

    OUTPUT - dành cho các gói được tạo bởi các tiến trình cục bộ.

    POSTROUTING - để xử lý cuối cùng các gói gửi đi.

Bạn cũng có thể tạo và hủy chuỗi của riêng mình bằng tiện ích iptables.

Những cái bàn

Các chuỗi được tổ chức thành 4 bảng:

    Raw - được xem trước khi truyền gói đến hệ thống phát hiện trạng thái. Hiếm khi được sử dụng, chẳng hạn như để đánh dấu các gói KHÔNG được xử lý bởi hệ thống phát hiện trạng thái. Để thực hiện việc này, quy tắc chỉ định hành động NOTRACK. Chứa chuỗi PREROUTING và OUTPUT.

    Mangle - chứa các quy tắc sửa đổi các gói IP (thường là tiêu đề). Trong số những thứ khác, nó hỗ trợ các hành động TTL (Thời gian tồn tại), TOS (Loại dịch vụ) và MARK (để thay đổi các trường TTL và TOS cũng như để thay đổi đánh dấu gói). Hiếm khi cần thiết và có thể nguy hiểm. Chứa tất cả năm chuỗi tiêu chuẩn.

    Nat - Chỉ nhìn vào các gói tạo kết nối mới (theo hệ thống phát hiện trạng thái). Hỗ trợ các hành động DNAT, SNAT, MASQUERADE, REDIRECT. Chứa các chuỗi PREROUTING, OUTPUT và POSTROUTING.

    Bộ lọc - bảng chính, được sử dụng theo mặc định nếu tên bảng không được chỉ định. Chứa các chuỗi INPUT, FORWARD và OUTPUT.

Các chuỗi có cùng tên nhưng ở các bảng khác nhau là các đối tượng hoàn toàn độc lập. Ví dụ: PREROUTING thô và PREROUTING mangle thường chứa một bộ quy tắc khác nhau; Các gói đầu tiên đi qua chuỗi PREROUTING thô và sau đó đi qua chuỗi PREROUTING mangle.

Những trạng thái

Trong hệ thống netfilter, mỗi gói đi qua cơ chế trạng thái có thể có một trong bốn trạng thái sau:

    MỚI - gói mở một phiên mới. Một ví dụ cổ điển là gói TCP có cờ SYN.

    THÀNH LẬP - Gói này là một phần của phiên đã tồn tại.

    LIÊN QUAN - Gói mở một phiên mới được liên kết với một phiên đã mở. Ví dụ: trong phiên FTP thụ động, máy khách kết nối với cổng 21 của máy chủ, máy chủ cho máy khách biết số cổng thứ hai được chọn ngẫu nhiên, sau đó máy khách kết nối với cổng thứ hai để truyền tệp. Trong trường hợp này, phiên thứ hai (truyền tệp trên cổng thứ hai) được liên kết với phiên đã tồn tại (kết nối ban đầu tới cổng 21).

    KHÔNG HỢP LỆ - tất cả các gói khác.

Sơ đồ đi qua các bảng và chuỗi

Sơ đồ đơn giản hóa việc đi qua các bảng và chuỗi:

Sơ đồ chi tiết:

Cấu hình cơ bản

Dưới đây là một ví dụ về cấu hình iptables tĩnh cơ bản. Khi lưu và tải cấu hình như vậy, bạn phải tính đến khả năng thay đổi cấu hình đó từ các dịch vụ khác, chẳng hạn như Fail2ban. Ngoài ra, khi sử dụng địa chỉ IPv6, việc cấu hình cho IPv6 phải được thực hiện độc lập với IPv4.

IPv4

sudo iptables-save

Tạo một tập lệnh với một loạt các quy tắc iptables:

sudo nano /etc/ network/ if-up.d/ iptables-rules

Sao chép đoạn mã sau:

#!/sbin/iptables-restore -A INPUT -p icmp -j CHẤP NHẬN -A INPUT -i lo -j CHẤP NHẬN -A INPUT -j TỪ CHỐI --reject-với icmp-host-prohibited -A FORWARD -m conntrack -- ctstate LIÊN QUAN, THÀNH LẬP -j CHẤP NHẬN -A CHUYỂN TIẾP -p icmp -j CHẤP NHẬN -A CHUYỂN TIẾP -j TỪ CHỐI --reject-với icmp-host-prohibited #-A OUTPUT -p icmp -j CHẤP NHẬN #-A OUTPUT -o lo - j CHẤP NHẬN #-A OUTPUT -j TỪ CHỐI --reject-với icmp-host-bị cấm LÀM

Chúng tôi bổ sung các quy tắc cần thiết có tính đến iptables-save.

sudo chmod +x / etc/ network/ if-up.d/ iptables-rules sudo / etc/ network/ if-up.d/ iptables-rules

IPv6

Xem cấu hình hiện tại:

sudo ip6tables-save

Tạo một tập lệnh với một loạt các quy tắc ip6tables:

sudo nano /etc/ network/ if-up.d/ ip6tables-rules

Sao chép đoạn mã sau:

#!/sbin/ip6tables-khôi phục # Bảng lọc và chuỗi của nó* bộ lọc:CHẤP NHẬN ĐẦU VÀO [ 0 :0 ] :CHẤP NHẬN TIẾP THEO [ 0 :0 ] :CHẤP NHẬN ĐẦU RA [ 0 :0 ] # Cho phép kết nối được kết nối và thiết lập-A INPUT -m conntrack --ctstate LIÊN QUAN, THÀNH LẬP -j CHẤP NHẬN # Cho phép lưu lượng truy cập icmp dịch vụ-A INPUT -p ipv6-icmp -j CHẤP NHẬN # Cho phép lưu lượng truy cập đáng tin cậy vào giao diện loopback-A INPUT -i lo -j CHẤP NHẬN # Các quy tắc bổ sung cho chuỗi INPUT có thể được chèn vào đây # Vô hiệu hóa mọi thứ khác cho INPUT-A INPUT -j TỪ CHỐI --từ chối-với icmp6-adm-bị cấm # Thứ tự và ý nghĩa các quy tắc của chuỗi FORWARD và OUTPUT tương tự như INPUT-A CHUYỂN TIẾP -m conntrack --ctstate LIÊN QUAN, THÀNH LẬP -j CHẤP NHẬN -A CHUYỂN TIẾP -p ipv6-icmp -j CHẤP NHẬN -A CHUYỂN TIẾP -j TỪ CHỐI --từ chối-với icmp6-adm-bị cấm # Việc lọc chuỗi OUTPUT không được khuyến khích #-A OUTPUT -m conntrack --ctstate LIÊN QUAN, THÀNH LẬP -j CHẤP NHẬN #-A ĐẦU RA -p ipv6-icmp -j CHẤP NHẬN#-A ĐẦU RA -o lo -j CHẤP NHẬN #-A OUTPUT -j TỪ CHỐI --reject-với icmp6-adm-bị cấm LÀM

Chúng tôi bổ sung các quy tắc cần thiết có tính đến ip6tables-save.

Lưu và đóng: Ctrl + O, Enter, Ctrl + X

Làm cho tập lệnh có thể thực thi được và tải các quy tắc iptables:

sudo chmod +x / etc/ network/ if-up.d/ ip6tables-rules sudo / etc/ network/ if-up.d/ ip6tables-rules

Quy tắc bổ sung

Dưới đây là một số quy tắc được sử dụng tương đối phổ biến. Chuỗi INPUT/OUTPUT được sử dụng để lọc lưu lượng truy cập cục bộ. Đối với lưu lượng chuyển tuyến, bạn phải sử dụng chuỗi FORWARD.

Truy cập từ xa

# remote.ssh -A INPUT -p tcp -m conntrack --ctstate MỚI -m tcp --dport 22 -j CHẤP NHẬN # remote.rdp -A INPUT -p tcp -m conntrack --ctstate MỚI -m tcp --dport 3389 -j CHẤP NHẬN # remote.vnc -A INPUT -p tcp -m conntrack --ctstate MỚI -m tcp --dport 5900 -j CHẤP NHẬN

Dịch vụ web và tập tin

# web.http, web.https -A INPUT -p tcp -m conntrack --ctstate MỚI -m multiport -A INPUT -p tcp -m conntrack --ctstate MỚI -m tcp --dport 21 -j CHẤP NHẬN

Thư và tin nhắn tức thời

# mail.pop3, mail.pop3s -A INPUT -p tcp -m conntrack --ctstate MỚI -m multiport --dports 110.995 -j CHẤP NHẬN # mail.imap, mail.imaps -A INPUT -p tcp -m conntrack -- ctstate MỚI -m multiport --dports 143 ,993 -j CHẤP NHẬN # mail.smtp, mail.smtps -A INPUT -p tcp -m conntrack --ctstate MỚI -m multiport --dports 25 ,465 -j CHẤP NHẬN # im. xmpp -A INPUT -p tcp -m conntrack --ctstate MỚI -m multiport --dports 5222 ,5223 -j CHẤP NHẬN # im.icq.oscar -A INPUT -p tcp -m conntrack --ctstate MỚI -m tcp -- dport 5190 -j CHẤP NHẬN

Dịch vụ mạng

# network.openvpn.vpn -A INPUT -p udp -m conntrack --ctstate MỚI -m udp --dport 1194 -j CHẤP NHẬN # network.squid.proxy -A INPUT -p udp -m conntrack --ctstate MỚI -m udp --dport 3128 -j CHẤP NHẬN # network.dns -A INPUT -p tcp -m conntrack --ctstate MỚI -m tcp --dport 53 -j CHẤP NHẬN -A INPUT -p udp -m conntrack --ctstate MỚI -m udp --dport 53 -j CHẤP NHẬN # network.ntp -A INPUT -p udp -m conntrack --ctstate MỚI -A INPUT -p udp -m conntrack --ctstate MỚI -m udp --dport 69 -j CHẤP NHẬN # network.dhserver.dhcp.discover-request-A INPUT -p udp -m conntrack --ctstate MỚI -m udp --sport 68 --dport 67 -j CHẤP NHẬN # network.dhclient.dhcp.discover-request #-A ĐẦU RA -p udp -m conntrack --ctstate MỚI -m udp --sport 68 --dport 67 -j CHẤP NHẬN # network.dhserver.dhcp.offer-ack #-A ĐẦU RA -p udp -m conntrack --ctstate MỚI -m udp --sport 67 --dport 68 -j CHẤP NHẬN

Kiểm tra và gỡ lỗi

Xem cấu hình hiện tại của IPv4 và IPv6:

sudo iptables-save sudo ip6tables-save

Ghi nhật ký

Truy tìm

Mô-đun hạt nhân

Xem các mô-đun đã tải:

lsmod | grep -E "^ip|^nf" | loại

Để tải các mô-đun bổ sung, thuận tiện sử dụng tính năng tự động hoàn thành: Tab 2x

sudo modprobe nf sudo modprobe module-load.d