ที่อยู่ IP ที่อนุญาตพิเศษใน CentOS 7


23

ฉันต้องการตั้งค่าไฟร์วอลล์ CentOS 7 เช่นนั้นคำร้องขอขาเข้าทั้งหมดจะถูกบล็อกยกเว้นจากที่อยู่ IP เริ่มต้นที่ฉันอยู่ในรายการที่อนุญาต และสำหรับที่อยู่ IP ที่อนุญาตพิเศษพอร์ตทั้งหมดควรสามารถเข้าถึงได้

ฉันสามารถที่จะหาทางแก้ปัญหาไม่กี่ (ไม่แน่ใจว่าพวกเขาจะทำงาน) สำหรับiptablesแต่ CentOS 7 firewalldใช้ ฉันไม่พบสิ่งที่คล้ายกันเพื่อให้บรรลุตามfirewall-cmdคำสั่ง

อินเตอร์เฟสอยู่ใน Public Zone ฉันได้ย้ายบริการทั้งหมดไปยังโซนสาธารณะแล้ว

คำตอบ:


44

ฉันจะทำสิ่งนี้ได้โดยเพิ่มแหล่งข้อมูลลงในโซน การชำระเงินครั้งแรกที่มีแหล่งที่มาสำหรับโซนของคุณ:

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

หากไม่มีคุณสามารถเริ่มเพิ่มได้นี่คือ "รายการที่อนุญาต" ของคุณ

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

(นั่นเป็นการเพิ่ม/24IP ทั้งหมดและเพียงครั้งเดียวดังนั้นคุณจึงมีการอ้างอิงสำหรับทั้งซับเน็ตและ IP เดียว)

กำหนดช่วงของพอร์ตที่คุณต้องการเปิด:

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

นี่จะทำพอร์ตที่ 1 ถึง 22 คุณสามารถขยายได้ถ้าคุณต้องการ

ตอนนี้โหลดสิ่งที่คุณทำไปแล้ว

firewall-cmd --reload

และตรวจสอบงานของคุณ:

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

หมายเหตุด้านข้าง / บรรณาธิการ: มันไม่สำคัญหรอก แต่ฉันชอบโซน "ที่เชื่อถือได้" สำหรับชุด IP ของรายการขาวในไฟร์วอลล์ คุณสามารถทำให้การประเมินต่อไปโดยการอ่านข้อเสนอแนะของ RedHat เกี่ยวกับการเลือกโซน

ดูสิ่งนี้ด้วย:


หากคุณต้องการDROPแพ็คเก็ตนอกแหล่งข้อมูลนี่เป็นตัวอย่างสำหรับการทิ้งสิ่งที่อยู่นอกที่/24ฉันใช้เป็นตัวอย่างก่อนหน้านี้คุณสามารถใช้กฎที่หลากหลายสำหรับเรื่องนี้ได้ฉันเชื่อ นี่เป็นแนวคิดฉันไม่ได้ทดสอบ (ยิ่งกว่าการเห็นว่า centos 7 ยอมรับคำสั่ง) แต่ควรจะง่ายพอที่จะทำ pcap และดูว่ามันทำงานตามที่คุณคาดหวังหรือไม่

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

ขอบคุณมากสำหรับการตอบ ไม่สามารถลงคะแนนได้เนื่องจากการขาดแคลนชื่อเสียง แต่ฉันจะดร็อป IP อื่นทั้งหมดยกเว้นอันที่ฉันเพิ่มโดยใช้แหล่งที่มาได้อย่างไร
Krishnandu Sarkar

ขอบคุณ @KrishnanduSarkar - ถูกต้องโดยค่าเริ่มต้นควรเป็น ICMP ที่ถูกปฏิเสธ แต่ฉันคิดว่าคุณสามารถเพิ่มกฎมากมายเพื่อวางแพ็กเก็ต ฉันเพิ่มตัวอย่างในคำตอบที่ฉันคิดว่าจะใช้ได้ ขอบคุณเกี่ยวกับ upvote ฉันเข้าใจว่าถ้าคำตอบใช้ได้ผลโปรดลองตอบคำตอบ
dougBTV

คำตอบที่ดีฉันใช้ iptables จนถึงตอนนี้
Tensigh

(!) คำตอบนี้จะไม่ทำงานตามที่คาดไว้สำหรับการกำหนดค่า FirewallD เริ่มต้นปัจจุบัน (อินเทอร์เฟซที่กำหนดให้กับโซนสาธารณะโดยค่าเริ่มต้น)
dess

24

แม้ว่าคำตอบจะได้รับการยอมรับและได้รับการโหวตฉันไม่คิดว่ามันจะเป็นคำตอบที่ถูกต้อง ฉันไม่พบคำอธิบายที่ชัดเจนในเอกสารประกอบ แต่จากพฤติกรรมที่นำมาใช้ดูเหมือนว่า:

  1. ส่วนต่อประสานและแหล่งที่มาถูกใช้เป็นตัวเลือก - โซนใดที่จะเปิดใช้งาน
  2. ทั้งสองจะถูกละเว้นสำหรับโซนเริ่มต้น (ใช้งานอยู่เสมอ)

ดังนั้นคำตอบคือ:

  1. ล็อคโซนเริ่มต้นพูดว่า "สาธารณะ" - ไม่มีพอร์ตที่เปิดอยู่หรือไม่มีบริการ
  2. ในโซนอื่นให้พูดว่า "งาน" - กำหนดแหล่งที่มาและเปิดพอร์ต

ตัวอย่างเช่นสมมติว่าโซนเริ่มต้นเป็นสาธารณะและไม่มีพอร์ตที่เปิดเพิ่มแหล่งที่มาและช่วงพอร์ตลงในโซน "งาน"

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

ตอนนี้ตรวจสอบโซนที่ใช้งานอยู่ (โซนเริ่มต้นใช้งานอยู่เสมอ):

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

คุณจะได้รับ:

work
  sources: 192.168.0.0/24

ดังนั้นกฎโซน "งาน" จะใช้กับซับเน็ตเฉพาะ คุณจะมีช่วงของพอร์ตที่เปิดอยู่สำหรับ "whitelist" = subnetตามที่ร้องขอ และแน่นอนใช้--permanentตัวเลือกใน--add-xxxงบเพื่อให้พฤติกรรมติด

ในทางกลับกันพอร์ตหรือบริการใด ๆ ที่คุณมีในโซน "สาธารณะ" (ค่าเริ่มต้น) จะใช้กับอินเทอร์เฟซและแหล่งที่อยู่ทั้งหมด

$ 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:

ระบบเดียวกันใช้งานได้สำหรับอินเตอร์เฟส พูดโดยการเพิ่มส่วนต่อประสาน "ens3" ลงใน "work" zone:

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

คุณจะใช้กฎโซน "งาน" กับคำขอใด ๆ จากอินเทอร์เฟซเฉพาะ - ตัวเลือกคร่าวๆมากกว่า "แหล่งที่มา"


4
นี่คือคำตอบที่ดีที่สุด ส่วนที่สำคัญที่สุดคือคำอธิบายว่าการตั้งค่าอินเทอร์เฟซเป็นการขยายการเข้าถึง (ในกรณีที่มีการตั้งค่าแหล่งที่มา) ฉันมีปัญหาที่พอร์ตนั้นสามารถเข้าถึงได้แม้ว่าฉันจะมีsourcesรายการที่อนุญาต เหตุผลก็คือโซนนั้นมีอินเตอร์เฟสที่ได้รับมอบหมาย
pinkeen

1
เพื่อให้ถูกต้องแม่นยำคำตอบนี้ต้องลบบริการเริ่มต้นทั้งหมดออกจากpublicโซนถ้ามี (บริการเหล่านี้จะมีอยู่ในที่อยู่ทั้งหมดเนื่องจากอินเตอร์เฟสได้รับการกำหนดให้เป็นpublicโซนตามค่าเริ่มต้น) หรือเปลี่ยนโซนเริ่มต้นเป็นอื่น: blockหรือdrop(นี่คือการปฏิบัติทั่วไป) หรือการเปลี่ยนแปลงpublicเป้าหมายโซนหรือ%%REJECT%% DROP
dess

6

คำเตือน: ฉันยังไม่ได้ลองสิ่งที่ฉันแนะนำที่นี่ แต่มันค่อนข้างใกล้กับการตั้งค่าไฟร์วอลล์ครั้งล่าสุดที่ฉันทำดังนั้นฉันจะออกจากที่ Firewalld มอบโซนที่กำหนดค่าไว้ล่วงหน้าเพียงไม่กี่โซนเท่านั้น มีสิ่งหนึ่งที่เรียกว่า "ดร็อป" ซึ่งจะปล่อยสิ่งใด ๆ ที่เข้ามาและอีกอันหนึ่งเรียกว่า "เชื่อถือได้" ซึ่งอนุญาตการเชื่อมต่อใด ๆ (เช่นดังนั้นคุณไม่ควรต้องเปิดพอร์ตแต่ละพอร์ตด้วยซ้ำ) เคล็ดลับคือการได้รับโซนที่ถูกต้องเพื่อเรียกสิ่งที่คุณต้องการ

Firewalld จะใช้กฎสำหรับโซนโดยยึดตามลำดับความสำคัญต่อไปนี้:

  • หาก IP ต้นทางตรงกับ IP ต้นทางที่ผูกกับโซนจะใช้มัน
  • หาก IP ต้นทางไม่ตรงกับโซนใดพื้นที่หนึ่งจะตรวจสอบว่ามีโซนที่กำหนดค่าไว้สำหรับอินเทอร์เฟซที่แพ็กเก็ตเข้ามาหรือไม่ หากมีอย่างใดอย่างหนึ่งก็จะใช้มัน
  • สุดท้ายหากไม่มีสิ่งใดที่ตรงกันจะใช้โซนเริ่มต้น

ดังนั้นก่อนอื่นคุณต้องผูก IP ที่เชื่อถือได้ของคุณกับโซน "ที่เชื่อถือได้":

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

จากนั้นตั้งค่าโซนเริ่มต้นของคุณเป็น "ปล่อย" หรือผูกอินเทอร์เฟซของคุณ:

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

จากนั้นทำการเปลี่ยนแปลงจะมีผล (คำเตือน: สิ่งนี้อาจทำให้การเชื่อมต่อของคุณลดลงหากคุณทำสิ่งนี้ผ่านเครือข่ายและคุณไม่ได้เพิ่ม IP ต้นทางของคุณไปยังโซนที่เชื่อถือได้):

firewall-cmd --reload

แน่นอนคุณสามารถทดสอบสิ่งเหล่านี้ได้ชั่วคราวด้วยการละเว้น "--permanent" (จากนั้นคุณไม่จำเป็นต้อง - โหลดซ้ำเช่นกัน)


blockยังสามารถใช้ (แทนdrop) ถ้าคุณต้องการบอกโฮสต์อื่น ๆ ที่คุณไม่ได้พูดคุยกับพวกเขา ....
Gert van den Berg

5

ฉันใช้งานไฟร์วอลล์ด้วยวิธีนี้ นี่คือวิธีที่ฉันต้องการเพื่อให้บรรลุสิ่งที่คุณต้องการ

# firewall-cmd --list-all

คุณจะเห็นโซนเริ่มต้นของคุณเป็นสาธารณะและบริการที่เปิดใช้งานคือ dhcpv6-client และ ssh เราไม่ต้องการบริการสาธารณะใด ๆ ใช่ไหม? เฉพาะ IP ที่ได้รับอนุญาตเท่านั้นที่ได้รับอนุญาต ดังนั้นเราจะลบบริการสาธารณะสองรายการ

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

ตอนนี้เราจะอนุญาต IP เฉพาะที่อนุญาตให้เข้าถึงพอร์ตใด ๆ

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

ทีนี้มาเพิ่ม IP อื่นในบัญชีขาวที่เราต้องการเข้าถึง SSH, http และ https เท่านั้น ไม่มีพอร์ตอื่น

#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'

หากคุณกำลังเชื่อมต่อผ่าน SSH ตรวจสอบให้แน่ใจว่าคุณอนุญาต IP ของคุณก่อนที่จะใช้ชุดกฎใหม่ เมื่อพร้อมที่จะใช้กฎใหม่

#firewall-cmd --reload

2

คุณสามารถจัดการได้อย่างง่ายดายโดย Rich Rule

ขั้นแรก

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

ขั้นตอนที่สอง - เพิ่มกฎสมบูรณ์

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

พอร์ตทั้งหมดสามารถเข้าถึงได้โดย 192.168.2.2 เมื่อคุณเพิ่มกฎสมบูรณ์และบล็อกทุกพอร์ตจากแหล่งอื่น

หากคุณจะเพิ่มพอร์ตหรือบริการใด ๆ โดยใช้คำสั่งด้านล่างมันจะสามารถเข้าถึงได้โดยแหล่งที่มาทั้งหมด

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

หากคุณต้องการเปิดพอร์ตเฉพาะสำหรับ Ip เฉพาะกว่าด้านล่างคำสั่ง

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

2

คำตอบยอดนิยมจาก dougBTV นั้นผิด ฉันไม่สามารถตอบคำตอบของเขาได้เพราะฉันยังไม่มีคะแนนตัวแทนที่จำเป็นดังนั้นฉันจะอธิบายที่นี่:

เขาใช้โซนเริ่มต้น "สาธารณะ" เขาคาดเครือข่ายไปยังโซนนั้นแล้วเปิดพอร์ตในโซนนั้น ทว่าการรับส่งข้อมูลทั้งหมดจะผ่านโซนเริ่มต้นไม่ใช่เฉพาะเครือข่ายต้นทางที่คุณเชื่อมต่อ ดังนั้นคำสั่ง --add-source ของเขาจึงไม่ต่างกันและคำสั่ง --add-port ของเขาได้อนุญาตให้ทั้งโลกเข้าถึงพอร์ตเหล่านั้นได้แล้ว

คำตอบที่ 2 โดย Normunds Kalnberzins ถูกต้อง คุณต้องการสร้างโซนแยกผูกเครือข่าย / IP ของคุณไปยังโซนนั้นและเปิดพอร์ตในโซนนั้น

หรือคุณสามารถปล่อยให้ทุกอย่างอยู่ในโซนเริ่มต้นและใช้กฎที่หลากหลายของ firewalld เพื่ออนุญาตการเข้าถึงจาก IP บางตัว:

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

สิ่งนี้อนุญาตให้ทราฟฟิกทั้งหมดจาก 192.168.2.2 ไปยังพอร์ตทั้งหมดและเนื่องจากฉันไม่ได้ระบุโซนสิ่งนี้จะถูกนำไปใช้กับโซนเริ่มต้น "สาธารณะ" (ใช้ - get-default-zone เพื่อตรวจสอบว่าโซนเริ่มต้นของคุณคืออะไรและ - get-active-zones เพื่อดูว่าโซนใดกำลังใช้งานอยู่)

หากต้องการอนุญาตการเข้าถึงจาก IP นี้ไปยังพอร์ตเฉพาะที่ฉันต้องการ:

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

แนวปฏิบัติที่เหมาะสมที่สุดคือการรันคำสั่งเหล่านี้โดยไม่มี --permanent (หรือ --perm for short) ซึ่งมีผลต่อไฟร์วอลล์ที่รันอยู่ในปัจจุบัน หลังจากทดสอบว่ากฎของคุณใช้งานได้ให้รันอีกครั้งด้วย --perm ต่อท้ายเพื่อให้จำได้ในการรีโหลดไฟร์วอลล์ครั้งต่อไป


1

เพียงเพิ่มคำตอบ 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

วิธีปิดกั้นการรับส่งข้อมูลอื่น ๆ ทั้งหมด:

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

คำเตือน: หากคุณเข้าถึงจากเครื่องระยะไกลสิ่งนี้อาจยกเลิกการเชื่อมต่อเซสชันการเข้าสู่ระบบของคุณ หากคุณไม่ได้รับการตั้งค่า IP โซน 'ทำงาน' อย่างถูกต้องคุณจะไม่สามารถเชื่อมต่อกับเซิร์ฟเวอร์ของคุณได้

ในการรีโหลดไฟร์วอลล์:

$ sudo firewall-cmd --reload

ฉันไม่สามารถหาวิธีเพิ่ม IP ที่แตกต่างกันสองรายการด้วย '- เพิ่มรวยกฎ'


สำหรับการกำหนดค่าเริ่มต้น FirewallD ปัจจุบันอาจไม่เพียงพอ ดูความคิดเห็นของฉันต่อคำตอบของ Normunds สำหรับรายละเอียด
dess

สำหรับ IP หลาย ๆ ตัวให้ใช้สร้างipsetlike firewall-cmd --permanent --new-ipset=blacklist --type=hash:ipเพิ่ม ips ให้กับ ipset ด้วยfirewall-cmd --ipset=blacklist --add-entry=192.168.1.4แล้วคุณสามารถใช้firewall-cmd --add-rich-rule='rule source ipset=blacklist drop'
fyrye

0

ฉันประหลาดใจที่คำตอบโซนที่เชื่อถือได้ไม่ใช่คำตอบที่เลือก โซนที่เชื่อถือได้มี "เป้าหมาย: ACCEPT" เริ่มต้นในขณะที่ส่วนที่เหลือเป็น "เป้าหมาย: เริ่มต้น" ในขณะที่มันไม่สำคัญว่ามันจะเป็นวิธีการที่ตั้งใจเนื่องจากชื่อและค่าเป้าหมายเริ่มต้น

วิธีล็อคกล่องอย่างรวดเร็วเพื่อให้คุณเท่านั้นที่สามารถเข้าถึงได้:

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

หลังจากแสดงทุกโซนคุณควรเห็นดังนี้:

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

หมายเหตุ: ฉันลบบรรทัดที่มีค่า Null / หายไป สิ่งสำคัญคือความน่าเชื่อถือและการปล่อยมีทั้งแบบแอ็คทีฟและแบบหล่นมีส่วนต่อประสานสาธารณะ

สิ่งนี้ทำให้ iptables สำหรับการสาธิต:

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
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.