相信不少朋友和我同樣,是要建一個ip分享器(局域網用來共享上網)纔來學習iptables的,因此個人思路是首先可以使內網機器訪問外部網絡,而後再考慮複雜的安全設置,這樣你們作起來少一些挫敗感,並且更加有動力.
硬件準備:局域網中的一臺電腦,配備兩個網卡,具有使用外網的條件,能夠是ADSL, 或者乙太網,ip能夠是dhcp或者固定ip.以咱們實驗室爲例,外網固定ip。
首先設置服務器(ip分享器)的地址和路由,不會作上述設置的朋友能夠去網上查一下.好比鳥哥的私房菜。其實只要設置/etc/network/interfaces文件就好了,而後使用 /etc/init.d/networking restart 重啓網絡。也不要忘記在/etc/resolv.conf中添加或修改nameserver字段。接下來就是iptables的設置,首先就是使主機有ip假裝的功能,其次就是防火牆的功能。
咱們看圖,和網內機器上網有關的鏈是filter表的forward鏈,以及nat表的POSTROUTING鏈.因此iptables能夠設置以下
iptables -A FORWARD -j ACCEPT
iptables -t nat -A POSTROUTING -o eth0(外網網卡) -j SNAT --to ip
這樣你就可讓內網的機器上網了.
如下是詳細的講解,如何達到防火牆的功能.
一.概述
二.語法
三.實戰
一.概述
防火牆的典型設置是有兩個網卡,一個流入,一個流出,iptables讀取流入和流出的的數據報的頭,而後將他們與規劃集(ruleset)相比較,而後將可接受的數據包從一個網卡轉發至另外一個網卡,對於被拒絕的數據包,能夠被丟棄或者按照你所定義的方式進行處理.
二.語法
1.鏈和表 以及規則
A.表:
filter:iptables默認的表,主要用於包過濾.
nat:nat表的主要用處是網絡地址轉換,即Network Address Translation,縮寫爲NAT。作過NAT操做的數據包的地址就被改變了,固然這種改變是根據咱們的規則進行的。屬於一個流的包只會通過這個表一次。
manage:主要用於對指定的包進行修改,由於某些特應用可能須要去改寫數據包的一些傳輸特性,如更改數據包的TTL和TOS等, 不過在實際應用中訪表的使用率不高.
B.規則(rules)
rules:就是網絡管理員預約的條件,這些規則分別指定了源地址,目的地址,傳輸協議(tcp,udp,icmp),和服務類開型(HTTP,FTP,SMTP)定義一些動做:acccept,reject,drop.
C.鏈
INPUT:位於filter表,匹配目的IP是本機的數據包.
FORWARD:位於filter表,匹配穿過本機的數據包.
PREROUTING:位於nat表,用於修改目的地址DNAT
POSTROUTING:位於nat表,用於修改源地址SNAT
D.語法概述
iptables -t [要操做的表]
[操做命令]
[規則號碼]
[匹配條件]
[-j 匹配到之後的動做]
E.命令概述
a.操做命令.(-A -I -F -D -R -P)
b.查看命令.(-[vnx]L)
a-1. -A(鏈名)
APPEND,追加1條規則,(放到最後)例如:
iptables -t filter -A INPUT -j DROP
在filter 表的INPUT 鏈裏追加一條規則(做爲最後一條規則)匹配全部訪問本機IP 的數據包,匹配到的丟棄.
a-2.-I
-I 鏈名 [規則號碼]
INSERT,插入一條規則.例如:
iptables -I INPUT -j DROP 在filter 表的INPUT 鏈裏插入一條規則(插入成第1 條)
iptables -I INPUT 3 -j DROP 在filter 表的INPUT 鏈裏插入一條規則(插入成第3 條)
注意: 一、-t filter 可不寫,不寫則自動默認是filter 表
二、-I 鏈名[規則號碼],若是不寫規則號碼,則默認是1
三、確保規則號碼≤ (已有規則數+ 1),不然報錯.
a-3. -D
-D鏈名(規則號碼|具體規則內容)
DELETE,刪除一條規則.例如:
iptables -D INPUT 3(按號碼匹配) 刪除filter 表INPUT 鏈中的第三條規則(無論它的內容是什麼)
iptables -D INPUT -s 192.168.0.1 -j DROP(按內容匹配)刪除filter 表INPUT 鏈中內容爲「-s 192.168.0.1 -j DROP」的規則
注意:
一、若規則列表中有多條相同的規則時,按內容匹配只刪除序號最小的一條
二、按號碼匹配刪除時,確保規則號碼≤ 已有規則數,不然報錯
三、按內容匹配刪除時,確保規則存在,不然報錯
a-4. -R
-R <鏈名> <規則號碼> <具體規則內容>
REPLACE,替換一條規則 例如:
iptables -R INPUT 3 -j ACCEPT 將原來編號爲3 的規則內容替換爲「-j ACCEPT"
注意:
確保規則號碼≤ 已有規則數,不然報錯
a-5. -P
-P <鏈名> <動做>
POLICY,設置某個鏈的默認規則 例如:
iptables -P INPUT DROP 設置filter 表INPUT 鏈的默認規則是DROP.
注意:
當數據包沒有被規則列表裏的任何規則匹配到時,按此默認規則處理。動做前面不能加–j,這也是惟一一種匹配動做前面不加–j 的狀況。
a-6. -F
-F [鏈名]
FLUSH,清空規則 例如:
iptables -F INPUT 清空filter 表INPUT 鏈中的全部規則.
iptables -t nat -F PREROUTING 清空nat 表PREROUTING 鏈中的全部規則.
注意:
一、-F 僅僅是清空鏈中規則,並不影響-P 設置的默認規則
二、-P 設置了DROP 後,使用-F 必定要當心!!!
三、若是不寫鏈名,默認清空某表裏全部鏈裏的全部規則.
b-1.-L
-L [鏈名 LIST,列出規則
v:顯示詳細信息,包括每條規則的匹配包數量和匹配字節數
x:在v 的基礎上,禁止自動單位換算(K、M)
n:只顯示IP 地址和端口號碼,不顯示域名和服務名稱
例如:
iptables -L
粗略列出filter 表全部鏈及全部規則
iptables -t nat -vnL
用詳細方式列出nat 表全部鏈的全部規則,只顯示IP 地址和端口號
iptables -t nat -vxnL PREROUTING
用詳細方式列出nat 表PREROUTING 鏈的全部規則以及詳細數字,不反解
b-2.匹配條件
£流入、流出接口(-i、-o)
£來源、目的地址(-s、-d)
£協議類型(-p)
£來源、目的端口(--sport、--dport)
b-3.按網絡接口匹配
-i <匹配數據進入的網絡接口>
例如:
-i eth0
匹配是否從網絡接口eth0 進來
-i ppp0
匹配是否從網絡接口ppp0 進來
-o 匹配數據流出的網絡接口
例如:
-o eth0
-o ppp0
b-4.按來源目的地址匹配
-s <匹配來源地址>
能夠是IP、NET、DOMAIN,也可空(任何地址)
例如:
-s 192.168.0.1 匹配來自192.168.0.1 的數據包
-s 192.168.1.0/24 匹配來自192.168.1.0/24 網絡的數據包
-s 192.168.0.0/16 匹配來自192.168.0.0/16 網絡的數據包
-d <匹配目的地址>
能夠是IP、NET、DOMAIN,也能夠空
例如:
-d 202.106.0.20 匹配去往202.106.0.20 的數據包
-d 202.106.0.0/16 匹配去往202.106.0.0/16 網絡的數據包
-d
www.aaa.com 匹配去往域名
www.aaa.com 的數據包.
b-5.按協議類型匹配
-p <匹配協議類型>
能夠是TCP、UDP、ICMP 等,也可爲空
例如:
-p tcp
-p udp
-p icmp --icmp-type 類型
ping: type 8 pong: type 0
b-6.按來源目的端口匹配
--sport <匹配源端口>
能夠是個別端口,能夠是端口範圍
例如:
--sport 1000 匹配源端口是1000 的數據包
--sport 1000:3000 匹配源端口是1000-3000 的數據包(含1000、3000)
--sport :3000 匹配源端口是3000 如下的數據包(含3000)
--sport 1000: 匹配源端口是1000 以上的數據包(含1000)
--dport <匹配目的端口>
能夠是個別端口,能夠是端口範圍
例如:
--dport 80 匹配目的端口是80 的數據包
--dport 6000:8000 匹配目的端口是6000-8000 的數據包(含6000、8000)
--dport :3000 匹配目的端口是3000 如下的數據包(含3000)
--dport 1000: 匹配目的端口是1000 以上的數據包(含1000)
注意:--sport 和--dport 必須配合-p 參數使用.
b-7.匹配應用舉例.
一、端口匹配
-p udp --dport 53
匹配網絡中目的端口是53 的UDP 協議數據包
二、地址匹配
-s 10.1.0.0/24 -d 172.17.0.0/16
匹配來自10.1.0.0/24 去往172.17.0.0/16 的全部數據包
三、端口和地址聯合匹配
-s 192.168.0.1 -d
www.abc.com -p tcp --dport 80
匹配來自192.168.0.1,去往
www.abc.com 的80 端口的TCP 協議數據包
注意:
一、--sport、--dport 必須聯合-p 使用,必須指明協議類型是什麼
二、條件寫的越多,匹配越細緻,匹配範圍越小.
b-8.動做(處理方式)
£ ACCEPT
£ DROP
£ SNAT
£ DNAT
£ MASQUERADE
b-9.
-j ACCEPT
經過,容許數據包經過本鏈而不攔截它
相似Cisco 中ACL 裏面的permit
例如:
iptables -A INPUT -j ACCEPT
容許全部訪問本機IP 的數據包經過
-j DROP
丟棄,阻止數據包經過本鏈而丟棄它
相似Cisco 中ACL 裏的deny
例如:
iptables -A FORWARD -s 192.168.80.39 -j DROP
阻止來源地址爲192.168.80.39 的數據包經過本機
-j DNAT --to IP[-IP][:端口-端口](nat 表的PREROUTING 鏈)
目的地址轉換,DNAT 支持轉換爲單IP,也支持轉換到IP 地址池
(一組連續的IP 地址)
例如:
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \
-j DNAT --to 192.168.0.1
把從ppp0 進來的要訪問TCP/80 的數據包目的地址改成192.168.0.1
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 81 \
-j DNAT --to 192.168.0.2:80
iptables -t nat -A PREROUTING -i ppp0 -p tcp --dport 80 \
-j DNAT --to 192.168.0.1-192.168.0.10
-j SNAT --to IP[-IP][:端口-端口](nat 表的POSTROUTING 鏈)
源地址轉換,SNAT 支持轉換爲單IP,也支持轉換到IP 地址池
(一組連續的IP 地址)
例如:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
-j SNAT --to 1.1.1.1
將內網192.168.0.0/24 的原地址修改成1.1.1.1,用於NAT
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 \
-j SNAT --to 1.1.1.1-1.1.1.10
同上,只不過修改爲一個地址池裏的IP.
-j MASQUERADE
動態源地址轉換(動態IP 的狀況下使用)
例如:
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j MASQUERADE
將源地址是192.168.0.0/24 的數據包進行地址假裝.
3、實戰
實戰1:
網絡環境
nat服務器
外部ip:210.83.2.206
內部ip:192.168.1.1
ftp服務器 ip 192.168.1.3
web服務器 ip 192.168.1.4
具體步驟
1. 首先肯定 iptables 是否正常運行 。
# setup
選擇 System services --> 給 iptables 前點上 「 *
」號,
讓其隨系統一塊兒啓動;
若是在 ipchains 前有"*"號,務必去掉。
2. 而後編寫腳本內容以下:
#!/bin/bash
echo "1" > /etc/proc/sys/net/ipv4/ip_forward
#打開IP轉發功能
modprobe ip_nat_ftp
# 加載對ftp協議支持的模塊
modprobe ip_conntrack
modprobe ip_conntrack_ftp
# ftp自動追蹤模塊,提供對某些網絡遊戲在線升級的支持。
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j SNAT --to 210.83.2.206
#(假裝局域網機器的ip進入互聯網)
iptables -t nat -A PREROUTING -d 210.83.2.206 -p tcp --dport 21 -j DNAT --to 192.168.1.3
#把目的ip 210.83.2.206端口爲21(ftp服務 ) 映射到 內網 192.168.1.3 的機器上。
iptables -t nat -A PREROUTING -d 210.83.2.206 -p tcp --dport 80 -j DNAT --to 192.168.1.4
#把目的ip 210.83.2.206端口爲80(web服務) 映射到內網 192.168.1.4 的機器上.
保存爲natstart
#chmod +x natstart (加上運行的屬性)
3. 編輯/etc/rc.d/rc.local文件,在其末尾加上一句運行剛纔編輯好腳本的語句(假如natstart腳本的路徑爲/etc/natstart)
/etc/natstart
這就能夠了,一切搞定。不過這樣能夠說談不上什麼安全性。
實戰2:
操做系統,REDHAT LINUX 9.0,安裝操做系統的機器有兩張網卡,eth1和eth0 eth1:10.1.0.3 (外網卡) eth0: 192.168.0.1 (內網卡) 在/etc/rc.d裏面touch一個firewall 而後改成可執行 chmod u+x firewall 最後在/etc/rc.d/rc.local加入 vi /etc/rc.d/rc.local /etc/rc.d/firewall 而後寫入策略 [root@proxy rc.d]# vi firewall #!/bin/sh echo "1">/proc/sys/net/ipv4/ip_forward /sbin/modprobe ip_tables /sbin/modprobe ip_nat_ftp /sbin/modprobe ip_conntrack_ftp /sbin/modprobe iptable_nat /sbin/iptables -F /sbin/iptables -F -t nat /sbin/iptables -P INPUT DROP /sbin/iptables -P OUTPUT DROP /sbin/iptables -P FORWARD ACCEPT /sbin/iptables -A FORWARD -s 0/0 -d 0/0 -j ACCEPT /sbin/iptables -t nat -A POSTROUTING -s 0/0 -d 0/0 -o eth1 -j MASQUERADE /sbin/iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -d 10.1.0.3 -o eth1 -j SNAT --to 10.1.0.3 /sbin/iptables -A INPUT -p tcp --dport 20 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 53 -j ACCEPT /sbin/iptables -A INPUT -p udp --dport 53 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 23 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 25 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT 這是最簡單和實用的方法,有防火牆策略,內部局域網的用戶能夠正常的瀏覽網頁,收發郵件,FTP等等,有須要的朋友能夠本身增長和修改. PS:若是隻想開啓LINUX的NAT功能,只須要把 /sbin/iptables -P INPUT DROP ------>改爲 /sbin/iptables -P INPUT ACCEPT /sbin/iptables -P OUTPUT DROP ------>改爲 /sbin/iptables -P OUTPUT ACCEPT 而後刪除掉後面的 /sbin/iptables -A INPUT -p tcp --dport 20 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 21 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 80 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 53 -j ACCEPT /sbin/iptables -A INPUT -p udp --dport 53 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 23 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 110 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 25 -j ACCEPT /sbin/iptables -A INPUT -p tcp --dport 443 -j ACCEPT 就能夠了.