centOS 與 debian 的操作細節有所不同,因此分開來講
centOS 部份
iptables規則的存放位置
在 centOS 裡, iptables 的規則一定要存放在這裡 /etc/sysconfig/iptables
檔案內容的格式大概是這樣:
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
### Flush all rules
-F
### Trusted IP Access
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT
-A INPUT -i eth+ -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -i eth0 -p tcp -m multiport --dports 443,80 -j ACCEPT
COMMIT
設開機啟動
請下指令 setup
進去看 Firewall configuration 的選項看有沒有打勾 (請勾在 Enabled) 有的話開機會自動起來的。
我們要驗証防火牆會不會開機自動啟動,請下指令
service iptables stop
service iptables start
這樣就算是把 iptables 重啟了,接著請下指令看 iptables 有沒有規則存在
iptables -L -n
debian 部份
設開機啟動的部份有些不一樣
vim /etc/network/interfaces
在檔案的最後加上這一行
post-up /sbin/iptables-restore < /etc/iptables.conf
規則檔你可任意放在你想要的地方,只要路徑指定正確即可
底下示範一個簡單的範例,只做基本防護。 INPUT 預設政策為 DROP,開放幾個常用 port。
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
### Flush all rules
-F
### Trusted IP Access
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i eth+ -m state --state RELATED,ESTABLISHED -j ACCEPT
#內網IP全部開放
#若你不需指定網卡,可直接拿掉 -i eth+ ,多寫的用意是方便我在指定網卡時,可直接套用語法修改 + 為網卡數字
-A INPUT -i eth+ -s 192.168.0.0/16 -j ACCEPT
#ftp port:20~21
#ftp passive(被動式)port:7000~7500 這個 port 範圍需配合你的 ftp 設定才行
#ssh port:22 web:80
-A INPUT -i eth0 -p tcp -m multiport --dports 20:22,80,7000:7500 -j ACCEPT
COMMIT
Port knocking 端口碰撞技術
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
### Flush all rules
-F
### Trusted IP Access
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i eth+ -m state --state RELATED,ESTABLISHED -j ACCEPT
#內網IP全部開放,若你不想放開內網IP,可刪除底下這行
-A INPUT -i eth+ -s 192.168.0.0/16 -j ACCEPT
#web:80 若你沒有架 web server 可刪除底下這行
-A INPUT -i eth0 -p tcp -m multiport --dports 80 -j ACCEPT
-N door
#新增一個叫做 door 的 chain。
-A door -m recent --name knock1 --remove
#把進來door chain裡的封包,除去標籤名為 knock1 的封包。
-A door -m recent --set --name knock2
#把進來door chain裡的封包,貼上標籤名為 knock2 的封包。
-A INPUT -p tcp --dport 168 -m recent --set --name knock1
#把連線目標埠為168的封包,貼上 knock1 的標籤。
-A INPUT -p tcp --dport 978 -m recent --rcheck --name knock1 -j door
#把連線目標埠為978、同時也要有貼著 knock1標籤的封包,送到 door 處理
#===> 也就是移去knock1標籤、然後被貼上 knock2 標籤。
-A INPUT -p tcp --dport 22 -m recent --rcheck --seconds 10 --name knock2 -j ACCEPT
#被貼上 knock2 標籤的封包,同時也想連我的 22 port 時,讓它通過。
COMMIT
原理說明:22port 原本都是關著的,你必須用 telnet 依序去敲 168,978 port 之後, 22port 才會打開 10 秒鐘。
適用時機:client沒有固定IP,沒有金鑰可用時。
以上的這個敲門動作,我們可以寫個程式來讓它自動幫我們敲門,才不會那麼麻煩
開一個文字檔,存檔時副檔名記得要改成 .bat 貼上底下內容,並修改你的IP
start/b telnet 你的IP 168
start/b telnet 你的IP 978
將此檔放於你的桌面,要登入時點它一下就算幫你敲門好了。
INPUT、OUTPUT 預設政策為 DROP,開放少數可連外網站的IP,違法外連會做log記錄下來。
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT DROP [0:0]
#目地:訂一個較為嚴格的防火牆規則,擋進也擋出
### Flush all rules
-F
### Trusted IP Access
-A INPUT -i lo -j ACCEPT
-A INPUT -p icmp --icmp-type echo-request -j ACCEPT
#-A INPUT -i eth+ -m state --state RELATED,ESTABLISHED -j ACCEPT
#若你有真實IP,這裡要記得改成你的gateway IP
#若你不需指定網卡,可直接拿掉 -i eth+ ,寫在這裡的用意是方便我指定網卡時直接套用語法修改 + 為網卡數字
-A INPUT -i eth+ -s 192.168.1.254/32 -j ACCEPT
#tcp port 22945:sshd 3100~3300 passive ftp
-A INPUT -i eth0 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
#53port for對外查詢DNS時放行
-A INPUT -i eth0 -p tcp -m multiport --sports 53 -j ACCEPT
-A INPUT -i eth0 -p udp -m multiport --sports 53 -j ACCEPT
##底下 udp 規則 for asterisk sip 5060,rtp10000~20000
-A INPUT -i eth0 -p udp -m multiport --dports 53,5060,10000:20000 -j ACCEPT
#不開放 udp port 4569:IAX2 123:ntpd
#底下是 OUTPUT 放行規則
-A OUTPUT -o lo -j ACCEPT
#對外 ping
-A OUTPUT -p icmp -j ACCEPT
#若你有真實IP,這裡要記得改成你的gateway IP
#若你不需指定網卡,可直接拿掉 -o eth+ ,寫在這裡的用意是方便我指定網卡時直接套用語法修改 + 為網卡數字
-A OUTPUT -o eth+ -s 192.168.1.254/32 -j ACCEPT
#針對eth0網卡 port 位 TCP 80 放行,
-A OUTPUT -o eth0 -p tcp -m multiport --sports 20:22,80 -j ACCEPT
#底下 udp 規則 for asterisk sip 5060,rtp10000~20000
-A OUTPUT -o eth0 -p udp -m multiport --sports 5060,10000:20000 -j ACCEPT
#53port for對外查詢DNS時放行
-A OUTPUT -o eth0 -p tcp -m multiport --dports 53 -j ACCEPT
-A OUTPUT -o eth0 -p udp -m multiport --dports 53 -j ACCEPT
#底下是額外放行的網站
#Akismet 伺服器 66.135.58.61~62 72.233.69.88~89 72.233.69.2
-A OUTPUT -o eth+ -p tcp -d 66.135.58.60/30 --dport 80 -j ACCEPT
-A OUTPUT -o eth+ -p tcp -d 72.233.69.0/24 --dport 80 -j ACCEPT
-A INPUT -i eth+ -p tcp -m multiport -s 66.135.58.60/30 --dports 1024:65535 -j ACCEPT
-A INPUT -i eth+ -p tcp -m multiport -s 72.233.69.0/24 --dports 1024:65535 -j ACCEPT
#www.google-analytics.com 80 & 443 port
#173.194.72.100~102 173.194.72.113 173.194.72.138~139
-A OUTPUT -o eth+ -p tcp -m multiport -d 173.194.72.0/24 --dports 80,443 -j ACCEPT
-A INPUT -i eth+ -p tcp -m multiport -s 173.194.72.0/24 --dports 1024:65535 -j ACCEPT
#底下這行是安全性設定必須在整個規則的最後面
#底下這行一定要加在最後面,才能在以上可放行的規則都放行了,才會記錄到沒有放行的動作
#若加在太前面的話,則會記錄到太多正常放行的動作。
-A INPUT -i eth+ -m state --state RELATED,ESTABLISHED -j LOG
-A OUTPUT -j REJECT
COMMIT
將iptables log 檔獨立出來
由於 iptables log 檔預設是混在 /var/log/message 裡,要看很麻煩,所以我們要將它分離出來
系統預設 iptables 的 log 等級是 4 ( warn ) 所以我們編輯以下檔案
vim /etc/rsyslog.conf
加入這行
kern.=warn /var/log/iptables.log
再下指令
touch /var/log/iptables.log
/etc/init.d/rsyslog restart
即可
若你要更改上面的 log 等級,在 iptables 的規則裡也要改
例:
-A INPUT -i eth+ -m state –state RELATED,ESTABLISHED -j LOG –log-level debug
不過,基本上所記錄的訊息是沒什麼差別的
補充說明:
log level 來指定一個 facility 的訊息重要程度﹐按重要程度來分﹑由低至高一共有如下這些
level﹕info﹑notice﹑err﹑crit﹑alert﹑emerg 或 panic
另外﹐還有一些特殊的 level﹕debug 主要用來除錯時使用的﹐因為它產生的資訊實在太多了﹐除非真的有此必要﹐否則不要設定