ทำไมการกำหนดค่า iptables ของฉันสำหรับการเคาะพอร์ตไม่ทำงาน


0

ฉันใช้iptablesกฎต่อไปนี้ในเซิร์ฟเวอร์ทดสอบของฉันสำหรับหลักสูตร ไฟร์วอลล์ปิดตัวลงและฉันไม่สามารถเข้าถึงพอร์ต 22 ได้อย่างไรก็ตามหลังจากเคาะพอร์ต 1111, 2222 และ 3333 ตามลำดับ - พอร์ต 22 ควรเปิดขึ้น อย่างไรก็ตามฉันsshยังคงถูกบล็อก

ฉันเคาะแต่ละพอร์ตผ่านสคริปต์ Python:

# knock_list = [1111, 2222, 3333]

for port in knock_list:
    time.sleep(1.5)

    sock = None
    try:
        print 'Knocking:', ip_address, port
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        sock.set_timeout(1)
        sock.connect((ip_address, port))

    except:
        pass

    finally:
        if sock:
            sock.close()

ทำไมการกำหนดค่า iptables ของฉันสำหรับการเคาะพอร์ตไม่ทำงาน

การกำหนดค่า iptables ของฉัน

sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

sudo iptables -N KNOCKING
sudo iptables -N GATE1
sudo iptables -N GATE2
sudo iptables -N GATE3
sudo iptables -N PASSED

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A INPUT -i lo -j ACCEPT

sudo iptables -A INPUT -j KNOCKING

sudo iptables -A GATE1 -p tcp --dport 1111 -m recent --name AUTH1 --set -j DROP
sudo iptables -A GATE1 -j DROP

sudo iptables -A GATE2 -m recent --name AUTH1 --remove
sudo iptables -A GATE2 -p tcp --dport 2222 -m recent --name AUTH2 --set -j DROP
sudo iptables -A GATE2 -j GATE1

sudo iptables -A GATE2 -j GATE1

sudo iptables -A GATE3 -m recent --name AUTH2 --remove
sudo iptables -A GATE3 -p tcp --dport 3333 -m recent --name AUTH3 --set -j DROP
sudo iptables -A GATE3 -j GATE1

sudo iptables -A PASSED -m recent --name AUTH3 --remove
sudo iptables -A PASSED -p tcp --dport 22 -j ACCEPT
sudo iptables -A PASSED -j GATE1

sudo iptables -A KNOCKING -m recent --rcheck --seconds 30 --name AUTH3 -j PASSED
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH2 -j GATE3
sudo iptables -A KNOCKING -m recent --rcheck --seconds 10 --name AUTH1 -j GATE2

sudo iptables -A KNOCKING -j GATE1

คำตอบ:


1

สองสิ่งที่ต้องพูดถึง

ประการแรกคุณทำนโยบาย (-P) ยอมรับสำหรับแต่ละอินพุต, เอาต์พุตและไปข้างหน้า ดีกว่าคุณปิด (DROP) ทุกอย่างโดยเฉพาะใน INPUT และเปิดเฉพาะสิ่งที่จำเป็น

ประการที่สองฉันไม่รู้จัก Python เป็นอย่างดี แต่โดยทั่วไปแล้วการเชื่อมต่อแบบนี้จะไม่ส่งเพียงหนึ่งแพ็คเก็ต แต่ก็มีอีกมากมาย แม้ว่าคุณจะหมดเวลา 1 วินาทีก็จะมี (ฉันเดา) 2 แพ็คเก็ตที่เหมือนกันส่งเพราะไม่มีคำตอบสำหรับครั้งแรก ดังนั้นแพ็กเก็ตแรกนำแหล่งที่มาในรายการถัดไป AUTH + 1 และแพคเกจที่สองลบมันและนำแหล่งที่มากลับไปที่รายการ AUTH1

ฉันขอแนะนำให้เขียน portknocking ของคุณใหม่โดยคำนึงถึงหลาย ๆ แพ็กเก็ตที่เหมือนกันที่ส่งในพอร์ตเดียวกัน

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