用Linux的iptables做代理伺服器和防火牆配置

火星人 @ 2014-03-12 , reply:0


  

 

 

代理/防火牆

  1.iptables規則表

  Filter(針對過濾系統):INPUT、FORWARD、OUTPUT

  NAT(針對地址轉換系統):PREROUTING、POSTROUTING、INPUT、OUTPUT

  Mangle(針對策略路由和特殊應用):OUTPUT、POSTROUTING

  2.安裝包

  iptables-1.2.7a-2

  3.配置防火牆

  1) 命令語法

  Usge: iptables [-t table] -[ADC] chain rule-specification [options]

  iptables [-t table] -I chain [rulenum] rule-specification [options]

  iptables [-t table] -R chain rulenum rule-specification [options]

  iptables [-t table] -D chain rulenum [options]

  iptables [-t table] -[LFZ] [chain] [options]

  iptables [-t table] -N chain

  iptables [-t table] -X [chain]

  iptables [-t table] -P chain target [options]

  iptables [-t table] -E old-chain-name new-chain-name

  規則操作參數說明:

  -A:在所選擇的鏈末添加一條或更多規則;

  -D:從所選鏈中刪除一條或更多規則。有兩種方法:把被刪除規則指定為鏈中的序號(第一條序號為1),或者指定為要匹配的規則;

  -R:從選中的鏈中取代一條規則。如果源地址或目的地址轉換為多地址,該命令會失敗。規則序號從1開始;

  -I:根據給出的規則序號,向所選鏈中插入一條或更多規則。所以,如果規則序號為1,規則會插入鏈的頭部。這也是不指定規則序號時的默認方式;

  -L:現實所選鏈的所有規則。如果沒有所選鏈,將顯示所有鏈。也可以和z選項一起用,這是鏈會自動列出和歸零;

  -F:清空所選鏈。這等於把所有規則一個個刪除;

  -Z:把所有鏈的包以及位元組的計數器清空;

  -N:根據給出的名稱建立一個新的用戶定義鏈。這必須保證沒有同名的鏈存在;

  -X:刪除指定的用戶自定義鏈。這個鏈必須沒有被引用,如果被引用,在刪除之前必須刪除或者替換與之有關的規則。如果沒有給出參數,這條命令將試著刪除每個非內建的鏈;

  -P:設置鏈的目標規則;

  -E:根據用戶給出的名字對指定鏈進行重名名;

  規則定義參數說明:

  -p [!]protocol:

  規則或者包檢查(待查包)的協議。指定協議可以是TCP、UDP、ICMP中的一個或者全部,也可以是數值,代表這些協議中的某一個。當然也可以使用在/etc/protocols中定義的協議名。在協議名前加上"!"表示相反的規則。數字0相當於所有all。Protocol all會匹配所有協議,而且這是預設時的選項。在和check命令結合時,all可以不被使用;

  -s[!]address[/mask]:

  指定源地址,可以是主機名、網路名和清楚地IP地址。mask說明可以是網路掩碼或清楚的數字,在網路掩碼的左邊指定網路掩碼左邊"1"的個數,因此,mask值為24等於255.255.255.0。在指定地址前加上"!"說明指定了相反的地址段。標誌--src是這個選項的簡寫;

  -d[!]address[/mask]:

  指定目標地址,要獲取詳細說明請參見-s標誌的說明。標誌--dst是這個選項的簡寫;

  -j target:

  指定規則的目標:也就是說包匹配應當做什麼。目標可以為ACCEPT(通過)、 DROP(刪除)、RETURN(返回)、REDIRECT(重新指向)、SNAT(源地址轉換)、DNAT(目標地址轉換)、MASQUERADE(偽裝)等,還可以是用戶自定義鏈。如果規則的這個選項被忽略,那麼匹配的過程不會對包產生影響,不過規則的計數器會增加;

  -i[!][name]:

  待選的可接受包介面名稱,包通過該介面接收(在鏈INPUT、FORWORD和 PREROUTING中進入的包)。當在介面名前使用"!"說明后,指的是相反的名稱,如果介面名後面加上"+",則所有以次介面名開頭的介面都會被匹配。如果這個選項被忽略,會假設為"+",那麼將匹配任意介面;

  -O[!][NAME]:

  這是包經由該介面送出的可選的出口名稱,包通過該口輸出(在鏈FORWARD、OUTPUT和POSTROUTING中送出的包)。其他設置同上。

    2) 匹配規則擴展選項:

  tcp:當指定-p tcp,且未指定其他匹配的擴展,則裝載這些擴展。

  --source-port[!][port[:port]]:

  源埠或埠範圍指定。可以是服務名或埠號。使用格式埠:埠也可以指定包含的(埠)範圍。如果忽略首埠號,默認是0,如果忽略末埠號,默認是65535,如果第二個埠號大於第一個,則他們進行交換。這個選項可以使用--sport的別名;

  --destionation-port[!][port:[port]]:

  目標埠或埠範圍指定。這個選項可以使用--dport別名來代替;

  --tcp-flags[!]mask comp:

  匹配指定的TCP標記。第一個參數是要檢查的標記,一個用逗號分開的列表,第二個參數是用逗號分開的標記表,是必須設置的。標記如:SYN(同步)、ACK(應答)、FIN(結束)、RST(重設)、URG(緊急)、PSH(送入)ALLNONE。

  命令iptables -A FORWARD -p tcp --tcp-flags SYN, ACK, FIN, RST SYN只匹配那些設置了SYN標記而沒有設置ACK、FIN和RST標記的包。

  udp:當指定-p icmp且未指定其他匹配的擴展時,則裝載這些擴展。

  --icmp-type[!]typename:這個選項允許指定ICMP類型,可以是一個數值型的ICMP類型,或者是某個由命令"iptables -p icmp -h"所顯示的ICMP類型名。

  mac:

  --mac-source[!]address:匹配物理地址。必須是XX:XX:XX:XX:XX這樣的格式。注意,他只對來自以太設備並進入PREROUTING、FORWORD和INPUT鏈的包有效。

  limit:這個模塊匹配標誌用來對網路數據的通過速率進行標記,他和LOG目標結合使用,給出有限的登陸數。當達到這個極限值時,使用這個擴展包的規則將進行匹配。(除非使用了!標記),他的擴展選項包括:

  --limit rate:最大平均匹配速率,可賦的值有"/second"、"/minute"、"/hour"或"/day"這樣的單位,默認是"3/hour";

  --limit-burst number:待匹配包初始個數的最大值。若前面指定的極限還沒達到這個數值,則該數字加1。默認值是5。

  multiport:這個模塊匹配一組源埠或目標埠,最多可以指定15個埠。只能和-p tcp或者-p udp連著使用:

  --source-port[port[,port]]:如果源埠是其中一個給定埠,則匹配;

  --destination-port[port[,port]]:如果目標埠是其中一個給定埠,則匹配;

  --port[port[,port]]:若源埠和目的埠相等並與某個給定埠相等,則匹配。

  owner:此擴展為本地生成包匹配包的創建者,只能用於OUTPUT鏈,而且,有一些包(如ICMP ping應答)還可能沒有所有者,因此永遠不會匹配:

  --uid-owner userid:如果給出有效的user id,那麼匹配他的進程產生的包;

  --gid-owner groupid:如果給出有效的group id,那麼匹配它的進程產生的包;

  --sid-owner sessionid:根據給出的會話組成匹配該進程產生的包。

  REJECT:作為對匹配的包的相應,返回一個錯誤的包,其他情況下和DROP相同。此目標只適用於INPUT、FORWARD和OUTPUT鏈,以及調用這些鏈的用戶自定義鏈。這幾個選項控制返回的錯誤包的特性:

  --reject-with type:其中的type可以是icmp-net-unreachable、icmp-host-unreachable、icmp-port- unreachable、icmp-porto-unreachable、icmp-net-prohibited或者icmp-host- prohibited,該類型會返回相應的ICMP錯誤信息(默認是port-unreachable)。選項echo-reply也是允許的;它只能用於指定ICMP ping包的規則中,生成ping的回應。

  SNAT:這個目標只適用於nat表的POSTROUTING鏈。它規定修改包的源地址(此連接以後所有的包都會被影響),停止對規則的檢查:

  --to-source [][:port-port]:

  可以指定一個單一的新IP地址,一個IP地址範圍,也可以附加一個埠範圍(只能在指定-p tcp或者-p udp的規則里)。如果未指定埠範圍,源埠是512以下的埠惠被安排為其他的512以下的埠;512到1024之間的埠會被安排為1024以下的,其他埠會被安排為1024或以上。如果可能,埠不會被修改;

  --to-destiontion [][:port-port]:

  可以指定一個單一的新的IP地址,一個IP地址範圍,也可以附加一個埠範圍(只能在指定-p tcp或者-p udp的規則里)。如果未指定埠範圍,目標埠不會被修改。

  MASQUERADE:只用於nat表的POSTROUTING鏈。只能用於動態獲取ip(撥號)連接:如果擁有靜態IP地址,要用SNAT。偽裝相當於給包發出時所經過介面的IP地址設置一個映像,當借口關閉時,連接會終止。這是因為,當下一次撥號時,未必是相同的介面地址(以後所有建立的連接都將關閉)。他有一個選項:

  --to-ports []:指定使用的源埠範圍,覆蓋默認的SNAT源地址選擇。這個選項只適用於指定了-p tcp或者-p udp的規則。

  REDIRECT:只適用於nat表的PREROUTING和OUTPUT鏈,以及只調用他們的用戶定義鏈。他修改包的目標IP地址來發送包到機器自身(本地生成的包被安置為地址127.0.0.1),包含一個選項:

  --to-ports []:指定使用的目的埠或埠範圍:不指定的話,目標埠不會被修改。只能用於指定了-p tcp或者-p udp的規則。

  3) 包過濾設置

  舉例:

  假如有這樣一個區域網,內部IP地址範圍192.168.1.1-254,網關地址為192.168.1.1,綁定在eth0介面上,同時,網關具有外部Internet地址為10.25.0.7,綁定在eth1介面上,防火牆就位於網關上,通過它的設置,對流經防火牆的網路包進行過濾處理。同時,在區域網內部有一台WWW伺服器,他的內部地址為192.168.1.2,他被設置為可以接受外部的網路用戶訪問。

  首先清空所有的規則鏈,並設置規則鏈的默認策略為DROP,即丟棄所有的網路數據包。

  iptables -F

  iptables -P INPUT DROP

  iptables -P OUTPUT DROP

  iptables -P FORWARD DROP

  新增用戶者自定義規則鏈bad_tcp_packets、allowed和icmp_packets。

  iptables -N bad_tcp_packets

  iptables -N allowed

  iptables -N icmp_packets

  下面定義bad_tcp_packets規則鏈的規則:將要求重導向的網路連接記錄起來,然後將報文丟棄(防止本地機器被其他主機作為入侵跳板,侵入別的主機):

  iptables -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j LOG --log-level INFO --log-prefix "New not syn:"

  iptables -A bad_tcp_packets -p TCP ! --syn -m state --state NEW -j DROP

  下面定義allowed規則鏈的規則:允許要求連接的網路數據包或相應包進入,將其與網路數據包丟棄:

  iptables -A allowed -p TCP --syn -j ACCEPT

  iptables -A allwoed -p TCP -m state --state ESTABLLSHED,RELATED -J ACCEPT

  IPTABLES -A allowed -p TCP -j DROP

  下面定義icmp_packets規則鏈的規則:允許ping網路數據包進入,將其餘的網路數據包丟棄:

  iptables -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT

  iptables -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

  INPUT鏈,過濾要到達防火牆的網路數據包。

  進入防火牆主機的TCP網路數據包必須先進行bad_tcp_packets過濾:

  iptables -A INPUT -p TCP -j bad_tcp_packets

從WAN進入防火牆主機的ICMP網路數據包,必須先進行icmp_packets過濾,這是為了避免黑客傳送不完整的IP網路數據包,系統會相應ICMP網路數據包,以通知對方,導致主機位置被偵測出來:

  iptables -A INPUT -p ICMP -i eth1 -j icmp_packets

  從LAN進入防火牆主機的全部單播和廣播的網路數據包,均會放行:

  iptables -A INPUT -p ALL -i eth0 -d 192.168.1.1 -j ACCEPT

  iptables -A INPUT -p ALL -i eth0 -d 192.168.1.255 -j ACCEPT

  從LAN進入防火牆主機的DHCP網路數據包,予以放行,只有當防火牆擔任DHCP時才使用:

  iptables -A INPUT -p UDP -i eth0 --dport 67 --sport 68 -j ACCEPT

  從WAN進入防火牆主機的所有網路數據包,檢查是否為響應網路數據包,若是則予以放行:

  iptables -A INPUT -p ALL -d 10.25.0.7 -m state --state ESTABLISHED,RELATED -j ACCEPT

  限制過濾規則的檢測頻率為每分鐘平均流量三個網路數據包(超過)上限的網路數據包將暫停檢測,並將瞬間流量設定為一次最多處理三個網路數據包(超過上限的網路數據包將丟棄不予處理),這類網路數據包通常是黑客用來進行拒絕服務攻擊:

  iptables -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level INFO --log-prefix "IPT INPUT packet dIEd:"

  FORWAD鏈,過濾要通過防火牆的網路數據包

  通過防火牆的TCP網路數據包必須先進行bad_tcp_pcakets過濾:

  iptables -A FORWAD -P TCP -J bad_tcp_packets

  從LAN要到WAN的網路數據包均放行:

  iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

  從WAN到LAN的網路數據包僅放行應答網路數據包:

  iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT

  允許來自WAN的PING網路數據包,遞送到區域網內的WWW伺服器:

  iptables -A FORWARD -p ICMP -i eth1 -o eth0 -d 192.168.1.2 -j icmp_packets

  允許來自WAN的HTTP,HTTPS網路數據包,遞送到區域網的WEB伺服器:

  iptables -A FORWARD -p TCP -i eth1 -o eth0 -d 192.168.1.2 -m multiport --dport 80,443 -j allowed

  限制過濾規則的檢測頻率為每分鐘平均流量3各網路數據包(超過上限的網路數據包將暫停檢測),並將瞬間流量設定為一次最多處理3個數據包(超過上限的網路數據包將被丟棄不予處理),這類網路數據包通常是黑客用來進行拒絕服務攻擊:

  iptables -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT FORWARD packet dIEd:"

  OUTPUT鏈,過濾從防火牆送出的網路數據包。

  從防火牆送出的TCP網路數據包必須先進行bad_tcp_packets過濾:

  iptables -A OUTPUT -p TCP -j bad_tcp_packets

  對於過濾通過的TCP包和其他類型的包,均會放行:

  iptables -A OUTPUT -p ALL -s 127.0.0.1 -j ACCEPT

  iptables -A OUTPUT -p ALL -s 192.168.1.1 -j ACCEPT

  iptables -A OUTPUT -p ALL -s 10.25.0.7 -j ACCEPT

  限制過濾規則的檢測頻率為每分鐘平均流量3各網路數據包(超過上限的網路數據包將暫停檢測),並將瞬間流量設定為一次最多處理3個數據包(超過上限的網路數據包將被丟棄不予處理),這類網路數據包通常是黑客用來進行拒絕服務攻擊:

  iptables -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG --log-level DEBUG --log-prefix "IPT OUTPUT packet dIEd:"

  4.NAT配置

  1) 目的NAT(DNAT)

  DNAT在外部數據包進入防火牆后且路由之前進行,他把該數據包的目的地址改為內部區域網的地址,然後路由該數據包進入到區域網內部主機。

  舉例:

  iptables -t nat -A PREROUTING -t tcp -d 10.25.0.7 --dport 80 -i eth1 -j DNAT --to 192.168.1.2:80

  說明:可以路由到達防火牆的訪問80埠(即WWW伺服器)的數據包的目的地址改為192.168.1.2。

  2) 源NAT(SNAT)

  SNAT主要用來更改從防火牆發出的數據包的源地址,使得來自區域網的私有地址通過防火牆后,更改為防火牆具有的外部地址,以便數據接收方接收數據后,能夠找到正確的回復地址。

  舉例:

  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to10.25.0.7

  說明:更改所有來自192.168.1.0/24的數據包的源IP地址為10.25.0.7

  注意:系統在經過路由及過濾等處理后,直到數據包要送出時,才進行SNAT,有一種SANT的特殊情況是IP偽裝,通常建議在用撥號上網時使用,也就是在合法IP地址不固定的情況下使用。

  舉例:

  iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE

  說明:這樣可以保證區域網內部的用戶能夠所有通過撥號伺服器連接到INTERNET。






[火星人 via ] 用Linux的iptables做代理伺服器和防火牆配置已經有180次圍觀

http://www.coctec.com/docs/linux/show-post-65758.html