รบกวนถามเรื่อง FORWARD ใน iptables หน่อยคับ

พอดีผมมีเครื่องที่ทำ Server เป็น Virtual Server บน proxmox แล้วมี VPS อยู่ 8 ตัว อยากจะป้องกันการ attack ไปยัง vps อื่น โดยเราจะป้องกันจากตัว Virtual Server หลักตัวเดียว เราจะเขียน iptables ยังไงคับ

ผมมีตัวอย่าง script ที่ใช้การ FORWARD ไม่รู้ว่าเขียนถูกหรือป่าว อยากจะให้ DROP การเข้าไปถึง vps และ DROP การออกของ vps ในส่วนของเรา จะเขียนแบบไหนคับ

# -
iptables -A FORWARD -m state --state INVALID -j DROP
iptables -A FORWARD -m state --state NEW -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -p icmp -j DROP
iptables -A FORWARD -p icmp --icmp-type echo-request -j DROP
iptables -N syn_floods
iptables -A FORWARD -p tcp --syn -j syn_floods
iptables -A syn_floods -m limit --limit 1/s --limit-burst 3 -j RETURN
iptables -A syn_floods -j DROP
iptables -A FORWARD -p UDP -m limit --limit 3/s -j ACCEPT
iptables -A FORWARD -p UDP -f -j DROP
iptables -A FORWARD -p udp -m length --length 28 -j DROP
iptables -N len_40
iptables -A FORWARD -p udp -m length --length 40 -j len_40
iptables -A len_40 -m limit --limit 3/sec --limit-burst 8 -j RETURN
iptables -A len_40 -j DROP
iptables -N len_72
iptables -A FORWARD -p udp -m length --length 72 -j len_72
iptables -A len_72 -m limit --limit 3/sec --limit-burst 8 -j RETURN
iptables -A len_72 -j DROP
iptables -N len_128
iptables -A FORWARD -p udp -m length --length 128 -j len_128
iptables -A len_128 -m limit --limit 10000/sec --limit-burst 100 -j RETURN
iptables -A len_128 -j DROP
iptables -N Anti-Juno
iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -m tcpmss --mss 1460 -j Anti-Juno
iptables -A Anti-Juno -m limit --limit 15/sec --limit-burst 10 -j RETURN
iptables -A Anti-Juno -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG FIN,SYN,RST,PSH,ACK,URG -j DROP
iptables -A FORWARD -f -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags ACK,URG URG -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags PSH,ACK PSH -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -A FORWARD -p tcp -m tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -A FORWARD -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
iptables -A FORWARD -m state --state NEW -m tcp -p tcp --dport 1458 -j ACCEPT
iptables -A FORWARD -p TCP --dport 135:139 -j DROP
iptables -A FORWARD -p UDP --dport 135:139 -j DROP
iptables -A FORWARD -p udp -m udp --sport 53:25345 --dport 25345 -j DROP
iptables -A FORWARD -p udp -m udp --dport 21 -j DROP
iptables -A FORWARD -p udp -m udp --dport 53 -j DROP
iptables -A FORWARD -p udp -m udp --dport 80 -j DROP
iptables -A FORWARD -p udp -m udp --dport 445 -j DROP
iptables -A FORWARD -p udp -m udp --dport 666 -j DROP
iptables -A FORWARD -p udp -m udp --dport 3389 -j DROP
iptables -A FORWARD -p udp -m udp --dport 20000 -j DROP
iptables -A FORWARD -s 81.0.0.0/8 -j DROP
iptables -A FORWARD -s 82.0.0.0/8 -j DROP
iptables -A FORWARD -s 83.0.0.0/8 -j DROP
iptables -A FORWARD -s 188.0.0.0/8 -j DROP
iptables -A FORWARD -s 46.183.0.0/16 -j DROP
iptables -A FORWARD -s 46.166.0.0/16 -j DROP
iptables -A FORWARD -s 46.234.0.0/16 -j DROP
iptables -A FORWARD -s 87.106.0.0/16 -j DROP
iptables -A FORWARD -s 88.86.0.0/16 -j DROP
iptables -A FORWARD -s 95.211.0.0/16 -j DROP
iptables -A FORWARD -s 108.59.0.0/16 -j DROP
iptables -A FORWARD -s 208.115.0.0/16 -j DROP
iptables -A FORWARD -s 212.124.0.0/16 -j DROP
iptables -A FORWARD -s 190.254.0.0/16 -j DROP
iptables -A FORWARD -s 115.178.0.0/16 -j DROP
iptables -A FORWARD -s 66.45.252.0/24 -j DROP
iptables -A FORWARD -s 74.81.66.0/24 -j DROP
# -

ลองเขียนดูแระเหมือนมันจะไม่ทำงาน

ใครเก่งๆ รบกวนหน่อยคับ

ถามเพิ่มเติมก่อนละกันนะครับว่า VPS แต่ละ instance ใช้ shared interface (bridge) หรือแยก virtual interface ครับ

ถ้าเป็น bridge จะวุ่นหน่อยเพราะโดย virtual physical แล้วเสมือนแต่ละ VPS ต่ออยู่บน switch ตัวเดียวกัน ต้องทำการ block ระดับ L2 (MAC Address Block)

แต่ถ้าเป็น virtual interface แยกกันอยู่แล้ว ก็ทำการ block เรียงตัวเลยครับ

Method 1: (Policy: FORWARD ACCEPT)

# iptables -N vps0_block
# iptables -A FORWARD -i veth0 -j vps0_block
# iptables -A vps0_block -o veth1 -j DROP
# iptables -A vps0_block -o veth2 -j DROP
# iptables -A vps0_block -o veth3 -j DROP
...
...
# iptables -N vps1_block
...
...

Method 2: (Policy: FORWARD DROP) วิธีนี้ต้องระมัดระวัง ไม่ควรสั่งผ่าน Remote Shell เพราะอาจเกิดข้อผิดพลาดได้ง่าย

# iptables -P FORWARD DROP -- block ทั้งหมดโดยปริยาย

สิ่งที่ต้องทำคือ เปิด firewall rule เท่าที่จำเป็น

# iptables -A FORWARD -i veth0 -o eth0 -j ACCEPT -- forward packets for internet connection

โดยส่วนตัวผมจะใช้ Method 2 เนื่องจากจะเป็น deny by default และเปิดเท่าที่จำเป็น

จะดู veth0-veth3 แต่ล่ะตัวจากคำสั่งอะไรคับ

แล้วเราจะกำหนดกฎ อย่าง script ตัวอย่างที่ผมให้ยังไงคับ

รบกวนลองแก้ script ที่ผมให้เป็นตัวอย่างหน่อยได้ไหมคับ ผมก็ยังไม่เก่ง iptables สักเท่าไหร่

สำหรับดู network interfaces

# ifconfig

ส่วนวิธีกำหนดใน proxmox ผมไม่แน่ใจนะครับ เพราะไม่เคยใช้เลยครับ คงต้องหาข้อมูลจากแหล่งอื่น หรือรอผู้รู้ท่านอื่นเข้ามาแถลงครับ

แต่ถ้าเล่นท่าที่ปกติผมก็ใช้บ้างเป็นบางเวลาก็

จัดการสร้าง iptables rules และทดสอบว่าทำงานได้ตามต้องการ

#  iptables-save > /usr/local/etc/firewall

แล้วก็เพิ่ม คำสั่งเข้าไปใน /etc/rc.local ครับ (ก่อน exit 0)

...
...
/sbin/iptables-restore < /usr/local/etc/firewall &

exit 0

คำเตือน: วิธีนี้อาจไปกระทบกับการทำงานของ firewall ใน proxmox เอง โปรดใช้ด้วยความระมัดระวัง

Creative Commons License ลิขสิทธิ์ของบทความเป็นของเจ้าของบทความแต่ละชิ้น
ผลงานนี้ ใช้สัญญาอนุญาตของครีเอทีฟคอมมอนส์แบบ แสดงที่มา-อนุญาตแบบเดียวกัน 3.0 ที่ยังไม่ได้ปรับแก้