Địa chỉ IP nguồn trắng trong CentOS 7


23

Tôi muốn thiết lập tường lửa CentOS 7 sao cho tất cả các yêu cầu đến sẽ bị chặn ngoại trừ các địa chỉ IP ban đầu mà tôi đưa vào danh sách trắng. Và đối với các địa chỉ IP Whitelist, tất cả các cổng nên có thể truy cập được.

Tôi có thể tìm thấy một vài giải pháp (không chắc chúng có hoạt động không) iptablesnhưng sử dụng CentOS 7 firewalld. Tôi không thể tìm thấy một cái gì đó tương tự để đạt được với firewall-cmdlệnh.

Các giao diện nằm trong Khu vực công cộng. Tôi cũng đã chuyển tất cả các dịch vụ sang Khu vực công cộng rồi.

Câu trả lời:


44

Tôi sẽ thực hiện điều này bằng cách thêm nguồn vào một vùng. Kiểm tra đầu tiên những nguồn có cho khu vực của bạn:

firewall-cmd --permanent --zone=public --list-sources

Nếu không có, bạn có thể bắt đầu thêm chúng, đây là "danh sách trắng" của bạn

firewall-cmd --permanent --zone=public --add-source=192.168.100.0/24
firewall-cmd --permanent --zone=public --add-source=192.168.222.123/32

(Điều đó thêm toàn bộ /24và một IP duy nhất, để bạn có một tham chiếu cho cả mạng con và IP đơn)

Đặt phạm vi cổng bạn muốn mở:

firewall-cmd --permanent --zone=public --add-port=1-22/tcp
firewall-cmd --permanent --zone=public --add-port=1-22/udp

Đây chỉ là cổng 1 đến 22. Bạn có thể mở rộng cổng này, nếu bạn muốn.

Bây giờ, tải lại những gì bạn đã làm.

firewall-cmd --reload

Và kiểm tra công việc của bạn:

 firewall-cmd --zone=public --list-all

Ghi chú / biên tập phụ: Không thành vấn đề nhưng tôi thích khu vực "đáng tin cậy" cho một bộ IP được liệt kê trắng trong tường lửa. Bạn có thể đánh giá thêm bằng cách đọc các đề xuất của redhat về việc chọn một khu vực .

Xem thêm:


Nếu bạn muốn các DROPgói bên ngoài nguồn này, thì đây là một ví dụ để loại bỏ những thứ bên ngoài /24tôi đã sử dụng làm ví dụ trước đó, bạn có thể sử dụng các quy tắc phong phú cho điều này , tôi tin. Đây là khái niệm, tôi chưa thử nghiệm nó (ngoài việc thấy rằng centos 7 chấp nhận lệnh), nhưng, đủ dễ để làm một pcap và xem liệu nó có hoạt động như bạn mong đợi không

firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.100.0/24" invert="True" drop'

Cảm ơn rất nhiều vì đã trả lời. Không thể bỏ phiếu do thiếu danh tiếng. Nhưng làm cách nào để tôi loại bỏ tất cả các IP khác ngoại trừ IP mà tôi đã thêm bằng cách sử dụng các nguồn?
Krishnandu Sarkar

Cảm ơn @KrishnanduSarkar - theo mặc định, đó là một từ chối ICMP. Nhưng, tôi nghĩ bạn có thể thêm một quy tắc phong phú để loại bỏ các gói. Tôi đã thêm một ví dụ cho câu trả lời của tôi mà tôi nghĩ sẽ làm việc. Cảm ơn về upvote, tôi hiểu, nếu một câu trả lời hoạt động, hãy xem xét chấp nhận một câu trả lời.
dougBTV

Câu trả lời tuyệt vời, tôi đã sử dụng iptables cho đến bây giờ.
Hàng chục

(!) Câu trả lời này sẽ không hoạt động như mong đợi đối với cấu hình FirewallD mặc định hiện tại (các giao diện được gán cho vùng công khai theo mặc định).
dess

24

Ngay cả khi một câu trả lời đã được chấp nhận và bỏ phiếu, tôi không nghĩ đó là một câu trả lời đúng. Tôi không tìm thấy lời giải thích rõ ràng trong tài liệu, nhưng từ hành vi được thực hiện, nó trông như thế:

  1. giao diện và nguồn được sử dụng làm bộ chọn - vùng nào sẽ kích hoạt
  2. cả hai đều bị bỏ qua cho vùng mặc định (luôn hoạt động)

Vì vậy, câu trả lời sẽ là:

  1. khóa vùng mặc định, nói "công khai" - không có cổng nào mở hoặc dịch vụ khả dụng
  2. trong vùng khác, nói "công việc" - xác định cổng nguồn và cổng mở

Ví dụ: giả sử vùng mặc định là công khai và không có cổng mở, hãy thêm phạm vi nguồn và cổng vào vùng "làm việc":

$ sudo firewall-cmd --zone=work --add-source=192.168.0.0/24
$ sudo firewall-cmd --zone=work --add-port=8080-8090/tcp

Bây giờ hãy kiểm tra các vùng hoạt động (vùng mặc định luôn hoạt động):

$ sudo firewall-cmd --get-active-zones

bạn sẽ nhận được:

work
  sources: 192.168.0.0/24

vì vậy quy tắc vùng "làm việc" sẽ được áp dụng cho mạng con cụ thể. Bạn sẽ có một loạt các cổng mở cho "danh sách trắng" = mạng con theo yêu cầu. Và tất nhiên sử dụng --permanenttùy chọn trong các --add-xxxcâu lệnh để làm cho hành vi dính vào.

Đổi lại, bất kỳ cổng hoặc dịch vụ nào bạn có trong vùng "công khai" (mặc định) sẽ áp dụng cho tất cả các giao diện và địa chỉ nguồn.

$ sudo firewall-cmd --list-all-zones

public (default)
interfaces:
sources:
services:
ports: 
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

work (active)
interfaces: 
sources: 192.168.0.0/24
services: dhcpv6-client ipp-client ssh
ports: 8080-8090/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:

Hệ thống tương tự làm việc cho các giao diện. Nói bằng cách thêm giao diện "ske3" vào vùng "làm việc":

$ sudo firewall-cmd --zone=work --add-interface=ens3

bạn sẽ sử dụng quy tắc vùng "công việc" cho bất kỳ yêu cầu nào từ giao diện cụ thể - bộ chọn thô hơn so với "nguồn".


4
Đây là câu trả lời tốt nhất. Phần quan trọng nhất là lời giải thích rằng việc thiết lập giao diện sẽ mở rộng quyền truy cập (trong trường hợp nguồn được đặt). Tôi có một vấn đề là các cổng có thể truy cập được mặc dù tôi có sourcesdanh sách trắng. Lý do là khu vực có giao diện được chỉ định.
pinkeen

1
Để chính xác, câu trả lời này cần loại bỏ tất cả các dịch vụ mặc định khỏi publicvùng, nếu có (các dịch vụ này sẽ có sẵn cho tất cả các địa chỉ vì các giao diện được gán cho publicvùng theo mặc định). Hoặc thay đổi vùng mặc định sang vùng khác: blockhoặc drop(đây là thông lệ). Hoặc thay đổi publicmục tiêu vùng thành %%REJECT%%hoặc DROP.
dess

6

Tuyên bố miễn trừ trách nhiệm: Tôi thực sự chưa thử những gì tôi đề xuất ở đây, nhưng nó khá gần với thiết lập tường lửa cuối cùng tôi đã làm, vì vậy tôi sẽ loại bỏ điều đó. Firewalld cung cấp cho bạn một vài vùng được cấu hình sẵn, chỉ cho mục đích này. Có một cái gọi là "thả", làm rơi bất cứ thứ gì vào và một cái gọi là "đáng tin cậy", cho phép mọi kết nối (nghĩa là, do đó bạn thậm chí không cần phải mở các cổng riêng lẻ). Bí quyết là lấy đúng vùng để kích hoạt những gì bạn muốn.

Firewalld sẽ áp dụng các quy tắc cho một khu vực dựa trên các ưu tiên sau:

  • Nếu IP nguồn khớp với IP nguồn được liên kết với một vùng, nó sẽ sử dụng IP đó.
  • Nếu IP nguồn không khớp với bất kỳ vùng cụ thể nào, nó sẽ kiểm tra xem liệu có một vùng được cấu hình cho giao diện mà gói được bật không. Nếu có một, nó sử dụng nó.
  • Cuối cùng, nếu không có gì phù hợp, nó sử dụng vùng mặc định.

Vì vậy, trước hết, bạn muốn liên kết IP đáng tin cậy của mình với vùng "đáng tin cậy":

firewall-cmd --permanent --zone=trusted --add-source=1.2.3.4

Sau đó, đặt vùng mặc định của bạn thành "thả" hoặc liên kết giao diện của bạn với nó:

firewall-cmd --permanent --set-default-zone=drop
firewall-cmd --permanent --zone=drop --change-interface=eth0

và sau đó làm cho các thay đổi có hiệu lực (cảnh báo: điều này có thể sẽ làm mất kết nối của bạn nếu bạn thực hiện việc này qua mạng và bạn đã không thêm IP nguồn của mình vào vùng tin cậy):

firewall-cmd --reload

Tất nhiên, bạn cũng có thể chỉ kiểm tra những thứ này tạm thời bằng cách bỏ qua "--permanent" (và sau đó bạn cũng không phải - tải lại).


blockcũng có thể được sử dụng (thay vì drop) nếu bạn muốn nói với các máy chủ khác rằng bạn không nói chuyện với họ ....
Gert van den Berg

5

Tôi vận hành tường lửa của mình theo cách này. Đây là phương pháp ưa thích của tôi để thực hiện những gì bạn muốn.

# firewall-cmd --list-all

Bạn sẽ thấy vùng mặc định của mình là công khai và các dịch vụ được kích hoạt là dhcpv6-client và ssh. Chúng tôi không muốn bất kỳ dịch vụ công cộng có sẵn, phải không? Chỉ các IP trong danh sách trắng được ủy quyền. Vì vậy, hãy loại bỏ hai dịch vụ công cộng.

# firewall-cmd --zone=public --remove-service=ssh --permanent
# firewall-cmd --zone=public --remove-service=dhcpv6-client --permanent

Bây giờ, hãy đưa danh sách trắng một IP cụ thể cấp quyền truy cập vào bất kỳ cổng nào.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" accept'

Bây giờ, hãy đưa danh sách trắng một IP khác, mà chúng tôi chỉ muốn có quyền truy cập vào quyền truy cập SSH, http và https. Không có cổng khác.

#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="ssh" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx" service name="http" accept'
#firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="xx.xx.xx.xx service name="https" accept'

Nếu bạn đang kết nối qua SSH, hãy đảm bảo ủy quyền IP của bạn trước khi áp dụng bộ quy tắc mới của bạn. Khi sẵn sàng áp dụng các quy tắc mới.

#firewall-cmd --reload

2

Bạn có thể quản lý dễ dàng bằng Rich Rule.

Bước đầu tiên

firewall-cmd --permanent --set-default-zone=home
firewall-cmd --permanent --zone=drop --change-interface=eth0

Bước thứ hai - Thêm quy tắc phong phú

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" source address="192.168.78.76/32" accept'

Tất cả các cổng có thể truy cập bằng 192.168.2.2 sau khi bạn thêm quy tắc phong phú và chặn mọi cổng từ nguồn khác.

Nếu bạn sẽ thêm bất kỳ cổng hoặc dịch vụ nào bằng lệnh bên dưới thì tất cả các nguồn sẽ có thể truy cập được.

firewall-cmd --zone=public --add-service=ssh
firewall-cmd --zone=public --add-port=8080

Nếu bạn muốn mở cổng cụ thể cho Ip cụ thể hơn lệnh dưới đây

firewall-cmd --permanent --zone=home --add-rich-rule='rule family="ipv4" port="8080/tcp" source address="192.168.78.76/32" accept'

2

Câu trả lời hàng đầu từ dougBTV là sai. Tôi không thể trả lời câu trả lời của anh ấy vì tôi chưa có điểm đại diện cần thiết nên tôi sẽ giải thích ở đây:

Anh ta đang sử dụng vùng mặc định "công khai". Anh ta đang buộc các mạng vào khu vực đó và sau đó mở các cổng trên khu vực đó. Nhưng, trên cấu hình mặc định, tất cả lưu lượng truy cập đều đi qua vùng mặc định, không chỉ các mạng nguồn bạn liên kết với nó. Vì vậy, các lệnh --add-source của anh ta không có gì khác biệt và các lệnh --add-port của anh ta hiện đã cho phép cả thế giới truy cập vào các cổng đó.

Câu trả lời thứ 2 của Normunds Kalnberzins là chính xác. Bạn muốn tạo một vùng riêng biệt, buộc mạng / IP của bạn vào vùng đó và mở các cổng trong vùng đó.

Ngoài ra, bạn có thể để mọi thứ trong vùng mặc định và sử dụng các quy tắc phong phú của tường lửa để cho phép truy cập từ một số IP nhất định:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'

Điều này cho phép tất cả lưu lượng truy cập từ 192.168.2.2 đến tất cả các cổng và vì tôi chưa chỉ định vùng nên sẽ được áp dụng cho vùng mặc định "công khai" (sử dụng --get-default-zone để xác minh vùng mặc định của bạn là gì và - get-active-zone để xem khu vực nào hiện đang được sử dụng).

Để chỉ cho phép truy cập từ IP này vào một cổng cụ thể, tôi sẽ làm:

firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" port port="1234" protocol="tcp" accept'

Thực hành tốt nhất là chạy các lệnh này mà không có --permanent (hoặc --perm viết tắt) ảnh hưởng đến tường lửa hiện đang chạy. Sau khi kiểm tra quy tắc của bạn có hoạt động không, hãy chạy lại nó với --perm được nối thêm để nó được ghi nhớ trong lần tải lại tường lửa tiếp theo.


1

Chỉ cần thêm vào câu trả lời Normunds:

$ sudo firewall-cmd --permanent --zone=work --add-source=172.16.0.0/12
$ sudo firewall-cmd --permanent --zone=work --add-port=8080-8090/tcp

Để chặn tất cả lưu lượng truy cập khác:

$ sudo firewall-cmd --set-default-zone=drop

Cảnh báo: nếu bạn truy cập từ máy từ xa, điều này có thể ngắt kết nối phiên đăng nhập của bạn. Nếu bạn không thiết lập IP vùng 'công việc' chính xác, bạn sẽ không thể kết nối với máy chủ của mình.

Để tải lại tường lửa:

$ sudo firewall-cmd --reload

Tôi không thể tìm ra cách thêm hai IP khác nhau với '- quy tắc giàu có'.


Đối với cấu hình FirewallD mặc định hiện tại, nó có thể không đủ. Xem bình luận của tôi để trả lời của Normunds để biết chi tiết.
dess

đối với nhiều IP, hãy tạo một ipsetlike giống như firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipips vào ipset firewall-cmd --ipset=blacklist --add-entry=192.168.1.4sau đó bạn có thể sử dụngfirewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye

0

Tôi ngạc nhiên khi câu trả lời của khu vực đáng tin cậy không phải là câu trả lời được chọn. Vùng tin cậy có "mục tiêu: CHẤP NHẬN" mặc định trong khi phần còn lại là "đích: mặc định". Mặc dù nó thực sự không quan trọng nhưng dường như nó là phương thức dự định do tên và giá trị đích mặc định của nó.

Cách nhanh chóng khóa hộp để chỉ bạn mới có thể truy cập:

firewall-cmd --zone=trusted --add-source=1.2.3.4
firewall-cmd --zone=trusted --add-source=5.6.7.8/24
firewall-cmd --zone=drop --change-interface=eth1
firewall-cmd --set-default-zone=drop
firewall-cmd --runtime-to-permanent
firewall-cmd --reload
firewall-cmd --list-all-zones

Sau khi liệt kê tất cả các khu vực, bạn sẽ thấy một cái gì đó như thế này:

trusted (active)
  target: ACCEPT
  icmp-block-inversion: no
  sources: 1.2.3.4 5.6.7.8/24
  masquerade: no

drop (active)
  target: DROP
  icmp-block-inversion: no
  interfaces: eth1
  masquerade: no

Lưu ý: Tôi đã xóa các dòng có giá trị null / thiếu. Điều quan trọng là tin cậy và thả đều (hoạt động) và thả có giao diện công khai của bạn.

Điều này làm gì với iptables để trình diễn:

Chain INPUT_ZONES_SOURCE (1 references)
target     prot opt source               destination
IN_trusted  all  --  1.2.3.4         0.0.0.0/0
IN_trusted  all  --  5.6.7.8/24        0.0.0.0/0
Chain INPUT_ZONES (1 references)
target     prot opt source               destination
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
IN_drop    all  --  0.0.0.0/0            0.0.0.0/0
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.