Introduction
CentOS & Ubuntu iptables guide.
其中CentOS我認為較方便設定。
指令與參數
快速阻擋一組IP(1.2.3.4/32
)的所有連線:
$ iptables -A INPUT -s 1.2.3.4/32 -j DROP
常用參數:
--append -A :新增至Chain (預設`INPUT`, `FORWARD`, `OUTPUT`)
--source -s :IP soruce
--protocol -p :protocal
--dport :目的Port,指服務Port (`--destination-port`)
--jump -j :目標規則 (`ACCEPT`, `DROP`)
設定檔
CentOS
/etc/sysconfig/iptables
CentOS直接修改設定檔後重啟即可,且永久生效。
service iptables restart
Ubuntu
沒有可編輯設定檔,只能透過iptables
指令加入編輯。
$ iptables {rule}
例如:
$ iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.1/16 --dport 22 -j ACCEPT
新增與載入設定檔
Ubuntu社群大多建立/etc/iptables.rules
作為IPTABLES規則表,再下指令引入至IPTABLES:
# 利用指令建立規則表,會自動包含格式
iptables-save > /etc/iptables.rules
# 載入規則表,立即生效至IPTABLES
iptables-restore < /etc/iptables.rules
永久生效設定:
sudo vim /etc/network/interfaces
在主要網路卡最後面加入:(每次開機後套用&每次關機前保存)
pre-up iptables-restore < /etc/iptables.rules
post-down iptables-save > /etc/iptables.rules
規則
規則表需要包含三向的完整設定,如Ubuntu的iptables-save
格式:
*filter
:INPUT ACCEPT [416:33446]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [147:59940]
COMMIT
以SSH(22)白名單開放For OUTPUT ACCEPT為例:
$ iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 192.168.0.1/16 --dport 22 -j ACCEPT
指令速查
清除所有規則(Flush)
注意不要清除到自己遠端進入 host 的白名單
$ iptables -F
# 僅清除 INPUT chain
$ iptables -F INPUT
阻擋IP
阻擋來自1.2.3.4
的所有連線:
$ iptables -A INPUT -s 1.2.3.4 -j DROP
阻擋來自1.2.3.0/24
的所有連線:
$ iptables -A INPUT -s 1.2.3.0/24 -j DROP
阻擋所有TCP
類型的SSH
port連線 (--dport
輸入ssh
或22
相同):
$ iptables -A INPUT -p tcp --dport ssh -j DROP
針對IP與SSH配對阻擋:
$ iptables -A INPUT -s 1.2.3.0/24 -p tcp --dport ssh -j DROP
頻率速率限制
限制HTTP服務封包速率為20/s
(若封包大小為1500KB
,則換算流量限制為30KB/s
)
$ iptables -A INPUT -p tcp --dport http -m limit --limit 20/s -j ACCEPT
$ iptables -A INPUT -p tcp --dport http -j DROP
一次宣告多個Port可以使用-m multiport
:
$ iptables -A INPUT -p tcp -m multiport --dport http,https -m limit --limit 20/s -j ACCEPT
啟用入站(Inbound)log 紀錄
可以透過以下指令記錄所有進入 port 80(HTTP)的 TCP 封包:
$ iptables -A INPUT -p tcp --dport 80 -j LOG --log-prefix "INBOUND: " --log-level 4
iptables 的 log 寫入的是系統的 syslog,由 rsyslog 或 journald 管理。
- Ubuntu / Debian:
/var/log/syslog
- CentOS / RHEL :
/var/log/messages
使用 journalctl 查看:
journalctl -k | grep INBOUND
若不想被大量封包洗版,可以加上頻率限制:
# 限制最多每分鐘記錄 5 筆符合條件的封包。
$ iptables -A INPUT -p tcp --dport 80 -m limit --limit 5/min -j LOG --log-prefix "INBOUND: "
依完整內容刪除規則
iptables -D INPUT -p tcp --dport 80 -j LOG --log-prefix "INBOUND: " --log-level 4