七個有意思的 iptables 用法


譯者:Nica < nicaliu at gmail dot com >
.
iptables 是一套含括在最新 Linux 分支套件裡的防火牆,網路上已經有相當多關於它的的教戰守則。
.
它是使用者層級的一套應用,讓系統管理者能夠組態 Linux kernel 防火牆 (會是以各種不同的 Netfilter 模組實作) 所提供的表單,並儲存它的 chains 與 rules。不同的 kernel 模組與程式使用的是不同的協定;iptables 應用在 ipv4 上、ip6tables 應用在 ipv6 上、arptables 應用在 ARP 上,而 ebtables 則特指定為 Ethernet frames 所用。
.
iptables 需要較高權限才能操作,因此必須由 root 使用者的身份執行,否則無法使用。在絕大多數 linux 系統上,iptables 安裝在 /usr/sbin/iptables 裡,且擁有自已的 man page 文件,在已安裝的情況下 man iptables 就能開啟。
.
要瞭解 iptables 的基本用法,建議參考 Ubuntu 指導手冊:
.
這裡,我要講的是這個指令的一些特別用法。
.
【任務一:封鎖已知的問題主機,讓它到不了你的機器】
wget -qO – http://infiltrated.net/blacklisted|awk ‘!/#|[a-z]/&&/./{print “iptables -A INPUT -s “$1″ -j DROP”}’
Blacklisted 是編輯過的所有已知問題主機 (僵屍網路botnets、濫發垃圾郵件主機spammer、暴力攻擊主機bruteforcers 等等),會每個小時更新。這個指令會取得清單、幫你建立 rules,若你要它們動階封鎖,在命令列最後加入 |sh 即可。這是一個相當實用的解法,封鎖所有但允許指定的幾個,很多人沒這麼作只是因為手邊沒有一個這樣的 script。
【譯註:此 script 將 rule 寫入正執行中的 iptables,當iptables 重新啟動,這些 rule 將會清除需重新載入】
.
【任務二:有人”敲”了,就打開特定的門(通訊埠)】
knock < host > 3000 4000 5000 && ssh -p
user@host && knock < host > 5000 4000 3000
這個例子裡,看不到直接用到 iptables 什麼,它其實是將 iptables 用在 knockd 組態檔裡,你得安裝它。以下是 sshd (通訊埠22) 的組態範例。
.
[options]
logfile = /var/log/knockd.log
[openSSH]
sequence = 3000,4000,5000
seq_timeout = 5
command = /sbin/iptables -A INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
[closeSSH]
sequence = 5000,4000,3000
seq_timeout = 5
command = /sbin/iptables -D INPUT -i eth0 -s %IP% -p tcp –dport 22 -j ACCEPT
tcpflags = syn
.
【任務三:對通訊埠 80 重導至較高通訊埠】
iptables -t nat -A PREROUTING -p tcp –dport 80 -j REDIRECT –to-port 9001
當你希望一般使用者執行較高通訊埠的 daemon,但服務顯示的是標準通訊埠時,這個規則就很好用了。本例中你可以讓一般使用者啟動/停用聆聽 9001 通訊埠的 apache,但他的網站是顯示通訊埠 80。
.
【任務四:讓 proxy 只用在非本地端 LAN 上】
iptables -t nat -A OUTPUT -d ! 10.0.0.0/8 -p tcp –dport 80 -j DNAT –to-destination 10.1.1.123:3128
把 10.0.0.0/8 換成你最大的那個本地端子網路,然後將 10.1.1.123:3128 改成你的 proxy 設定。不過要注意這個設定只有在 proxy 伺服器組態為 passive 才能運作。
Now your firefox transparently proxy’s stuff destined outside your network.. and Doesn’t proxy stuff inside your network. as well as all your other favorite web applications. curl, wget.
.
【任務五:限制只能有 10 個 ssh 連線】
/sbin/iptables -A INPUT -p tcp –syn –dport 22 -m connlimit –connlimit-above 10 -j REJECT
這個命令可讓你限制存取連線某通訊埠在一定的範圍內,對用來限制連線到 Apache 通訊埠的數量也相當好用。
.
【任務六:限制 ssh 每 15 秒內只能有一個 session】
iptables -A INPUT -p tcp -i eth0 -m state –state NEW –dport 22 -m recent –update –seconds 15 -j DROP
iptables -A INPUT -p tcp -i eth0 -m state –state NEW –dport 22 -m recent –set -j ACCEPT
這兩條規則讓 iptables 命令從相同 IP 連結至通訊埠 22 的兩個新連線中間必須間隔 15 秒。若你的防火牆已有自已的 ssh accept 規則,請用它來取代上面 ACCEPT 這行。
.
【任務七:一個命令指定多重指令】
iptables -A INPUT -p tcp -m multiport –dports 22,80,143,6000:6003 -j ACCEPT
Multiport 擴充元件讓使用者可以指定多個通訊埠與範圍,透過一行指令就能建立複雜的規則。
multiport 指令讓你省掉好幾行-要新增修改時就簡單得多,只有一行所需的系統處理也較少。
.
原文出處:

留言

這個網誌中的熱門文章

vim 的取代置換功能「s」

Wi-Fi Multimedia (WMM)

CoAP基礎