如今防火牆主要分爲三種:包過濾,應用代理,狀態檢查前端
Iptables:支持包過濾和狀態檢查web
filter: 策略過濾 iptables 默認的表格 包含三個鏈 INPUT, OUTPUT, FORWARD 應該在此三道門中作過濾緩存
nat: 地址轉換啦 PREROUTING, POSTROUTING, OUTPUT服務器
mangle: 做用是改變服務類型而使用的表 PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING網絡
其中nat 和filter 是配置和使用iptables中最經常使用的兩個,務必要熟悉。負載均衡
iptables作的反向代理與squid區別在於,squid能更好的作好訪問的控制,而且能夠緩存提升訪問的速度,還能夠作負載均衡。
ssh
iptables 反向代理:tcp
現有三臺pc:A,B,Cide
A:192.168.2.166(網關設置爲192.168.2.105)web服務器網站
B:eth0:192.168.1.104(連接外網),eth1:192.168.2.105(內網)
C:192.168.1.164
目的:想讓客戶端C機經過代理機B訪問到A機上web內容
在代理機上作
打開代理機的路由轉發功能
作nat
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -d 192.168.1.104 -p tcp - -dport 80 -j SNAT --to-dest 192.168.2.166
這裏作DNAT目的是簡單,,
1.通用匹配:源地址目標地址的匹配
-s:指定做爲源地址匹配,這裏不能指定主機名稱,必須是IP
IP | IP/MASK | 0.0.0.0/0.0.0.0
並且地址能夠取反,加一個「!」表示除了哪一個IP以外
-d:表示匹配目標地址
-p:用於匹配協議的(這裏的協議一般有3種,TCP/UDP/ICMP)
-i eth0:從這塊網卡流入的數據
流入通常用在INPUT和PREROUTING上
-o eth0:從這塊網卡流出的數據
流出通常在OUTPUT和POSTROUTING上
-p icmp:icmp數據報文的擴展
--icmp-type:
echo-request(請求回顯),通常用8來表示
因此--icmp-type 8 匹配請求回顯數據包
echo-reply (響應的數據包)通常用0來表示
iptables -A OUTPUT -p icmp --icmp-type 8 -j ACCEPT (容許本身ping時的請求回顯包出去)
iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT(容許本身的響應包進來)
詳解-j ACTION
經常使用的ACTION:
DROP:悄悄丟棄
通常咱們多用DROP來隱藏咱們的身份,以及隱藏咱們的鏈表
REJECT:明示拒絕
ACCEPT:接受
custom_chain:轉向一個自定義的鏈
DNAT
SNAT
MASQUERADE:源地址假裝
REDIRECT:重定向:主要用於實現端口重定向
MARK:打防火牆標記的
RETURN:返回
在自定義鏈執行完畢後使用返回,來返回原規則鏈
IPtables中能夠靈活的作各類網絡地址轉換(NAT)
網絡地址轉換主要有兩種:SNAT和DNAT
SNAT是source network address translation的縮寫,即源地址目標轉換
好比,多個PC機使用ADSL路由器共享上網,每一個PC機都配置了內網IP
PC機訪問外部網絡的時候,路由器將數據包的報頭中的源地址替換成路由器的ip
當外部網絡的服務器好比網站web服務器接到訪問請求的時候
他的日誌記錄下來的是路由器的ip地址,而不是pc機的內網ip
這是由於,這個服務器收到的數據包的報頭裏邊的「源地址」,已經被替換了
因此叫作SNAT,基於源地址的地址轉換
DNAT是destination network address translation的縮寫
即目標網絡地址轉換
典型的應用是,有個web服務器放在內網配置內網ip,前端有個防火牆配置公網ip
互聯網上的訪問者使用公網ip來訪問這個網站
當訪問的時候,客戶端發出一個數據包
這個數據包的報頭裏邊,目標地址寫的是防火牆的公網ip
防火牆會把這個數據包的報頭改寫一次,將目標地址改寫成web服務器的內網ip
而後再把這個數據包發送到內網的web服務器上
這樣,數據包就穿透了防火牆,並從公網ip變成了一個對內網地址的訪問了
即DNAT,基於目標的網絡地址轉換
MASQUERADE,地址假裝,在iptables中有着和SNAT相近的效果,但也有一些區別
但使用SNAT的時候,出口ip的地址範圍能夠是一個,也能夠是多個,例如:
以下命令表示把全部10.8.0.0網段的數據包SNAT成192.168.5.3的ip而後發出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3
以下命令表示把全部10.8.0.0網段的數據包SNAT成192.168.5.3/192.168.5.4/192.168.5.5等幾個ip而後發出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j SNAT --to-source 192.168.5.3-192.168.5.5
這就是SNAT的使用方法,便可以NAT成一個地址,也能夠NAT成多個地址
可是,對於SNAT,不論是幾個地址,必須明確的指定要SNAT的ip
假如當前系統用的是ADSL動態撥號方式,那麼每次撥號,出口ip192.168.5.3都會改變
並且改變的幅度很大,不必定是192.168.5.3到192.168.5.5範圍內的地址
這個時候若是按照如今的方式來配置iptables就會出現問題了
由於每次撥號後,服務器地址都會變化,而iptables規則內的ip是不會隨着自動變化的
每次地址變化後都必須手工修改一次iptables,把規則裏邊的固定ip改爲新的ip
這樣是很是很差用的
MASQUERADE就是針對這種場景而設計的,他的做用是,從服務器的網卡上,自動獲取當前ip地址來作NAT
好比下邊的命令:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
如此配置的話,不用指定SNAT的目標ip了
無論如今eth0的出口得到了怎樣的動態ip,MASQUERADE會自動讀取eth0如今的ip地址而後作SNAT出去
這樣就實現了很好的動態SNAT地址轉換
案例:
A機ip 192.168.2.164(內網)B機有兩塊網卡(eth0:192.168.1.104連接外網,eth1:192.168.2.105連接內網,只設置了ip和子網掩碼)
在B機上作nat
作以前執行iptables -t nat -F
iptables -t nat -A POSTROUTING -o eth0 --source 192.168.2.0/24 -j MASQUERADE(表示動態的假裝)
若是不行再加上下面的
讓外網消息到達內網
iptables -A FORWARD --source 192.168.1.0/24 -j ACCEPT
容許內網的消息轉發出去
iptables -A FORWARD --source 192.168.2.0/24 -j ACCEPT
大多數的TCP服務是使用單個的鏈接,通常是客戶向服務器的一個周知端口發起鏈接,而後使用這個鏈接進行通信。可是,FTP協議卻有所不一樣,它使用雙向的多個鏈接,並且使用的端口很難預計。通常,FTP鏈接包括:
一個控制鏈接(control connection)
這個鏈接用於傳遞客戶端的命令和服務器端對命令的響應。它使用服務器的21端口,生存期是整個FTP會話時間
1、FTP服務簡介
FTP服務器有兩種工做模式:主動模式和被動模式。這兩種方式的特色以下:
(1)主動模式下:
tcp, 20(20號端口用於數據傳輸),21(21號端口用於控制鏈接)
(2)被動模式:
tcp,21(用於控制鏈接)>1023(端口號大於1023的隨機端口用於數據傳輸)
因此若是FTP工做在被動模式下,沒法指定數據傳輸的端口,因而引入了RELATED狀態。RELATED主要用於 追蹤與其相關的端口。注意:ftp工做在主動模式或者被動模式與客戶端的請求有關。
2、開放被動模式下的FTP服務。
具體步驟以下:
1、先開放ssh:
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -i lo -j ACCEPT(先開放本地鏈接)
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT(放行全部的ESTABLISHED鏈接)
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 22 -m state --state NEW -m connlimit ! --connlimit-above 3 -j ACCEPT (放行ssh鏈接,並將其最大鏈接數設爲3)
iptables -P INPUT DROP
iptables -P OUTPUT DROP (將默認策略設置爲禁止)
iptables -L -n -v (查看iptables詳細信息)
2、開放ftp服務:
注意要開放被動模式下的服務須要用到,ftp的追蹤模塊:
#cat /etc/sysconfig/iptables-config(查看iptables須要的模塊,主要是ip_nat_ftp模塊,屬於內核模塊)
#lsmod | grep ftp (查看是否加載ftp模塊)
#modprobe ip_nat_ftp(加載ftp模塊)
#lsmod | grep ftp (查看模塊是否被加載)
這樣RELATED就能夠被使用了:
iptables -A INPUT -d 172.16.100.1 -p tcp --dport 21 -m state --state NEW -j ACCEPT(容許21號端口進入,即:開放控制鏈接) iptables -A INPUT -m state --state RELATED -j ACCEPT iptables -A OUTPUT -m state --state RELATED -j ACCEPT