Gỡ lỗi iptables và các cạm bẫy tường lửa phổ biến?


18

Đây là một Câu hỏi Canonical được đề xuất về việc hiểu và gỡ lỗi tường lửa phần mềm trên các hệ thống Linux.

Đáp lại câu trả lời của EEAA và nhận xét của @ Shog rằng chúng tôi cần một câu hỏitrả lời kinh điển phù hợp để kết thúc những câu hỏi tương đối đơn giản phổ biến về iptables.

Một phương pháp cấu trúc để gỡ lỗi với các bức tường lửa phần mềm Linux, là gì netfilter khuôn khổ lọc gói tin, thường được gọi bằng giao diện Userland iptables ?

Những cạm bẫy phổ biến, câu hỏi định kỳ và những điều đơn giản hoặc hơi khó hiểu hơn để kiểm tra xem một quản trị viên tường lửa không thường xuyên có thể bỏ qua hoặc có lợi ích gì khi biết?

Ngay cả khi bạn sử dụng các công cụ như UFW , FirewallD (aka firewall-cmd), Shorewall hoặc tương tự, bạn có thể được hưởng lợi từ việc nhìn dưới mui xe mà không có lớp trừu tượng mà các công cụ đó cung cấp.

Câu hỏi này không có ý định làm như thế nào-Để cho việc xây dựng tường lửa: kiểm tra các tài liệu sản phẩm cho điều đó và ví dụ góp phần công thức nấu ăn để iptables Trips & Tricks hoặc tìm kiếm được gắn thẻ câu hỏi cho hiện thường xuyên và cũng coi cao điểm Hỏi và đáp.


1
Điều gì về các quy tắc NAT & stateful có thể được đặt sớm hơn trong chuỗi để cải thiện hiệu suất và tăng tính bảo mật?
Matt

1
@Matt: tối ưu hóa các quy tắc tường lửa là một câu hỏi và trả lời hoàn chỉnh và trong phần Hỏi & Đáp này tôi sẽ không mở rộng câu trả lời trước đó tôi đã đưa ra ở đây
HBruijn

1
Nếu bạn không đạt được quy tắc bạn nên có trong IPtables, hãy thêm quy tắc LOG tương tự và tiếp tục đi lên chuỗi cho đến khi bạn nhận được thông báo LOG. Sau đó, một trong những quy tắc dưới đây sẽ là quy tắc khớp không chính xác trên gói của bạn.
Matthew Ife

1
Oh và cài đặt net.netfilter.nf_conntrack_log_invalidthành 255 sẽ thu được các gói không hợp lệ khá độc đáo có thể giúp ích nếu phần trạng thái của bộ lọc mạng tạo ra hành vi xấu.
Matthew Ife

Câu trả lời:


14

Nói chung:

Xem và sửa đổi cấu hình tường lửa yêu cầu đặc quyền của quản trị viên ( root) cũng như mở các dịch vụ trong phạm vi số cổng bị hạn chế. Điều đó có nghĩa là bạn nên đăng nhập roothoặc sử dụng sudođể chạy lệnh với quyền root. Tôi sẽ cố gắng đánh dấu các lệnh như vậy với tùy chọn [sudo].

Nội dung:

  1. Vấn đề đặt hàng hoặc sự khác biệt giữa -I-A
  2. Hiển thị cấu hình tường lửa hiện tại
  3. Giải thích sự xuất hiện của iptables -L -v -n
  4. Biết môi trường của bạn
  5. Chuỗi INPUT và FORWARD
  6. Mô-đun hạt nhân

1. Vấn đề đặt hàng hoặc sự khác biệt giữa -I-A

Điều cần nhớ là các quy tắc tường lửa được kiểm tra theo thứ tự chúng được liệt kê. Nhân sẽ dừng xử lý chuỗi khi quy tắc được kích hoạt sẽ cho phép hoặc không cho phép gói hoặc kết nối.

Tôi nghĩ rằng lỗi phổ biến nhất đối với người quản trị tường lửa mới làm quen là họ tuân theo các hướng dẫn chính xác để mở một cổng mới, chẳng hạn như cổng dưới đây:

[sudo] iptables -A INPUT -i eth0 -p tcp --dport 8080 -j ACCEPT

và sau đó khám phá ra rằng nó sẽ không có hiệu lực.

Lý do cho điều đó là -Atùy chọn thêm quy tắc mới đó, sau tất cả các quy tắc hiện có và vì thông thường quy tắc cuối cùng trong tường lửa hiện tại là một quy tắc chặn tất cả lưu lượng truy cập không được phép rõ ràng, dẫn đến

...
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited
8        0  0    ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:8080

Hoặc tương đương trong iptables-save:

...
iptables -A INPUT  -j REJECT
iptables -A INPUT  -p tcp --dport 8080 -j ACCEPT

và quy tắc mới mở cổng TCP 8080 sẽ không bao giờ đạt được. (bằng chứng là các bộ đếm vẫn ngoan cố ở mức 0 gói và 0 byte).

Bằng cách chèn quy tắc với quy tắc -Imới sẽ là quy tắc đầu tiên trong chuỗi và sẽ hoạt động.

2. Hiển thị cấu hình tường lửa hiện tại

Đề nghị của tôi cho người quản trị tường lửa là xem xét cấu hình thực tế mà nhân Linux đang chạy, thay vì cố gắng chẩn đoán các sự cố tường lửa từ các công cụ thân thiện với người dùng. Thông thường một khi bạn hiểu các vấn đề tiềm ẩn, bạn có thể dễ dàng giải quyết chúng trong một vấn đề được hỗ trợ bởi các công cụ đó.

Lệnh [sudo] iptables -L -v -nlà bạn của bạn (mặc dù một số người thích iptables-savetốt hơn). Thông thường khi thảo luận về cấu hình, rất hữu ích khi sử dụng --line-numberstùy chọn cũng như các dòng số. Tham khảo quy tắc #X làm cho việc thảo luận về chúng có phần dễ dàng hơn.
Lưu ý: Các quy tắc NAT được bao gồm trong iptables-saveđầu ra nhưng phải được liệt kê riêng bằng cách thêm -t nattùy chọn tức là [sudo] iptables -L -v -n -t nat --line-numbers.

Chạy lệnh nhiều lần và kiểm tra các bộ đếm tăng có thể là một công cụ hữu ích để xem liệu một quy tắc mới có thực sự được kích hoạt hay không.

[root@host ~]# iptables -L -v -n
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1     784K   65M fail2ban-SSH  tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
2    2789K  866M ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
3       15  1384 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0
4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:22
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:80
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           state NEW tcp dpt:443
7    2515K  327M REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       0.0.0.0/0            0.0.0.0/0           reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT 25 packets, 1634 bytes)
num   pkts bytes target     prot opt in     out     source               destination

Chain fail2ban-SSH (1 references)
num   pkts bytes target     prot opt in     out     source               destination
1        0     0 REJECT     all  --  *      *       117.239.37.150       0.0.0.0/0           reject-with icmp-port-unreachable
2        4   412 REJECT     all  --  *      *       117.253.208.237      0.0.0.0/0           reject-with icmp-port-unreachable

Ngoài ra, đầu ra của iptables-saveđưa ra một tập lệnh có thể tạo lại cấu hình tường lửa ở trên:

[root@host ~]# iptables-save
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [441:59938]
:fail2ban-SSH - [0:0]
-A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 443 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
-A fail2ban-SSH -s 117.239.37.150/32 -j REJECT --reject-with icmp-port-unreachable
-A fail2ban-SSH -s 117.253.208.237/32 -j REJECT --reject-with icmp-port-unreachable
COMMIT

Đó là vấn đề ưu tiên những gì bạn sẽ thấy dễ hiểu hơn.

3. Giải thích thông số của iptables -L -v -n

Các chính sách thiết lập hành động mặc định việc sử dụng chuỗi khi không có trận đấu quy tắc rõ ràng. Trong INPUTchuỗi được đặt thành CHẤP NHẬN tất cả lưu lượng.

Quy tắc đầu tiên trong chuỗi INPUT ngay lập tức là một quy tắc thú vị, nó gửi tất cả lưu lượng truy cập (nguồn 0.0.0.0/0 và đích 0.0.0.0/0) dành cho cổng TCP 22 ( tcp dpt:22) cổng mặc định cho SSH đến mục tiêu tùy chỉnh ( fail2ban-SSH) . Như tên cho thấy quy tắc này được duy trì bởi fail2ban (một sản phẩm bảo mật trong số những thứ khác quét các tệp nhật ký hệ thống để có thể lạm dụng và chặn địa chỉ IP của kẻ lạm dụng).

Quy tắc đó đã được tạo bởi một dòng lệnh iptables tương tự iptables -I INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSHhoặc được tìm thấy trong đầu ra của iptables-save as -A INPUT -p tcp -m tcp --dport 22 -j fail2ban-SSH. Thường thì bạn sẽ tìm thấy một trong những ký hiệu đó trong tài liệu.

Các bộ đếm chỉ ra rằng quy tắc này đã khớp với 784'000 gói và 65 Megabyte dữ liệu.

Lưu lượng phù hợp với quy tắc đầu tiên này sau đó được xử lý bởi fail2ban-SSHchuỗi, như một chuỗi không chuẩn, được liệt kê bên dưới chuỗi OUTPUT.

Chuỗi đó bao gồm hai quy tắc, một quy tắc cho mỗi kẻ lạm dụng (địa chỉ ip nguồn 117.253.221.166 hoặc 58.218.211.166) bị chặn (với a reject-with icm-port-unreachable).

 -A fail2ban-SSH -s 117.253.221.166/32 -j REJECT --reject-with icmp-port-unreachable
 -A fail2ban-SSH -s 58.218.211.166/32 -j REJECT --reject-with icmp-port-unreachable

Các gói SSH không có trong các máy chủ bị chặn đó không được phép cũng như không được phép và bây giờ chuỗi tùy chỉnh đã hoàn thành sẽ được kiểm tra theo quy tắc thứ hai trong chuỗi INPUT.

Tất cả các gói không dành cho cổng 22 đã vượt qua quy tắc đầu tiên trong chuỗi INPUT và cũng sẽ được đánh giá theo quy tắc INPUT # 2.

Quy tắc INPUT số 2 làm cho điều này được dự định là một tường lửa đầy đủ , theo dõi các kết nối. Điều đó có một số lợi thế, chỉ các gói cho các kết nối mới cần được kiểm tra theo bộ quy tắc đầy đủ, nhưng một khi đã cho phép các gói bổ sung thuộc kết nối được thiết lập hoặc liên quan được chấp nhận mà không cần kiểm tra thêm.

Quy tắc đầu vào # 2 khớp với tất cả các kết nối và gói liên quan mở và phù hợp với quy tắc đó sẽ không cần phải đánh giá thêm.

Lưu ý: thay đổi quy tắc trong cấu hình của tường lửa trạng thái sẽ chỉ ảnh hưởng đến các kết nối mới, không được thiết lập kết nối.

Ngược lại, bộ lọc gói đơn giản kiểm tra mọi gói theo bộ quy tắc đầy đủ mà không theo dõi trạng thái kết nối. Trong một tường lửa như vậy, không có từ khóa nhà nước sẽ được sử dụng.

Quy tắc INPUT # 3 khá nhàm chán, tất cả lưu lượng truy cập kết nối với logiao diện loopback ( hoặc 127.0.0.1) đều được cho phép.

Các quy tắc INPUT 4, 5 và 6 được sử dụng để mở các cổng TCP 22, 80 và 443 (các cổng mặc định cho resp. SSH, HTTP và HTTPS) bằng cách cấp quyền truy cập vào các kết nối MỚI (các kết nối hiện có đã được cho phép theo quy tắc INPUT 2).

Trong tường lửa không trạng thái, các quy tắc đó sẽ xuất hiện mà không có các thuộc tính trạng thái:

4    44295 2346K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
5    40120 2370K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0
6    16409  688K ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0

hoặc là

-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT

Quy tắc INPUT cuối cùng, # 7 là quy tắc chặn tất cả lưu lượng truy cập KHÔNG được cấp quyền truy cập trong quy tắc INPUT 1-7. Một quy ước khá phổ biến: mọi thứ không được phép đều bị từ chối. Về lý thuyết, quy tắc này có thể đã được bỏ qua bằng cách đặt CHÍNH SÁCH mặc định thành DỰ ÁN.

Luôn luôn điều tra toàn bộ chuỗi.

4. Biết môi trường của bạn

4.1. Các cài đặt trong tường lửa phần mềm sẽ không ảnh hưởng đến các cài đặt bảo mật được duy trì ở nơi khác trong mạng, tức là mặc dù mở dịch vụ mạng với iptablesdanh sách kiểm soát truy cập chưa sửa đổi trên bộ định tuyến hoặc tường lửa khác trong mạng của bạn vẫn có thể chặn lưu lượng truy cập ...

4.2. Khi không có dịch vụ nào lắng nghe, bạn sẽ không thể kết nối và gặp lỗi từ chối kết nối , bất kể cài đặt tường lửa. Vì thế:

  • Xác nhận rằng một dịch vụ đang lắng nghe (trên giao diện mạng / địa chỉ ip chính xác) và sử dụng số cổng bạn mong muốn [sudo] netstat -plnuthoặc sử dụng thay thế ss -tnlp.
  • Nếu các dịch vụ của bạn chưa được chạy, hãy mô phỏng một trình nghe đơn giản với netcat chẳng hạn: [sudo] nc -l -p 123hoặc openssl s_server -accept 1234 [options] nếu bạn cần một trình nghe TLS / SSL (kiểm tra man s_servercác tùy chọn).
  • Xác minh rằng bạn có thể kết nối từ chính máy chủ tức là telnet <IP of Server> 123hoặc echo "Hello" | nc <IP of Server> 123khi kiểm tra dịch vụ bảo mật TLS / SSL openssl s_client -connect <IP of Server>:1234, trước khi thử tương tự từ máy chủ từ xa.

4.3. Hiểu các giao thức được sử dụng bởi các dịch vụ của bạn. Bạn không thể bật / tắt các dịch vụ mà bạn không hiểu đầy đủ. Ví dụ:

  • TCP hoặc UDP được sử dụng hay cả hai (như với DNS)?
  • dịch vụ có sử dụng cổng mặc định cố định không (ví dụ như cổng TCP 80 cho máy chủ web)?
  • cách khác là số cổng động được chọn có thể thay đổi (ví dụ: các dịch vụ RPC như NFS cổ điển đăng ký với Portmap)?
  • FTP khét tiếng thậm chí sử dụng hai cổng , cả số cổng cố định và số động khi được định cấu hình để sử dụng chế độ thụ động ...
  • các mô tả dịch vụ, cổng và giao thức /etc/serviceskhông nhất thiết phải khớp với dịch vụ thực tế sử dụng cổng.

4.4. Bộ lọc gói hạt nhân không phải là thứ duy nhất có thể hạn chế kết nối mạng:

  • SELinux cũng có thể hạn chế các dịch vụ mạng. getenforcesẽ xác nhận nếu SELinux đang chạy.
  • Mặc dù việc trở thành TCP Wrappers hơi khó hiểu vẫn là một công cụ mạnh mẽ để thực thi bảo mật mạng. Kiểm tra với ldd /path/to/service |grep libwrapvà các /hosts.[allow|deny]tập tin kiểm soát.

5. INPUThoặc FORWARDChuỗi

Khái niệm về chuỗi được giải thích kỹ hơn ở đây nhưng ngắn gọn là:

Các INPUTchuỗi là nơi bạn mở và / hoặc cổng mạng gần cho các dịch vụ đang chạy tại địa phương, trên máy chủ, nơi bạn phát hành các lệnh iptables.

Các FORWARDchuỗi là nơi bạn áp dụng quy tắc cho giao thông bộ lọc đó được chuyển tiếp bởi hạt nhân với các hệ thống khác, các hệ thống thực tế mà còn container Docker và Virtual Servers khách máy chủ khi máy Linux của bạn là hành động như một cầu nối, router, hypervisor và / hoặc làm địa chỉ mạng dịch thuật và chuyển tiếp cổng.

Một quan niệm sai lầm phổ biến là vì một container docker hoặc KVM khách chạy cục bộ, các quy tắc bộ lọc được áp dụng phải nằm trong chuỗi INPUT, nhưng đó thường không phải là trường hợp.

6. Mô-đun hạt nhân

Vì bộ lọc gói chạy trong nhân Linux, nó cũng có thể được biên dịch thành mô-đun động, nhiều mô-đun thực sự. Hầu hết các bản phân phối bao gồm bộ lọc mạng như các mô-đun và các mô-đun bộ lọc mạng cần thiết sẽ được tải vào kernel khi cần, nhưng đối với một số mô-đun, quản trị viên tường lửa sẽ cần đảm bảo chúng được tải theo cách thủ công. Điều này chủ yếu liên quan đến các mô-đun theo dõi kết nối, chẳng hạn như nf_conntrack_ftpcó thể được tải với insmod.

Các mô-đun hiện được tải vào kernel đang chạy có thể được hiển thị với lsmod.

Phương pháp để đảm bảo các mô-đun được tải liên tục trong các lần khởi động lại phụ thuộc vào bản phân phối Linux.


1
Khi tìm kiếm bộ đếm gói / byte tăng. Một công cụ hữu ích là sử dụng đồng hồ, ở chế độ khác biệt. Vì vậy, một cái gì đó như thế này : watch --difference -n 1 iptables -L FORWARD -v -n. Để công cụ định kỳ chạy lệnh và làm nổi bật các thay đổi làm cho nó dễ dàng hơn nhiều.
Zoredache

1
Tôi chỉ thấy bình luận chậm chạp của bạn. Đây là một câu trả lời tốt, không chắc chắn tôi có thể thêm nhiều. Bạn có thể muốn bao gồm một đề cập về việc sử dụng tính năng TRACE .
Zoredache

Tôi sẽ lấy iptables-saveđầu ra (tốt nhất là với -c) mỗi lần so iptables -Lvới đầu ra đáng sợ này (với nhiều đối số khác nhau).
0xC0000022L

7

Các vấn đề phổ biến với các giao thức khác nhau

DNS: DNS sử dụng cổng 53 UDP theo mặc định, nhưng các thông báo không phù hợp trong một datagram UDP duy nhất sẽ được truyền bằng TCP thay vào đó (thường là chuyển vùng và như vậy) yêu cầu cổng 53 TCP cũng được mở khi bạn chạy máy chủ tên .

Email: Nhiều lưu lượng truy cập SMTP của ISP tiêu dùng (hoặc ít nhất là cổng mặc định TCP 25), khiến không thể trực tiếp nhận hoặc gửi email và khách hàng của họ buộc phải sử dụng chuyển tiếp SMTP của ISP cho tất cả email gửi đi và đôi khi cho cả email đến . Liên quan đến §1.1.

FTP: FTP là một giao thức kỳ lạ liên quan đến hai kết nối được sử dụng. Đầu tiên là kết nối điều khiển, theo mặc định, một máy chủ FTP sẽ lắng nghe trên cổng TCP 21. Kết nối điều khiển được sử dụng để xác thực và ra lệnh. Truyền tệp thực tế và những thứ như đầu ra của danh sách thư mục đi qua kết nối TCP thứ hai, kết nối DATA. Trong FTP hoạt động, kết nối DATA sẽ được bắt đầu từ máy chủ FTP từ cổng TCP 20 và kết nối với máy khách FTP. FTP hoạt động không hoạt động quá tốt với người dùng đằng sau tường lửa và cổng NAT nên hầu như không sử dụng được. Thay vào đó, hầu hết các máy chủ FTP đều hỗ trợ FTP thụ động. Với FTP thụ động, máy chủ FTP sẽ mở một trình lắng nghe cho kết nối DATA trên cổng thứ hai, sau đó máy khách FTP có thể kết nối. Vấn đề đối với tường lửa là cổng DATA có thể là bất kỳ cổng không có sẵn nào trong khoảng từ 1024-65536.

Trong một tường lửa không trạng thái thường được giải quyết bằng cách hạn chế số lượng cổng thụ động mà máy chủ FTP có thể chỉ định và sau đó mở rõ ràng các cổng đó. I E

iptables -A INPUT -p tcp --match multiport --dports 21000:21050 -j ACCEPT

Trong tường lửa có trạng thái, bạn không cần phải mở cổng DATA một cách rõ ràng, mô đun trình trợ giúp bộ lọc mạng sẽ nhận ra cổng động được gán và mở động cổng đó cho máy khách chính xác bằng cách đánh dấu kết nối DATA như RELATEDsau nó sẽ khớp với quy tắc chung :

  iptables -I INPUT -p tcp -m state ESTABLISHED,RELATED -j ACCEPT

Điều này đòi hỏi mô-đun hạt nhân chính xác được tải, trong trường hợp FTP bằng tay bằng cách chạy chẳng hạn insmod nf_conntrack_ftp, làm cho việc liên tục khởi động lại phụ thuộc vào quá trình khởi động lại phụ thuộc vào phân phối.

Lưu ý: Mô-đun theo dõi kết nối FTP sẽ không thành công khi FTP được sử dụng với SSL, vì kết nối điều khiển sẽ được mã hóa và nf_conntrack_ftp sẽ không thể đọc lại PASV nữa.

NFS và các dịch vụ RPC tương tự : Vấn đề với các dịch vụ RPC là do thiết kế chúng không sử dụng một cổng cố định cụ thể. Họ có thể chọn bất kỳ cổng khả dụng nào một cách ngẫu nhiên, sau đó sẽ được đăng ký với trình nền RPC Portmap. Một khách hàng đang cố gắng kết nối sẽ truy vấn daemon Portmap và sau đó kết nối trực tiếp với cổng chính xác. Điều đó đã giải quyết vấn đề hết cổng dành riêng ...

Từ góc độ tường lửa, cổng TCP / UDP 111 cần được mở và cổng thực tế mà dịch vụ RPC hiện đang sử dụng. Vấn đề mở một cổng ngẫu nhiên như vậy trong tường lửa thường được giải quyết bằng cách hạn chế dịch vụ RPC, chẳng hạn như máy chủ NFS, để sử dụng cổng cố định được xác định trước.


7

Iptables / Tường lửa "giới thiệu"

Tường lửa về cơ bản là một bộ lọc mạng dựa trên chính sách. Tường lửa Linux được xây dựng xung quanh Netfilter; khung xử lý gói mạng của kernel được tạo từ một số mô-đun kernel thực hiện các tác vụ cụ thể:

  1. Mô-đun LỌC (luôn được tải theo mặc định) chủ yếu cho phép chúng tôi CHẤP NHẬN hoặc gói DROP IP dựa trên một tiêu chí phù hợp nhất định.
  2. Bộ mô-đun NAT cho phép chúng tôi thực hiện Dịch địa chỉ mạng (SNAT, DNAT, MASQUERADE).
  3. Mô-đun MANGLE cho phép chúng ta thay đổi các trường gói IP nhất định (TOS, TTL).

Người dùng định cấu hình khung Netfilter để phù hợp với nhu cầu tường lửa của họ bằng cách sử dụng iptables từ dòng lệnh. Với iptables, chúng tôi xác định các quy tắc hướng dẫn kernel phải làm gì với các gói IP khi chúng đến, đi qua hoặc rời khỏi hộp Linux của chúng tôi. Mỗi quy trình chính của Netfilter được thể hiện bằng BẢNG (LỌC, NAT, MANGLE) trên biệt ngữ iptables. Chúng có một số điểm hook cụ thể trên sơ đồ luồng gói mạng nơi hạt nhân được gọi để thực hiện nhiệm vụ của chúng. Một số chuỗi được xác định cụ thể của các cuộc gọi BẢNG được gọi chung là các CHAINS tích hợp nhận các tên của PREROUTING, INPUT, FORWARD, OUTPUT và POSTROUTING. Thật dễ nhớ nếu chúng ta liên kết BẢNG với "loại quy trình" và CHAIN ​​với "vị trí" trên sơ đồ luồng gói mạng nơi các phiên bản của các quy trình đó được gọi.

nhập mô tả hình ảnh ở đây

Do gói IP được nhận trên giao diện mạng hoặc được tạo bởi quy trình cục bộ, cho đến khi cuối cùng nó được phân phối hoặc loại bỏ, công cụ Netfilter sẽ kiểm tra tuần tự và áp dụng các quy tắc có trong sơ đồ luồng gói mạng. Tại mỗi khối được xác định bởi cặp TABLE @ CHAIN, người dùng có thể thêm một hoặc nhiều quy tắc liên tiếp này chứa tiêu chí khớp gói IP và một quá trình hành động tương ứng. Có những hành động (ví dụ: CHẤP NHẬN, DROP, v.v.) có thể được thực hiện bởi nhiều hơn một BẢNG và các hành động khác (ví dụ SNAT, DNAT, v.v.) là BẢNG cụ thể.

tức là khi một gói IP đến từ một giao diện mạng, nó được xử lý đầu tiên bởi chuỗi PREROUTING gọi các quy tắc do người dùng bảng MANGLE xác định nếu có. Nếu không có quy tắc nào khớp với gói hiện tại, thì hành động hoặc "chính sách" mặc định của MANGLE @ PREROUTING sẽ được áp dụng. Tại thời điểm này, nếu gói không bị hủy, quá trình sẽ tiếp tục gọi các quy tắc của bảng NAT tại chuỗi PREROUTING (xem bản đồ), v.v. Để tạo điều kiện bố trí quy tắc, người dùng cũng có thể tạo chuỗi tùy chỉnh của riêng mình và "nhảy" vào chúng từ các điểm khác nhau của bản đồ theo ý muốn.

nhập mô tả hình ảnh ở đây

Mặc dù các chuỗi tích hợp có thể có các chính sách do người dùng xác định là các gói ACCEPT hoặc DROP, các chuỗi do người dùng xác định luôn có chính sách mặc định không thể thay đổi của RETURN cho người gọi để tiếp tục quá trình.

Lệnh Iptables

Các lệnh chính của iptables điền vào sơ đồ luồng gói mạng với các quy tắc xử lý được yêu cầu.

Quy tắc iptables chung có thể được viết là:

# iptables <table> <Add/Insert/Delete> <CHAIN> <PKT_MATCHING_CRITERIA> <ACTION>

Nó có thể được đọc như sau:

Netfilter (kernel module) please <Add/Insert/Delete> this rule for <table> at <CHAIN> where packets matching <PKT_MATCHING_CRITERIA> have to be <ACTION>ed

<table>
  -t filter       (the filter table is assumed when omitted)
  -t nat
  -t mangle 

<Add/Insert/Delete>
  -A              (append rule at the end of the chain list)
  -I              (insert rule at the begining of the chain list)
  -D              (Delete rule)

<CHAIN>
  PREROUTING
  INPUT
  FORWARD
  OUTPUT
  POSTROUTING
  USER_DEFINED_CHAIN

<PKT_MATCHING_CRITERIA>
ISO Level-2 matching:
  -i [!] <if_name>    or --in-interface [!] <if_name>
          (OUTPUT and POSTROUTING chains cannot match on input  interfaces)
  -o [!] <if_name>    or --out-interface [!] <if_name>
          (INPUT  and PREROUTING  chains cannot match on output interfaces) 
    -mac-source [!] <xx-xx-xx-xx-xx-xx>
            (OUTPUT and POSTROUTING chains cannot match on input  interfaces)

ISO Level-3 matching:
  -s [!] <src_ip>     or --src [!] <src_ip>   or --source [!] <src_ip>
  -d [!] <dst_ip>     or --src [!] <dst_ip>   or --destination [!] <dst_ip>

ISO Level-4 matching:
  -p [!] <prot_name>    or --protocol [!] <prot_name>  (udp|tcp|icmp)

  Also available when ICMP protocol is defined
  --icmp-type [!] <icmp_type>

  Also available when UDP protocol is defined
  --source-port [!] <udp_src_port>      or --sport [!] <udp_src_port>
  --destination-port [!] <udp_dst_port> or --dport [!] <udp_dst_port>

  Also available when TCP protocol is defined
  --source-port [!] <tcp_src_port>      or --sport [!] <tcp_src_port>
  --destination-port [!] <tcp_dst_port> or --dport [!] <tcp_dst_port>
  --tcp-flags [!] <tcp_flags>   (SYN|ACK|FIN|RST|URG|PSH|ALL|NONE)
    --syn
  --tcp-option [!] <tcp_option#>

  --state [!] <state>
  -m <match> [options]

    note: [!] = negation operator

<ACTION>                (also called TARGET)
  -j ACCEPT             (process continues with rules of the next table in map)
  -j DROP               (discard current packet)
  -j REJECT             (discard current packet with ICMP notification)
      option:
      --reject-with <reject_type>
  -j USER_DEFINED_CHAIN   (start traversing USER_DEFINED_CHAIN rules)
  -j RETURN               (return from USER_DEFINED_CHAIN)
  -j LOG                  (log to syslog, then process next rule in table)
      options:
      --log-level <level>
      --log-prefix <prefix>
      --log-tcp-sequence
      --log-tcp-options
      --log-ip-options
      --log-uid

nat table specific
  -j SNAT             (rewrite the source IP address of the packet)
      option:
      --to <ip_address>
  -j SAME             (idem SNAT; used when more than one source address)
      options:
      --nodst 
      --to <a1-a2>
  -j MASQUERADE       (idem SNAT; used when the replace IP is dynamic)
  -j DNAT             (rewrite the destination IP address of the packet)
      option:
      --to <ip_address>
  -j REDIRECT         (rewrite dst IP to 127.0.0.1, PREROUTING and OUTPUT only)
      option:
      –-to-port <port#>

mangle table specific
  -j ROUTE            (explicitly route packets, valid at PREROUTING)
      options:
      --iface <iface_name>
      --ifindex <iface_idx>
  -j MARK             (set Netfilter mark values)
      options:
      --set-mark <value>
      --and-mark <value>
      --or-mark <value> 
  -j TOS              (set the IP header Type of Service field) 
      option:
      --set-tos <value>
  -j DSCP             (set the IP header Differentiated Services Field)
      options:
      --set-dscp <value>
      --set-dscp-class <class>
  -j TTL              (set the IP header Time To Live field)
      options:
      --ttl-set <value>
      --ttl-dec <value>
      --ttl-inc <value>

Các lệnh phụ trợ iptables hoàn thành kịch bản cài đặt conditoins mặc định, quy tắc liệt kê, quy tắc xóa, v.v.

#iptables -t <table> -L             
       (Lists the <table> rules in all chains)
#iptables -t <table> -L <CHAIN>     
       (Lists the <table> rules in <CHAIN>)

#iptables -t <table> -N <CHAIN>     
       (Creates a user-defined <CHAIN> for holding <table> rules)
#iptables -t <table> -E <CHAIN> <NEWCHAIN>  
       (Renames <CHAIN> that holds <table> rules to <NEWCHAIN>)

#iptables -t <table> -X   
       (Deletes all user-defined chains created for holding <table> rules)
#iptables -t <table> -X <CHAIN>
       (Deletes user-defined <CHAIN> created for holding <table> rules)

#iptables -t <table> -P <CHAIN> <ACTION>     where <ACTION> = ACCEPT|DROP
       (Sets the default policy of <table> rules at <CHAIN> to <ACTION>)

#iptables -t <table> -F             
       (Flushes (deletes) all <table> rules in all chains)
#iptables -t <table> -F <CHAIN>
       (Flushes (deletes) all <table> rules in <CHAIN>)

#iptables -t <table> -R <CHAIN> <INDEX> <NEWRULE>
       (Replaces <table> rule at position <INDEX> in <CHAIN> with <NEWRULE>

Iptables tải các lệnh của chúng tôi vào công cụ Netfilter trong thời gian chạy, Netfilter inmediatelly thực thi các quy tắc và cài đặt được tải nhưng chúng không tồn tại. Afeter khởi động lại tất cả các quy tắc và cài đặt Netfilter đã tải trước đó sẽ bị mất. Vì lý do này, có các tiện ích iptables cho phép lưu quy tắc hiện đang hoạt động vào một tệp và tải lại sau.

#iptables-save > fileName
      (Save the currently active Netfilter ruleset to fileName)

#iptables-restore < fileName
      (Restore Netfilter ruleset to the one saved in fileName)

Tóm tắt Iptables

Netfilter là một khung cực kỳ linh hoạt và mạnh mẽ nhưng có một cái giá phải trả cho nó; Iptables là phức tạp. Từ quan điểm người dùng, các thuật ngữ nhất định như BẢNG, CHAIN, TARGET không thực sự khớp với khái niệm mà họ đại diện và không có nhiều ý nghĩa lúc đầu. Chủ đề dài, các lệnh dường như có một danh sách vô tận các tham số. Để làm cho mọi thứ tồi tệ hơn, không có một cuốn sách nào thực sự làm chủ Iptables. Họ chủ yếu rơi vào hai loại: "sách công thức" hoặc "sách manpage". Tôi nghĩ phần giới thiệu này cung cấp cho bạn một ảnh chụp nhanh về phong cảnh Netfilter / Iptables cộng với liều lượng cần thiết của các công cụ quản lý được tiêu hóa trước. Nếu bạn là người mới ở iptables, sau khi đọc những đoạn này một vài lần, bạn sẽ sẵn sàng để đọc các ví dụ về iptables. Với một số thực hành, bạn sẽ sớm thấy mình viết ra các quy tắc của riêng bạn.

Tường lửa

Tường lửa chủ yếu được thiết kế để tự động cho phép hoặc từ chối lưu lượng mạng dựa trên một bộ quy tắc. Tại thời điểm này, thật dễ hiểu tại sao khung Linux Netfilter / Iptables hoàn hảo cho việc xây dựng tường lửa. Nhìn vào sơ đồ luồng gói mạng, chúng tôi thấy hai điểm đặc biệt thú vị trên bảng LỌC tại chuỗi INPUT và FORWARD; Chúng tôi có thể quyết định theo địa chỉ nguồn IP, giao thức IP (UDP / TCP), cổng đích (80, 21, 443, v.v.), v.v., nếu chúng tôi CHẤP NHẬN, DỰ ÁN hoặc chỉ DROP một gói IP cụ thể. Đây là những gì tường lửa thực hiện 80% thời gian khi tức là bảo vệ máy chủ web khỏi các yêu cầu mạng trái phép. 20% thời gian còn lại là thao tác các gói mạng (NAT, MANGLE).

Kịch bản tường lửa

Có hàng trăm bố cục tường lửa khác nhau bổ sung các nhu cầu khác nhau nhưng 3 trong số chúng có thể được coi là các tình huống tường lửa điển hình nhất.

  1. Máy chủ web đơn giản với một hoặc nhiều giao diện được kết nối với Internet. Chính sách bao gồm các quy tắc cơ bản để cho phép truy cập trong nước bị hạn chế, truy cập ra ngoài không bị hạn chế và các quy tắc chống giả mạo. Chuyển tiếp IP bị tắt.
  2. Tường lửa này kết nối với Internet và với một khu vực nội bộ được bảo vệ. Chính sách bao gồm các quy tắc cơ bản để cho phép truy cập trong nước bị hạn chế, truy cập ra ngoài không bị hạn chế và các quy tắc chống giả mạo. Vì khu vực được bảo vệ sử dụng địa chỉ IP riêng nên cần có nguồn NAT. Chuyển tiếp IP được bật.
  3. Tường lửa này kết nối với Internet, khu vực được bảo vệ và phi quân sự nội bộ. Chính sách bao gồm các quy tắc cơ bản để cho phép truy cập trong nước bị hạn chế, truy cập ra ngoài không bị hạn chế và các quy tắc chống giả mạo. Vì các khu vực được bảo vệ và DMZ sử dụng địa chỉ IP riêng nên họ cần NAT nguồn và đích. Chuyển tiếp IP được bật. nhập mô tả hình ảnh ở đây

Tôi đã viết thư này cho: http://www.vercot.com/~jeoss/howto/JeossPalFirewall.html

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.