一個iptables的小案例。
寫一個腳本,并執行它。
在編輯之前可以先看iptables的規則,和之後會有對比
[root@litongyao ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
[root@litongyao ~]# vim /usr/local/sbin/iptables.sh
ipt="/usr/sbin/iptables" (定義一個全局變量)
$ipt -F (計數器清零)
$ipt -P INPUT DROP (把進來的資料包鍊DROP掉)
$ipt -P OUTPUT ACCEPT (本機的資料包可以出去)
$ipt -P FORWARD ACCEPT (目标不是本機位址的可以通行)
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT (指定狀态,RELATED和ESTABLISHED是要同時存在的,詳細見下)
$ipt -A INPUT -s 192.168.52.0/24 -p tcp --dport 22 -j ACCEPT (指定隻要源位址是這個網段的ip都可以遠端連接配接ssh)
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT (開放本機的80端口)HTTP服務
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT (開放本機21端口)FTP服務
[root@litongyao ~]# sh /usr/local/sbin/iptables.sh sh執行這個指令
再來看看iptables的規則:
[root@litongyao ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
64 4472 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 192.168.52.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
Chain OUTPUT (policy ACCEPT 37 packets, 3556 bytes)
可以看到我們寫的腳本都被加入了規則裡,這裡注意的是,沒有運作service iptables save,就不會儲存規則,重新開機即可恢複
實驗:關于icmp的小案例 (在開始這個小案例之前,需要把上一條規則恢複預設,既重新開機服務)
[root@litongyao ~]# service iptables restart
下面執行一條指令:
[root@litongyao ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
我們ping外網,發現沒有問題,可以ping通,用别的主機ping自己的時候,卻發現ping不通了

Iptables的四種狀态:
NEW
NEW說明這個包是我們看到的第一個包。意思就是,這是conntrack子產品看到的某個連接配接的第一個包,它即将被比對了。比如,我們看到一個SYN 包,是我們所留意的連接配接的第一個包,就要比對它。
ESTABLISHED
ESTABLISHED已經注意到兩個方向上的資料傳輸,而且會繼續比對這個連接配接的包。處于ESTABLISHED狀态的連接配接是非常容易了解的。隻要發送并接到應答,連接配接就是ESTABLISHED的了。一個連接配接要從NEW變為ESTABLISHED,隻需要接到應答包即可,不管這個包是發往防火牆的,還是要由防火牆轉發的。ICMP的錯誤和重定向等資訊包也被看作是ESTABLISHED,隻要它們是我們所發出的資訊的應答。
RELATED
RELATED是個比較麻煩的狀态。當一個連接配接和某個已處于ESTABLISHED狀态的連接配接有關系時,就被認為是RELATED的了。換句話說,一個連接配接要想是RELATED的,首先要有一個ESTABLISHED的連接配接。這個ESTABLISHED連接配接再産生一個主連接配接之外的連接配接,這個新的連接配接就是 RELATED的了,當然前提是conntrack子產品要能了解RELATED。ftp是個很好的例子,FTP-data 連接配接就是和FTP-control有關聯的,如果沒有在iptables的政策中配置RELATED狀态,FTP-data的連接配接是無法正确建立的,還有其他的例子,比如,通過IRC的DCC連接配接。有了這個狀态,ICMP應答、FTP傳輸、DCC等才能穿過防火牆正常工作。注意,大部分還有一些UDP協定都依賴這個機制。這些協定是很複雜的,它們把連接配接資訊放在資料包裡,并且要求這些資訊能被正确了解。
INVALID
INVALID說明資料包不能被識别屬于哪個連接配接或沒有任何狀态。有幾個原因可以産生這種情況,比如,記憶體溢出,收到不知屬于哪個連接配接的ICMP錯誤資訊。一般地,我們DROP這個狀态的任何東西,因為防火牆認為這是不安全的東西
nat表的兩個應用
1A機器有兩個網卡。一個外網網卡。一個内網網卡。B機器有一個網卡,隻有一個内網網卡。需求:B機器可以上網(路由器)
準備工作:
1.給litongyao虛拟機增加一塊内網網卡,并設定為LAN區段,(如果沒有LAN區段。則需要增加一個區段。)
2.給内網網卡設定一個IP和網段。
[root@litongyao ~]# ifconfig ens37 192.168.100.100/24
(這種方法設定的ip是臨時性的,重新開機後就會失效。可以複制ens33的配置檔案改名為ens37,并修改裡面的配置)
3.給xuniji的内網網卡設定一個ip。(因為沒有外網網卡。是以不能遠端登入連接配接)
[root@xuniji ~]# ifconfig ens33 192.168.100.50/24
4.檢查
用一台去Ping另外一台機器,如果Ping通,則準備工作完成
實驗:
打開A機器端口轉發,并更改防火牆設定
出于安全考慮,Linux系統預設是禁止資料包轉發的。所謂轉發即當主機擁有多于一塊的網卡時,其中一塊收到資料包,根據資料包的目的ip位址将包發往本機另一網卡,該網卡根據路由表繼續發送資料包。這通常就是路由器所要實作的功能。
[root@litongyao ~]# cat /proc/sys/net/ipv4/ip_forward (預設是0,則表示端口轉功能關閉)
[root@litongyao ~]# echo "1" > /proc/sys/net/ipv4/ip_forward (打開端口轉發功能,将0修改成1)
[root@litongyao ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@litongyao ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
2.設定B機器的網關
[root@litongyao ~]# route -n (檢視網關的指令)
[root@litongyao ~]# route add default gw 192.168.100.1 (增加一個192.168.100.1的網關)
2.C機器隻能和A機器通信,讓C機器可以連通B機器的22端口(端口映射)
工作:
A機器上打開端口轉發
[root@litongyao ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
2.A機器上更改防火牆配置 (最好恢複預設的配置,以免出現偏差)
[root@litongyao ~]# iptables -t nat -A PREROUTING -d 192.168.52.100 -p tcp --dport 1122 -j DNAT --to 192.168.100.50:22
[root@litongyao ~]# iptables -t nat -A POSTROUTING -s 192.168.100.50 -j SNAT --to 192.168.52.100
3.B機器上設定網關
實驗:用xshell試着連接配接192.168.52.100:1122,看是否能映射到B機器的192.168.100.50
本文轉自 小新銳 51CTO部落格,原文連結:http://blog.51cto.com/13407306/2046196,如需轉載請自行聯系原作者