จะมั่นใจได้อย่างไรว่าพอร์ต SSH เปิดเฉพาะที่อยู่ IP ที่ระบุเท่านั้น


42

นี่คือของฉัน/etc/sysconfig/iptables:

มันมีสองพอร์ตเปิด 80 apache และ 22 สำหรับ ssh

# Firewall configuration written by system-config-firewall
# Manual customization of this file is not recommended.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT

สำหรับพอร์ต 22 (SSH) ฉันต้องการให้แน่ใจว่าไม่มีใครสามารถเชื่อมต่อกับพอร์ตนี้ได้ยกเว้นที่อยู่ IP เฉพาะ

ip ตัวอย่าง:

1.2.3.4

โปรดเพิกเฉยต่อการดูแล / ข้อกังวลใด ๆ เกี่ยวกับสิ่งที่หาก ip ของฉันเปลี่ยนแปลงและฉันไม่สามารถ SSH ไปยังเซิร์ฟเวอร์ของฉันได้อีก

คำตอบ:


47

หากฉันได้รับคำถามอย่างถูกต้องคุณต้องการให้เซิร์ฟเวอร์ของคุณสามารถเข้าถึงได้จากที่อยู่ IP เฉพาะในพอร์ต 22 คุณสามารถอัปเดต Iptables ได้:

iptables -A INPUT -p tcp -s YourIP --dport 22 -j ACCEPT

ในกรณีดังกล่าวคุณกำลังเปิดพอร์ต ssh เฉพาะ YourIP หากคุณจำเป็นต้องเปิด DNS สำหรับเครือข่ายภายในของคุณ:

iptables -A INPUT -p udp -s YourIP --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -s YourIP --dport 53 -j ACCEPT

เมื่อคุณเพิ่มและเปิดสำหรับ IP เหล่านั้นคุณจะต้องปิดประตูสำหรับ IP ที่เหลือ

iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP
iptables -A INPUT -p udp -s 0.0.0.0/0 --dport 53 -j DROP
iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 53 -j DROP

(ตรวจสอบให้แน่ใจว่าตั้งกฎไว้ในตำแหน่งที่ถูกต้องในชุดกฎของคุณiptables -A INPUTจะเพิ่มกฎไปยังจุดสิ้นสุดของกฎINPUTตามที่เป็นอยู่ในปัจจุบัน)

หรืออย่างที่โจเอลบอกว่าคุณสามารถเพิ่มกฎได้หนึ่งข้อแทน:

iptables -A INPUT -p tcp ! -s <permittedIP> -j DROP

หรือคุณสามารถตั้งค่านโยบายเริ่มต้นในไฟร์วอลล์ด้วย

iptables -P INPUT DROP

โดยสังเขปดังที่นำเสนอในคำถามนี้เกี่ยวกับ SO :

iptables -A INPUT -p tcp --dport 22 -s YourIP -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j DROP

2
นอกจากนี้ยังเป็นที่น่าสังเกตว่าการสนับสนุนผกผันกับผู้ประกอบการบางในกรณีที่คุณต้องการที่จะทำเป้าหมายiptables DROPตัวอย่าง:iptables -I INPUT -p tcp ! -s <permittedIP> -j DROP
Bratchley

1
นอกจากนี้ยังDROPไม่จำเป็นต้องใช้อย่างไม่มีเงื่อนไขคุณเพียงแค่ตั้งค่านโยบายเริ่มต้นในไฟร์วอลล์ด้วยiptables -P INPUT DROPและปล่อยให้เป็นไปตามนั้น คุณอาจต้องการที่จะทำเช่นนี้ต่อท้ายหากทำอย่างนี้มิฉะนั้นทราฟฟิกทั้งหมดจะถูกจับโดยDROPและไม่ถึงACCEPTกฎของคุณ
Bratchley

1
สิ่งนี้ไม่ได้ผลสำหรับฉันเพราะค่าเริ่มต้นสำหรับ -I (ส่วนแทรก) คือการแทรกเป็นกฎ # 1 ดังนั้น DROP จะถูกแทรกเป็นกฎ # 1 และประเมินผลก่อนดังนั้นจึงปล่อยแพ็กเก็ต ssh ทั้งหมดไม่เคยประเมินกฎ ACCEPT คุณต้องดำเนินการiptables -I INPUT 3 -p tcp -s 0.0.0.0/0 --dport 22 -j DROPและiptables -I INPUT 3 -p udp -s 0.0.0.0/0 --dport 53 -j DROP"3" หลังจาก INPUT หมายถึงการแทรกเป็นกฎ INPUT # 3 (สมมติว่าคุณกำลังแทรกสอง ACCEPTS มิฉะนั้นถ้าเพียงหนึ่งยอมรับให้ใช้ "2" สำหรับ INPUT
Kevin Triplett

@Networker ใช้-Iจะแทรกกฎ iptables ใหม่ที่ด้านบน เช่นนี้คุณอาจสิ้นสุดการแทรกการปล่อยของคุณก่อนที่จะอนุญาต ฉันแนะนำให้ใช้-Aแทน
BlueCacti

1
ดีฉันล็อคตัวเองออกมา, gj
ngwdaniel

6

แม้ว่าฉันจะแนะนำให้ใช้กุญแจ SSH ฉันจะให้คำอธิบายแก่คุณ

คุณไม่จำเป็นต้องใช้ IPtables ในสิ่งที่คุณพยายามจะทำมันมีหลายวิธี นี่คือวิธี IPtables:

iptables -I INPUT -s [YOUR_HOME_IP] -p tcp -m tcp --dport [SSH_PORT] -j ACCEPT

[YOUR_HOME_IP] = IP ที่บ้านของคุณ (ตรงไปตรงมาสวย)

[SSH_PORT] = พอร์ตที่คุณรัน SSH บน (โดยค่าเริ่มต้น 22)

iptables -I INPUT -p tcp -m tcp --dport [SSH_PORT] -j REJECT

สิ่งนี้ทำให้แน่ใจว่าไม่มีใครยกเว้น IP ของคุณสามารถเข้าสู่ SSH

sshd_configมีวิธีอื่นซึ่งเป็นโดยการเพิ่มบางสิ่งบางอย่างที่จะเป็น

เพิ่มรายการต่อไปนี้:

AllowUsers root@[YOUR_HOME_IP]
PermitRootLogin without-password

สิ่งนี้ช่วยให้คุณสามารถเข้าสู่ระบบ SSH ในฐานะrootผู้ใช้จาก IP ของคุณโดยไม่ต้องขอรหัสผ่าน

โปรดจำไว้ว่า cronjob ด้วย

iptables -X
iptables -F

อาจสมาร์ทดังนั้นคุณจึงไม่ถูกล็อคออกจากเซิร์ฟเวอร์ด้วย SSH (cronjob จะรีเซ็ต IPtables เพื่อให้คุณเข้าถึงได้อีกครั้ง) หากคุณยังคงมีสิทธิ์เข้าถึงคุณสามารถลบ cronjob และตั้งค่า IPtables ของคุณอีกครั้ง


cronjob เพิ่งจะลบไฟร์วอลล์แม้ว่า ทำไมตั้งค่าiptablesในสถานที่แรก? รูปแบบการเข้าถึงนอกแบนด์บางรูปแบบเป็นวิธีปกติ knockdเป็นอีก
Matt

@mtm ใช่เมื่อคุณล็อค cronjob จะรีเซ็ตการตั้งค่า IPtables ของคุณเพื่อให้คุณสามารถเข้าถึง SSH ได้อีกครั้ง เหตุผลที่ผู้คนใช้ IPtables แตกต่างกันฉันคิดว่ามันเป็นไฟร์วอลล์ที่มีประสิทธิภาพเรียบง่ายและยืดหยุ่น
William Edwards

2
oic คุณหมายถึงรันฟลัชหนึ่งครั้งในเวลาตั้งค่าไม่ได้กำหนดเป็นประจำ atทำอย่างนั้น
Matt

4
ยกเว้น IP ของคุณแล้วอนุญาตให้ล็อกอินรูทโดยไม่มีรหัสผ่านดูเหมือนเป็นความคิดที่แย่มาก
Alex W

1
@AlexW ฉันรู้ว่ามันนานแล้ว แต่ฉันยังต้องการแสดงความคิดเห็น: Without-Passwordหมายความว่าไม่อนุญาตให้ใช้การตรวจสอบรหัสผ่านดังนั้นคุณจะต้องใช้การรับรองความถูกต้องของคีย์ SSH แทน แน่นอนว่ามันเป็นการตั้งชื่อที่ไม่ชัดเจนสำหรับวิธีการรับรองความถูกต้องนี้ แต่นี่ไม่ได้หมายความว่าคุณไม่จำเป็นต้องใช้รหัสผ่านในการเข้าสู่ระบบในฐานะรูท อย่างไรก็ตามวิธีที่ปลอดภัยกว่าคือการตั้งค่าPermitRootLogin noและใช้บัญชี sudo อื่นเพื่อเข้าสู่ระบบเนื่องจากรูทเป็นเป้าหมายร่วมกัน
BlueCacti

5

คำตอบอื่น ๆ ที่ใช้iptables -Iในตัวอย่างของพวกเขาซึ่งมักจะไม่ใช่สิ่งที่คุณควรใช้

iptables จะดำเนินการกฎข้อแรกที่จับคู่ดังนั้นลำดับของกฎจึงมีความสำคัญมาก -Iคือคำสั่ง "insert" และควรใช้กับพารามิเตอร์ index เพื่อระบุตำแหน่งที่อยู่ในรายการของกฎที่กำหนด -Aคือคำสั่ง "ผนวก" ซึ่งจะเพิ่มกฎต่อท้ายรายการ

ในการกระจายบางอย่าง (อาจทั้งหมด) การใช้-Iโดยไม่มีพารามิเตอร์ดัชนีจะเพิ่มกฎในการสร้างดัชนีหนึ่งทำให้เป็นกฎแรกที่ตรวจสอบ ในสถานการณ์สมมตินี้ถ้าคำสั่งสุดท้ายที่คุณเรียกใช้คือiptables -I INPUT -s tcp 0.0.0.0/0 -j DROPiptables จะลดทราฟฟิกทั้งหมดไม่ว่าคุณจะมีACCEPTกฎใด ๆในภายหลังหรือไม่ก็ตาม

นี่คือตัวอย่างของการตั้งค่ากฎที่อนุญาต SSH จาก IP เดียว:

เริ่มต้นโดยไม่มีกฎ:

#> iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

เพิ่มกฎ "อนุญาต SSH ใหม่จาก 1.2.3.4" ใหม่:

#>iptables -A INPUT -p tcp -s 1.2.3.4 --dport 22 -j ACCEPT

บล็อก SSH จาก IP อื่น ๆ ทั้งหมด:

#>iptables -A INPUT -p tcp -s 0.0.0.0/0 --dport 22 -j DROP

ตอนนี้ห่วงโซ่การป้อนข้อมูลของคุณจะมีลักษณะ:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

ในภายหลังหากคุณต้องการอนุญาต IP ที่สองในรายการที่อนุญาตพิเศษคุณสามารถใช้-Iพารามิเตอร์เพื่อวางไว้ก่อนกฎบัญชีดำ

#>iptables -I INPUT 2 -p tcp -s 4.3.2.1 --dport 22 -j ACCEPT

Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  1.2.3.4              0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  4.3.2.1              0.0.0.0/0            tcp dpt:22
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

โปรดสังเกตว่าการใช้-I INPUT 2เพิ่มกฎใหม่เป็นกฎหมายเลข 2 และกระแทกกฎ DROP เป็นหมายเลข 3

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