歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> 關於Linux >> linux的防火牆功能IPtables詳解之二

linux的防火牆功能IPtables詳解之二

日期:2017/3/1 13:35:57   编辑:關於Linux
四、剖析一個完整的例子
我們假定接口ppp0通往Internet,接口eth0通往內部網絡。
ppp0的IP地址是128.138.101.4,eth0的IP地址是10.1.1.1,兩個接口的子網掩碼都是255.255.255.0。
這個例子使用無狀態包過濾機制來保護IP地址為10.1.1.2的Web服務器,這是保護Internet服務器的標准方法。
在這個例子的後面部分,我們將展示如何使用有狀態的過濾機制來保護桌面用戶。

在您使用iptables之前,必須啟用IP forwarding(IP轉發)功能,並且確保內核裡已經加載了各個iptables模塊。
要了解啟用IP forwarding功能的更多知識,參見28.4節或者12.11.8節。
帶有iptables的所有發行版本也都有能夠完成啟用和加載的啟動腳本。

1. 第一組規則是對filter表進行初始化。
首先,沖洗掉表中所有的鏈,
然後將INPUT和FORWARD鏈的默認目標設為DROP。
和其他任何網絡防火牆一樣,最安全的策略就是丟棄您沒有明確允許的任何包。
# iptables -F
# iptables -P INPUT DROP // 如果是用SSH連接進行設置,不要用這條命令,會導致SSH斷開;
# iptables -P FORWARD DROP

2. 規則是按照它們出現在鏈中的順序來進行匹配的,所以我們將用得最多的規則放在最前面 。
FORWARD鏈中的前3條規則讓去往10.1.1.2上網絡服務的連接通過防火牆。
確切地說,我們允許SSH(端口22)、HTTP(端口80)和HTTPS(端口443)能夠連到我們的Web服務器。
第一條規則允許來自可信網絡的所有連接通過防火牆。
# iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 22 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 80 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p tcp --dport 443 -j ACCEPT

3. 我們允許流到防火牆主機(10.1.1.1)的唯一TCP流量是SSH,它用於管理防火牆。
下面列出的第二條規則允許環回(loopback)流量,它留在防火牆主機的本地。
我們的系統管理員在他們不能ping到默認路由時會感到緊張,
所以這裡的第三條規則允許從內部IP地址來的ICMP ECHO_REQUEST包。
# iptables -A INPUT -i eth0 -d 10.1.1.1 -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -i lo -d 127.0.0.1 -p ANY -j ACCEPT
# iptables -A INPUT -i eth0 -d 10.1.1.1 -p icmp --icmp-type 8 -j ACCEPT

4. 為了能讓任何TCP/IP主機在Internet正常工作,必須允許某些類型的ICMP包通過防火牆。
下面的8條規則就是讓ICMP包既能送到防火牆主機,也能送到在它之後的網絡的最小集合。
# iptables -A INPUT -p icmp --icmp-type 0 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 3 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 5 -j ACCEPT
# iptables -A INPUT -p icmp --icmp-type 11 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 0 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 3 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 5 -j ACCEPT
# iptables -A FORWARD -d 10.1.1.2 -p icmp --icmp-type 11 -j ACCEPT

5. 接下來向NAT表的PREROUTING鏈加入規則。雖然NAT表的目的並不是做包過濾,
但是它的PREROUTING鏈對於反IP欺騙的過濾來說特別有用。
如果我們在PREROUTING鏈中加入DROP項,它們就不需要出現在INPUT和FORWARD鏈裡了,
因為PREROUTING鏈會應用到所有進入防火牆主機的包上。
將控制項放到一個地方比重復放置它們的做法條理性要好得多。
# iptables -t nat -A PREROUTING -i ppp0 -s 10.0.0.0/8 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 172.16.0.0/12 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 192.168.0.0/16 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 127.0.0.0/8 -j DROP
# iptables -t nat -A PREROUTING -i ppp0 -s 224.0.0.0/8 -j DROP

6. 最後,我們用一條禁止所有沒有得到明確許可的包的規則來結束INPUT和FORWARD鏈。
雖然我們在前面已經用iptables -P命令實施過這個做法,但是LOG目標(target)能讓我們看到誰正在從Internet上敲我們的大門。
# iptables -A INPUT -i ppp0 -j LOG
# iptables -A FORWARD -i ppp0 -j LOG

7. 我們還可以設置IP NAT來偽裝在內部網絡裡使用的私用地址空間。
參見12.12節了解更多有關NAT的知識。

8. Netfilter帶給Linux防火牆最強大的功能之一就是有狀態包過濾機制。
針對連到Internet的客戶機的防火牆不是允許特定的傳入服務,而是允許根據客戶機的請求而傳入的響應。
下面這條簡單的有狀態FORWARD鏈允許離開我們網絡的所有流量通過,但只允許和我們的主機發起的連接有關的入流量通過。
# iptables -A FORWARD -i eth0 -p ANY -j ACCEPT
# iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

要跟蹤復雜的網絡會話,比如FTP和IRC,必須加載某些內核模塊來啟動iptables。
如果沒有加載這些模塊,iptables就會簡單地禁止那些連接。雖然有狀態包過濾器能夠提高站點的安全性,
但是它們也增加了網絡的復雜性。所以在防火牆上實現它之前,要確信您的確需要有狀態功能。

五、調試iptables規則集
調試iptables規則集最好的辦法或許就是用命令:
iptables -L -v

這些選項會告訴您鏈裡面的每條規則匹配了多少個包。
我們經常在想了解有關匹配包的更多信息時,增加帶有LOG目標(target)的臨時iptables規則。
您可以經常通過使用像tcpdump這樣的包探測器解決更棘手的問題。

六、應用實例
1. 禁止端口的實例
1). 禁止ssh 端口
只允許在192.168.62.1上使用ssh 遠程登錄,從其它計算機上禁止使用ssh
# iptables -A INPUT -s 192.168.62.1 -p tcp --dport 22 -j ACCEPT
# iptables -A INPUT -p tcp --dport 22 -j DROP

2). 禁止代理端口
# iptables -A INPUT -p tcp --dport 3128 -j REJECT

3). 禁止icmp 端口
除192.168.62.1外,禁止其它人ping 我的主機
# iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type echo-request -j ACCEPT
# iptables -A INPUT -i eth0 -p icmp --icmp-type echo-request –j DROP

# iptables -A INPUT -i eth0 -s 192.168.62.1/32 -p icmp -m icmp --icmp-type 8 -j ACCEPT
# iptables -A INPUT -i eth0 -p icmp -m icmp --icmp-type 8 -j DROP
注:可以用iptables --protocol icmp --help 查看ICMP 類型

4). 禁止QQ 端口
# iptables -D FORWARD -p udp --dport 8000 -j REJECT

2. 強制訪問指定的站點
要使192.168.52.0/24網絡內的計算機(這此計算機的網關應設為192.168.52.10)強制訪問指定的站點,
在做為防火牆的計算機(192.168.52.10)上應添加以下規則:
1). 打開ip 包轉發功能
# echo 1 > /proc/sys/net/ipv4/ip_forward

2). 在NAT/防火牆計算機上的NAT 表中添加目的地址轉換規則:
# iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 80 -j DNAT --to-destination 202.96.134.130:80
# iptables -t nat -I PREROUTING -i eth0 -p udp --dport 80 -j DNAT --to-destination 202.96.134.130:80

3). 在NAT/防火牆計算機上的NAT 表中添加源地址轉換規則:
# iptables -t nat -I POSTROUTING -o eth1 -p tcp --dport 80 -s 192.168.52.0/24 -j SNAT --to-source 202.96.134.10:20000-30000
# iptables -t nat -I POSTROUTING -o eth1 -p udp --dport 80 -s 192.168.52.0/24 -j SNAT --to-source 202.96.134.10:20000-30000

4). 測試:在內部網的任一台計算機上打開浏覽器,輸入任一非本網絡的IP,都將指向IP 為202.96.134.130的網站.

3. 發布內部網絡服務器
圖4
\
要使因特網上的計算機訪問到內部網的FTP 服務器、WEB 服務器,在做為防火牆的計算機上應
添加以下規則:
1).
# echo 1 > /proc/sys/net/ipv4/ip_forward

2). 發布內部網web 服務器
# iptables -t nat -I PREROUTING -p tcp -i eth1 -s 202.96.134.0/24 --dport 80 -j DNAT --to-destination 192.168.52.15:80
# iptables -t nat -I POSTROUTING -p tcp -i eth0 -s 192.168.52.15 --sport 80 -j SNAT --to-source 202.96.134.10:20000-30000

3). 發布內部網ftp 服務器
# iptables -t nat -I PREROUTING -p tcp -i eth1 -s 202.96.134.0/24 --dport 21 -j DNAT --to-destination 192.168.52.14:21
# iptables -t nat -I POSTROUTING -p tcp -i eth0 -s 192.168.52.14 --sport 21 -j SNAT --to-source 202.96.134.10:40000-50000

4). 注意:內部網的計算機網關要設置為防火牆的ip(192.168.52.1)
5). 測試:
用一台IP 地址為202.96.134.0段的計算機虛擬因特網訪問,
當在其浏覽器中訪問http://202.96.134.10時, 實際應看到的是192.168.52.15的的web 服務;
當訪問ftp://202.96.134.10時,實際應看到的是192.168.52.14上的的ftp 服務

4. 智能DNS
圖5
\
1).
# echo 1 > /proc/sys/net/ipv4/ip_forward

2). 在NAT 服務器上添加以下規則:
在PREROUTING 鏈中添加目的地址轉換規則:
# iptables -t nat -I PREROUTING -i eth0 -p tcp --dpor 53 -j DNAT --to-destination 202.96.134.130
# iptables -t nat -I PREROUTING -i eth0 -p udp --dpor 53 -j DNAT --to-destination 202.96.134.130

在POSTROUTING 鏈中添加源地址轉換規則:
# iptables -t nat -I POSTROUTING -o eth1 -s 192.168.52.0/24 -p tcp --dpor 53 -j SNAT --to-source 202.96.134.10:40000-50000
# iptables -t nat -I POSTROUTING -o eth1 -s 192.168.52.0/24 -p udp --dpor 53 -j SNAT --to-source 202.96.134.10:40000-50000

3). 測試
在內部網任一台計算機上,將DNS 設置為任意的外網IP,就可以使用DNS
測試工具如nslookup來解析DNS 服務器202.96.134.130上的名稱.

5. 端口映射
見上節透明代理設置
# iptables -t nat -A PREROUTING -i eth0 -p tcp -s 192.168.62.0/24 --dport 80 -j REDIRECT --to-ports 3128

6. 典型NAT 上網
一般做為NAT 的計算機同時也是局域網的網關,
假定該機有兩塊網卡eth0、eth1,
eth0連接外網, IP 為202.96.134.134;
eth1連接局域網,IP 為192.168.62.10

1). 先在內核裡打開ip 轉發功能
# echo 1 > /proc/sys/net/ipv4/ip_forward

2). 使局域網用戶能訪問internet 所要做的nat
# iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT --to?202.96.134.134


如果上網的IP 是動態IP,則使用以下規則:
# iptables -t nat -A POSTROUTING -o eth0 -s 192.168.62.0/24 -j MASQUERADE

如果是通過ADSL 上網,且公網IP 是動態IP,則使用以下規則:
# iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.62.0/24 -j MASQUERADE

3). 使internet 用戶可以訪問局域網內web 主機所要做的nat
# iptables -t nat -A PREROUTING -p tcp -d 202.96.134.134 --dport 80 -j DNAT --to-destination 192.168.62.10
注:局域網內的客戶端需將默認網關、DNS 設為防火牆的IP

7. 在我們的網絡機房實現NAT 共享上網
工作環境:上層代理192.168.60.6(4480),只授予教師機(192.168.62.111)使用該代理的權限
目標:不使用squid 代理上網,而是使用NAT 的方式上網
方法:
1). 確保停止教師機(192.168.62.111)的squid 或其它代理服務
2). 客戶端網關、DNS 均指向192.168.62.111,浏覽器代理設置為192.168.60.6(4480)。
測試在當前情況下能否上網
3). 在教師機(192.168.62.111)上添加如下iptables 規則:
# iptables -t nat -A POSTROUTING -p tcp -d 192.168.60.6/32 --dport 4480 -j SNAT --to-source 192.168.62.111:10000-30000
解釋:對於目的地為192.168.60.6、目的端口為4480的TCP 包,
在經過防火牆路由後,將其源地址轉換為192.168.62.111,端口轉換為10000-30000間的某個端口。
4). 客戶端測試能否上網

8. 對流媒體服務器的服務做IP 限制
1). 清空規則並放開SSH
# iptables -F
# iptables -A INPUT -s 10.1.1.11 -p tcp --dport 22 -j ACCEPT

2). 對指定IP放開,可以推送流到這台服務器, 其余的IP都禁止
A. 只對單個IP放開
# iptables -A INPUT -s 10.2.1.54 -j ACCEPT
# iptables -A INPUT -s! 10.2.1.54 -j REJECT

# iptables -A INPUT -s 10.2.1.54 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT

B. 對多個IP放開,即將要放開的IP插入到最後一條拒絕的規則之前
# iptables -A INPUT -s 10.2.1.54 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT
# iptables -I INPUT 2 -s 10.2.1.13 -j ACCEPT

3). 對指定IP段 放開,可以推送流到這台服務器,其余的IP都禁止
A. 對單個IP段放開
# iptables -I INPUT 2 -s 10.2.1.0/24 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT

B. 對多個IP段放開
# iptables -I INPUT 2 -s 10.2.1.0/24 -j ACCEPT
# iptables -A INPUT -i eth0 -j REJECT
# iptables -I INPUT 2 -s 10.2.2.0/24 -j ACCEPT

其中:
10.2.1.0/24 表示: A類地址主機為8位,表示10.2.1固定,後面是可變
前面是IP地址10.2.1.0,是表示局域網地址。
後而的24是指掩碼,因為IP地址和掩碼用二進制表示的話都是32位的。
所以掩碼的24表示那掩碼前24位是1,後8位是0,轉換成10進制就是表示掩碼是255.255.255.0
即, 255.255.255.0=11111111.11111111.11111111.0=24個1
192.168.0.0/16 代表B類地址 主機為16,表示192.168固定,後面是可用.
?
4). 對指定IP拒絕,
A. 對單個IP拒絕
# iptables -A INPUT -s 10.2.1.11 -p tcp --dport 1935 -j REJECT
Copyright © Linux教程網 All Rights Reserved