iptables用法

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 規則檔你可任意放在你想要的地方,只要路徑指定正確即可

  • iptables 範例1
  • 底下示範一個簡單的範例,只做基本防護。 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
    


  • iptables 範例2
  • 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

    將此檔放於你的桌面,要登入時點它一下就算幫你敲門好了。

  • iptables 範例3
  • 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 檔獨立出來

    參考資料study-area linux基本設定

    由於 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 主要用來除錯時使用的﹐因為它產生的資訊實在太多了﹐除非真的有此必要﹐否則不要設定

    分類: linux。這篇內容的永久連結

    發佈留言

    發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *