ในสคริปต์ iptables ของฉันฉันได้ทดลองเขียนกฎที่ละเอียดที่สุดเท่าที่จะทำได้ ฉัน จำกัด ผู้ใช้ที่ได้รับอนุญาตให้ใช้บริการใดส่วนหนึ่งเพื่อความปลอดภัยและเป็นแบบฝึกหัดการเรียนรู้
การใช้ iptables v1.4.16.2 บน Debian 6.0.6 ที่รันเคอร์เนล 3.6.2
อย่างไรก็ตามฉันมีปัญหาฉันยังไม่ค่อยเข้าใจ
พอร์ตขาออกสำหรับผู้ใช้ทั้งหมด
มันใช้งานได้ดีอย่างสมบูรณ์แบบ ฉันไม่มีกฎการติดตามสถานะทั่วไป
## พอร์ตขาออก 81 $ IPTABLES - เอาท์พุท -p tcp - พอร์ต 81 -m conntrack - สถานะใหม่, ก่อตั้งขึ้น -j ACCEPT $ IPTABLES - อินพุต -p tcp --sport 81 -s $ MYIP -m conntrack - สถานะของรัฐที่จัดตั้งขึ้น -j ACCEPT
พอร์ตขาออกพร้อมการจับคู่ผู้ใช้
## พอร์ตขาออก 80 สำหรับผู้ใช้บัญชี $ IPTABLES -A เอาท์พุท - จับคู่เจ้าของ - ผู้ใช้ useraccount -p tcp - พอร์ต 80 -m conntrack - สถานะใหม่, สร้างแล้ว --sport 1024: 65535 -j ยอมรับ $ IPTABLES - อินพุต -p tcp --sport 80 --dport 1024: 65535 -d $ MYIP -m conntrack - สถานะของรัฐถูกสร้าง -j ยอมรับ
วิธีนี้อนุญาตให้พอร์ต 80 ใช้สำหรับบัญชี "useraccount" เท่านั้น แต่กฎเช่นนี้สำหรับปริมาณการใช้ TCP มีปัญหา
## บันทึกขาออกเริ่มต้น + กฎการบล็อก $ IPTABLES -A เอาท์พุท -j LOG --log-prefix "BAD OUTGOING" --log-ip-options --log-tcp-options --log-uid $ IPTABLES -A เอาท์พุท -j DROP
ปัญหา
การทำงานข้างต้นผู้ใช้ "useraccount" สามารถรับไฟล์ได้อย่างสมบูรณ์แบบ ไม่มีผู้ใช้รายอื่นในระบบที่สามารถทำการเชื่อมต่อขาออกไปยังพอร์ต 80
useraccount @ host: $ wget http://cachefly.cachefly.net/10mb.test
แต่ wget ด้านบนทำให้ x7 ลดรายการใน syslog ของฉัน:
18 ตุลาคม 02:00:35 xxxx เคอร์เนล: ไม่ดีเข้า = ออก = eth0 SRC = xx.xx.xx.xx DST = 205.234.175.175 LEN = 40 TOS = 0x00 PREC = 0x00 TTL = 64 ID = 12170 DF PROTO = TCP SPT = 37792 DPT = 80 SEQ = 164520678 ACK = 3997126942 WINDOW = 979 RES = 0x00 ACK URGP = 0
ฉันไม่ได้รับหยดเหล่านี้สำหรับกฎที่คล้ายกันกับปริมาณการใช้ UDP ฉันมีกฎอยู่แล้วซึ่ง จำกัด ว่าผู้ใช้คนใดที่สามารถร้องขอ DNS ได้
แพ็กเก็ต ACK ขาออกที่หลุดดูเหมือนจะมาจากบัญชีรูท (URGP = 0) ซึ่งฉันไม่เข้าใจ แม้ตอนที่ฉันสลับ useraccount สำหรับรูท
ฉันเชื่อว่าแพ็กเก็ต ACK จัดอยู่ในประเภทใหม่เนื่องจาก conntrack เริ่มติดตามการเชื่อมต่อหลังจากขั้นตอนที่ 3 ของการจับมือ 3 ทาง แต่เหตุใดจึงมีการลดลง
หยดเหล่านี้สามารถละเว้นได้อย่างปลอดภัยหรือไม่
แก้ไข
ดังนั้นฉันมักจะเห็นกฎเช่นนี้ซึ่งทำงานได้ดีสำหรับฉัน:
$ IPTABLES - เอาท์พุท -s $ MYIP -p tcp -m tcp --dport 80 -m state - รัฐใหม่, ก่อตั้งแล้ว -j ACCEPT $ IPTABLES - อินพุต -p tcp -m tcp --sport 80 -d $ MYIP-state รัฐ - รัฐที่ตั้งไว้ -j ACCEPT
ฉันสลับ "-m state - รัฐ" สำหรับ "-m conntrack --ctstate" เนื่องจากการจับคู่ของรัฐล้าสมัยไปแล้ว
เป็นวิธีปฏิบัติที่ดีที่สุดหรือไม่ที่จะมีกฎการติดตามสถานะทั่วไป? กฎดังกล่าวไม่ถือว่าถูกต้องหรือไม่
เพื่อควบคุมการเชื่อมต่อผู้ใช้ขาออกอย่างแน่นหนาจะดีกว่านี้ไหม
$ IPTABLES - อินพุต -m conntrack - สถานะที่ตั้งไว้ -j ACCEPT $ IPTABLES - เอาท์พุท -m conntrack - สถานะที่ได้รับการจัดตั้ง -j ACCEPT $ IPTABLES -A เอาท์พุท -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack - สถานะใหม่ - เจ้าของใหม่ - เจ้าของผู้ใช้ - บัญชีผู้ใช้ -j ACCEPT $ IPTABLES -A เอาท์พุท -p tcp --dport 80 -s $ SERVER_IP_TUNNEL -m conntrack - สถานะใหม่ - เจ้าของใหม่ - เจ้าของอื่น ๆ บัญชี -j ACCEPT