轉自:http://blog.csdn.net/jixiuffff/article/details/5879547
[c-sharp] view plaincopy
- # 五個檢查點PREROUTING ,FORWARD POSTROUTING INPUT OUTPUT
- # 一個資料包從prerouting 進入我的機器,它有兩個去向,一是經過input 訪問我機器上的應用程式,後經output ,postrouting
- # 流走,另一個去向是:直接經forward postrouting 流向別的機器,也就是說我的機器只是充當路由,資料包經我的機器到其他機器上
- #
- # PREROUTING ---------------->FORWARD---------------------> POSTROUTING
- # | ^
- # | |
- # INPUT OUTPUT
- # | |
- # v |
- # --->我機器上的應用程式---------->
- #
- #iptables 的結構由上到下是:表(table),規則鏈(chain),規則(rule) ,表由規則鏈組成,規則鏈由一條條規則群組成
- #iptables 預設有三張表filter ,nat ,mangle , 使用-t 參數指定對哪張表操作,如果不指定,則預設是對filter 表進行操作
- #
- # filter 預設有三條內建的規則鏈, INPUT FORWARD OUTPUT
- # nat 。。。。。。。。。。。 POSTROUTING ,OUTPUT PREROUTING
- # mangle .....兩............. OUTPUT PREROUTING
- #
- #iptables 命令的一般格式 iptables [ -t table] 操作 [ chain] [options ]
- #一個查對完整參數的樣本
- #iptables -t filter -I INPUT 2 -i eth0 -s 10.2.1.111 --sport 1234 -d 10.2.1.123 --dport 22 -j ACCEPT
- #iptables -t filter -I OUTPUT 2 -i eth0 -d 10.2.1.123 --dport 22 -s 10.2.1.123 --sport 1234 -j ACCEPT
- # 這條命令是:在filter 表中的INPUT 鏈上 插入一條規則在2處(此規則排在第二個位置) ,規則的具體:從我的eth0 網卡聯我,且對方機 的ip 是10.2.1.111 對方連接埠1234,訪問我的ip :10.2.1.123 我的22連接埠 ,時才接受
- # 然後是,從我的ip 10.2.1.123:22 向10.2.1.111:1234 經eth0 網卡發出的包允許存取
- #iptables -F ,清空filter 的所有規則鏈
- #iptables -t nat -F 清空nat 表的所有規則鏈
- ###################################################################################################
- # 關於INPUT ,OUTPUT 都是相對於“我”這台機器,即INPUT :表示向我輸入資料,OUTPUT 表示“我”向外輸出資料
- # 而-s -d --sport --dport 分別表示 源ip(source) ,目標ip(destination) ,源ip的連接埠,目標ip的連接埠
- # 當在對INPUT 作處理的時候,-s 指的是對方的機器,-d 指的是我這台機器,因為資料是從對方的機器流向我的,
- # 而對OUTPUT 作處理的時候 -s 指的是我,而-d 指的是對方的機器
- #正確使用防火牆,一般預設設為拒絕所有,然後只開放需要開放的,而不是允放所有,只拒絕需要拒絕的
- #首先啟動iptables 服務/etc/init.d/iptables start
- #我用的是gentoo 系統裝上iptables 後,第一次運行 它它提示我要先運行/etc/init.d/iptables save ,好像是做一些初始化或者儲存一些檔案,
- /etc/init.d/iptables save
- /etc/init.d/iptables start
- #啟動後看一下預設的訪問規則
- iptables -L 或者iptables -L --line-number 顯示行號, -v 詳細資料
- Chain INPUT (policy ACCEPT)
- target prot opt source destination
- Chain FORWARD (policy ACCEPT)
- target prot opt source destination
- Chain OUTPUT (policy ACCEPT)
- target prot opt source destination
- #預設情況下是policy 是ACCEPT ,等於沒有防火牆,現在修改預設的policy
- #注意千萬不要使用遠程ssh 串連進行這個操作,因為它也會關閉ssh 使用的22 連接埠,
- #使用ssh 串連 ,首先開放了22 連接埠再進行下面三條命令
- # sshd
- # 允許任何機器向我的22 連接埠發出請求
- # 這裡沒用用-t 則預設是-t filter
- iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- # 等價於:iptables -t filter -A INPUT -p tcp --dport 22 -j ACCEPT
- #允許我的22連接埠向外輸出資料
- iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
- #如果只限某些特定ip 的機器訪問我,上面兩條要換成
- iptables -A INPUT -p tcp --dport 22 -s 10.2.1.110 -j ACCEPT
- iptables -A OUTPUT -p tcp --sport 22 -d 10.2.1.110 -j ACCEPT
- #現在只有ip為10.2.1.110的ip 可以訪問我
- #
- iptables -P INPUT DROP
- iptables -P OUTPUT DROP
- iptables -P FORWARD DROP
- #預設的策略只能是ACCEPT ,DROP ,不能是REJECT
- Chain INPUT (policy DROP)
- target prot opt source destination
- Chain FORWARD (policy DROP)
- target prot opt source destination
- Chain OUTPUT (policy DROP)
- target prot opt source destination
- #現在無論INPUT ,OUTPUT ,FORWARD 預設都是丟包(drop拒絕),而不是accept 接受
- #此時我極度安全,等於沒連網,我不能訪問別人,別人不能訪問我
- #現在我想上網
- # 假 如我想訪問對方的80 連接埠,其實包括了兩個方面,一是我有許可權向對方的80 連接埠發出請求,二是有許可權從對方的80 連接埠取得資料,這裡只規定對方的 80 連接埠,而沒有規定我從哪個連接埠去訪問它的80 ,意味著我可以從任意連接埠訪問對方的80連接埠,這裡連接埠都是tcp 類型的
- #允許我向對方的80 連接埠發出請求
- iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
- #允許對方的80 連接埠向我返回資料
- iptables -A INPUT -p tcp --sport 80 -j ACCEPT
- # 雖然我們此時可以訪問對方的80 連接埠,但是我們在瀏覽器中輸入www.baidu.com 並不能顯示對方的網頁,但是 http://202.108.22.142/ 確可以。因為在這個過程中還要進行dns網域名稱解析,又要有另一個許可權,那就是允許我向 dns server 的udp 53 連接埠請求,並允許從它返回資料
- iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
- iptables -A INPUT -p udp --sport 53 -j ACCEPT
- # 這裡沒有指定dns server 的ip 地址,如果想邊dns server 的ip 也做限定的話
- # 可以這樣寫
- iptables -A OUTPUT -p udp -d 211.64.208.1 --dport 53 -j ACCEPT
- iptables -A INPUT -p udp -s 211.64.208.1 --sport 53 -j ACCEPT
- #
- #我校園網用drcom 進行流量計費要開upd 61440 連接埠
- # drcom
- #允許211.64.208.160 從它的61440 (sport) 連接埠串連到我的機器的61440 (dport)
- # -s 表示源,表示從哪台機器向我發送資料
- iptables -A INPUT -p udp --sport 61440 --dport 61440 -s 211.64.208.160 -j ACCEPT
- #允許 我的機器 從61440(sport) 連接埠 向211.64.208.160 的61440(dport)連接埠發送資料
- # -d 指定對方機器(目標機器)
- iptables -A OUTPUT -p udp --sport 61440 --dport 61440 -d 211.64.208.160 -j ACCEPT
- #目前為止,都是作為一個客戶去訪問別人,如果我要在我的電腦上架設個伺服器又當如何呢,比如架設sshd 及web 伺服器
- #web伺服器,開放80連接埠
- iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
-
- #開放ftp 服務
- #iptables -A INPUT -m state –state ESTABLISHED,RELATED -j ACCEPT
- #允許串連保持的被動訪問。
- #ftp協議是一個簡單、保密性差(明碼)的tcp協議,它的工作原理是用戶端先連伺服器端的21連接埠,然後經過3步的握手以後建立了一條串連。要注意的是,這條串連只可以用來傳輸ftp的命令,只有這條串連的話是什麼都傳不了的,就算是用“ls”命令來查看檔案也不行。
- # 建立了命令的串連以後,伺服器端就要建立一條資料的串連。資料的串連又分為主動模式(port)和被動模式(passive)。ftp預設是被動模式,主 動和被動之間使用"pass"命令切換。主動模式通過20連接埠與用戶端相連,而被動模式卻使用1024以後的連接埠與用戶端相連。由於1024以後的連接埠是 隨機分配的,所以在被動模式下我們是不知道服務端是使用什麼連接埠與用戶端串連的。也就是說,我們是不知道iptables要開放什麼連接埠。
- #
- #
- #1 在/etc/conf.d/iptables設定檔中 加入 如下語句(不同發行版可能檔案位置不同)
- #IPTABLES_MODULES="ip_conntrack_ftp"
- #
- iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
- iptables -A INPUT -p tcp --dport 21 -j ACCEPT
- iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
- #主動模式使用20連接埠
- iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
- iptables -A INPUT -p tcp --dport 20 -j ACCEPT
-
- #對於lo 裝置的資料包都允許存取 ,也就是本機資料 -i 表示輸入,-o 表示輸出
- #表示所有從lo 來的資料accept
- iptables -t filter -I INPUT l -i lo -j ACCEPT
- #表示流向lo 的資料accept
- iptables -t filter -I OUTPUT 1 -o lo -j ACCEPT
- #
- #
- #
- #
-
-
-
-
- 完整的指令碼:
- sudo /etc/init.d/iptables save
- sudo /etc/init.d/iptable restart
- #清空表中規則鏈
- iptables -F
- iptables -X
- iptables -t nat -F
- iptables -t nat -X
- #開放sshd服務
- iptables -A INPUT -p tcp --dport 22 -j ACCEPT
- iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
- #預設drop 所有包
- iptables -P INPUT DROP
- iptables -P OUTPUT DROP
- iptables -P FORWARD DROP
- #本機裝置允許存取
- iptables -t filter -I INPUT 1 -i lo -j ACCEPT
- iptables -t filter -I OUTPUT 1 -o lo -j ACCEPT
- #dns
- iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
- iptables -A INPUT -p udp --sport 53 -j ACCEPT
- #上網
- iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
- iptables -A INPUT -p tcp --sport 80 -j ACCEPT
- #drcom
- iptables -A INPUT -p udp --sport 61440 --dport 61440 -s 211.64.208.160 -j ACCEPT
- iptables -A OUTPUT -p udp --sport 61440 --dport 61440 -d 211.64.208.160 -j ACCEPT
- # ftp
- # 在設定檔中加入 IPTABLES_MODULES="ip_conntrack_ftp"
- iptables -I INPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT
- iptables -I OUTPUT 2 -m state --state ESTABLISHED,RELATED -j ACCEPT
- iptables -A INPUT -p tcp --dport 21 -j ACCEPT
- iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
- iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
- iptables -A INPUT -p tcp --dport 20 -j ACCEPT
- #web 服務
- iptables -A INPUT -p tcp --dport 80 -j ACCEPT
- iptables -A OUTPUT -p tcp --sport 80 -j ACCEPT
- # dhcp ,使用dhcp 獲得ip ,
- # dhcp
- iptables -A INPUT -p udp --sport 67 --dport 68 -j ACCEPT