1. 程式人生 > >10.15 iptables filter表案例 iptable nat應用

10.15 iptables filter表案例 iptable nat應用

應用 無法 通過 簡單 font rda udp accep 失效

這個和-t filter 打印的信息是一樣的。

關於清除規則的命令中,

[root@aminglinux-123 ~]#  iptables -F
[root@aminglinux-123 ~]# iptables -Z

不加-t默認是針對表filter來操作的,-F 表示把所有規則全部刪除;-Z表示把包以及流量計數器置零。

B. 增加/刪除一條規則

[root@aminglinux-123 ~]# iptables -A INPUT -s 10.72.11.12 -p tcp --sport 1234 -d 10.72.137.159 --dport 80 -j DROP

這就是增加了一條規則,省略-t所以針對的是filter表。-A 表示增加一條規則,另外還有-I 表示插入一條規則,-D刪除一條規則;後面的INPUT即鏈名稱,還可以是OUTPUT或者FORWORD;-s 後跟源地址;-p 協議(tcp, udp, icmp);

--sport/--dport 後跟源端口/目標端口;-d 後跟目的IP(主要針對內網或者外網);-j 後跟動作(DROP即把包丟掉,REJECT即包拒絕;ACCEPT即允許包)。這樣講可能很亂。

[root@localhost ~]# iptables -I INPUT -s 1.1.1.1 -j DROP

上例表示:插入一條規則,把來自1.1.1.1的所有數據包丟掉。

[root@localhost ~]# iptables -D INPUT -s 1.1.1.1 -j DROP

上例表示把來自2.2.2.2 並且是tcp協議到本機的80端口的數據包丟掉。這裏要說的是,--dport/--sport 必須要和-p選項一起使用,否則會出錯。

[root@localhost ~]# iptables -I OUTPUT -p tcp --dport 22 -d 10.0.2.34 -j DROP

這條規則表示,把發送到10.0.2.34的22端口的數據包丟掉。

至於FORWORD鏈的應用阿銘幾乎沒有用到過,所以不再舉例。再總結一下各個選項的作用:

-A/-D :增加刪除一條規則;

-I :插入一條規則,其實跟-A的效果一樣;

-p :指定協議,可以是tcp,udp或者icmp;

--dport :跟-p一起使用,指定目標端口;

--sport :跟-p一起使用,指定源端口;

-s :指定源IP(可以是一個ip段);

-d :指定目的IP(可以是一個ip段);

-j :後跟動作,其中ACCEPT表示允許包,DROP表示丟掉包,REJECT表示拒絕包;

-i :指定網卡(不常用,但有時候能用到);

[root@localhost ~]# iptables -A INPUT -s 192.168.1.0/24 -i eth0 -j ACCEPT
[root@localhost ~]# iptables -nvL |grep '192.168.1.0/24'
    0     0 ACCEPT     all  --  eth0   *       192.168.1.0/24       0.0.0.0/0

刪除某一條規則使用如下命令:

[root@localhost ~]# iptables -D INPUT 1

-D 後跟鏈名,然後是規則num,這個num就是查看iptables規則時第一列的值。再次查看剛才的規則,已經沒有了:

[root@localhost ~]# iptables -nvL --line-numbers

iptables還有一個選項經常用到,-P(大寫)選項,表示預設策略。用法如下:

[root@localhost ~]# iptables -P INPUT DROP
-P後面跟鏈名,策略內容或者為DROP或者為ACCEPT,默認是ACCEPT。註意:如果你在連接遠程服務器,千萬不要隨便敲這個命令,因為一旦你敲完回車你就會斷掉。
這個策略一旦設定後,只能使用 iptables -P INPUT ACCEPT 才能恢復成原始狀態,而不能使用-F參數。下面阿銘針對一個小需求講述一下這個iptables規則如何設定。
需求:只針對filter表,預設策略INPUT鏈DROP,其他兩個鏈ACCEPT,然後針對192.168.137.0/24開通22端口,對所有網段開放80端口,對所有網段開放21端口。這個需求不算復雜,但是因為有多條規則,所以最好寫成腳本的形式。腳本內容如下:
[root@localhost ~]# cat /usr/local/sbin/iptables.sh
#! /bin/bash

ipt="/sbin/iptables"
$ipt -F
$ipt -P INPUT DROP
$ipt -P OUTPUT ACCEPT
$ipt -P FORWARD ACCEPT
$ipt -A INPUT -s 192.168.137.0/24 -p tcp --dport 22 -j ACCEPT
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT

完成腳本的編寫後,直接運行 /bin/sh /usr/local/sbin/iptables.sh 即可。如果想開機啟動時初始化防火墻規則,則需要在 /etc/rc.d/rc.local 中添加一行 “/bin/sh /usr/local/sbin/iptables.sh”

[root@localhost ~]# sh /usr/local/sbin/iptables.sh
[root@localhost ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination
   20  1580 ACCEPT     tcp  --  *      *       192.168.137.0/24     0.0.0.0/0           tcp dpt:22
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
    0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:21

運行腳本後,查看規則就是這樣的,可以看到阿銘的第一條規則中已經有20個包(第一列)被放行過了。

關於icmp的包有一個比較常見的應用:

[root@localhost ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP

--icmp-type 這個選項是要跟-p icmp 一起使用的,後面指定類型編號。這個8指的是能在本機ping通其他機器,而其他機器不能ping通本機。這個有必要記一下。


C. nat表的應用

其實,linux的iptables功能是十分強大的,阿銘曾經的一個老師這樣形容linux的網絡功能:只有想不到沒有做不到!也就是說只要你能夠想到的關於網絡的應用,linux都能幫你實現。在日常生活中相信你接觸過路由器吧,它的功能就是分享上網。本來一根網線過來(其實只有一個公網IP),通過路由器後,路由器分配了一個網段(私網IP),這樣連接路由器的多臺pc都能連接intnet而遠端的設備認為你的IP就是那個連接路由器的公網IP。這個路由器的功能其實就是由linux的iptables實現的,而iptables又是通過nat表作用而實現的這個功能。

在這裏舉一個例子來說明iptables如何實現的這個功能。假設你的機器上有兩塊網卡eth0和eth1,其中eth0的IP為10.0.2.68 ,eth1的IP為192.168.1.1 。eth0連接了intnet 但eth1沒有連接,現在有另一臺機器(192.168.1.2)和eth1是互通的,那麽如何設置也能夠讓連接eth1的這臺機器能夠連接intnet(即能和10.0.2.68互通)?

[root@localhost ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@localhost ~]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

就是這樣簡單的兩條命令就能實現上面的需求。第一個命令涉及到了內核參數相關的配置文件,它的目的是為了打開路由轉發功能,否則無法實現我們的應用。第二個命令則是iptables對nat表做了一個IP轉發的操作,-o 選項後跟設備名,表示出口的網卡,MASQUERADE表示偽裝的意思。

保存以及備份iptalbes規則

剛才在上面的內容中阿銘也提到了,咱們設定的防火墻規則只是保存在內存中,並沒有保存到某一個文件中,也就說當系統重啟後以前設定的規則就沒有了,所以設定好規則後要先保存一下。

[root@localhost ~]# service iptables save
iptables:將防火墻規則保存到 /etc/sysconfig/iptables:     [確定]

它會提示防火墻規則保存在了/etc/sysconfig/iptables文件內,這個文件就是iptables的配置文件了。所以日後,如果你遇到備份防火墻規則的任務,其實就是要拷貝一份這個文件的副本。

有時,我們會需要把防火墻所有規則都清除,使用 iptables -F 命令雖然可以,但是最好的辦法是把防火墻服務停止:

[root@localhost ~]# service iptables stop
iptables:清除防火墻規則:                                 [確定]
iptables:將鏈設置為政策 ACCEPT:nat filter                [確定]
iptables:正在卸載模塊:                                   [確定]

這樣防火墻就失效了,但是一旦重新設定規則後(哪怕只有一條),防火墻服務會自動開啟。下面阿銘介紹給你一個用來備份防火墻規則的命令:

[root@localhost ~]# sh /usr/local/sbin/iptables.sh
[root@localhost ~]# iptables-save > myipt.rule
[root@localhost ~]# cat myipt.rule
# Generated by iptables-save v1.4.7 on Sat Jun  1 18:14:03 2013
*filter
:INPUT DROP [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [50:4528]
-A INPUT -s 192.168.137.0/24 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 21 -j ACCEPT
COMMIT
# Completed on Sat Jun  1 18:14:03 2013

先執行一下剛才我們寫的iptables腳本,使用 iptables-save 命令重定向到一個文件裏。要想恢復這些規則使用下面的命令即可:

[root@localhost ~]# iptables-restore < myipt.rule


10.15 iptables filter表案例 iptable nat應用