linux服務器配置實例<7>---配置NAT服務器

配置NAT服務器

本章主要介紹如何使用 iptbales 實現 linux2.4 下的強大的 NAT 功能。
1、原理   
netfilter Linux 核心中一個通用架構,它提供了一系列的 " "(tables) ,每一個表由若干 " "(chains) 組成,而每條鏈中能夠有一條或數條規則 (rule) 組成。而且系統缺省的表是 "filter" 。可是在使用 NAT 的時候,咱們所使用的表是 "nat" 表,因此咱們必須使用 "-t nat" 選項來顯式地指明這一點。
filter 表同樣, nat 表也有三條缺省的 " "(chains) ,這三條鏈也是規則的容器,它們分別是:
PREROUTING :能夠在這裏定義進行目的 NAT 的規則,由於路由器進行路由時只檢查數據包的目的 ip 地址,因此爲了使數據包得以正確路由,咱們必須在路由以前就進行目的 NAT;
POSTROUTING :能夠在這裏定義進行源 NAT 的規則,系統在決定了數據包的路由之後在執行該鏈中的規則。
OUTPUT :定義對本地產生的數據包的目的 NAT 規則。
2、操做語法
使用 iptables NAT 功能時,咱們必須在每一條規則中使用 "-t nat" 顯示的指明使用 nat 表。而後使用如下的選項 :
1. 對規則的操做
    加入 (append) 一個新規則到一個鏈 (-A) 的最後。
    在鏈內某個位置插入 (insert) 一個新規則 (-I) ,一般是插在最前面。
    在鏈內某個位置替換 (replace) 一條規則 (-R)
    在鏈內某個位置刪除 (delete) 一條規則 (-D)
    刪除 (delete) 鏈內第一條規則 (-D)
2. 指定源地址和目的地址
經過 --source/--src/-s 來指定源地址,經過 --destination/--dst/-s 來指定目的地址。可使用如下四中方法來指定 ip 地址:
a. 使用完整的域名,如 「[url]www.linuxaid.com.cn[/url]」
b. 使用 ip 地址,如 「192.168. 1.1」
c. x.x.x.x/x.x.x.x 指定一個網絡地址,如 「192.168.1.0/255.255. 255.0」 ;
d. x.x.x.x/x 指定一個網絡地址,如 「192.168.1.0/ 24」 這裏的 24 代表了子網掩碼的有效位數,這是 UNIX 環境中一般使用的表示方法。
缺省的子網掩碼數是 32 ,也就是說指定 192.168.1.1 等效於 192.168.1.1/32
3. 指定網絡接口
可使用 --in-interface/-i --out-interface/-o 來指定網絡接口。從 NAT 的原理能夠看出,對於 PREROUTING 鏈,咱們只能用 -i 指定進來的網絡接口;而對於 POSTROUTING OUTPUT 咱們只能用 -o 指定出去的網絡接口。
4. 指定協議及端口
能夠經過 --protocol/-p 選項來指定協議,若是是 udp tcp 協議,還可 --source-port/--sport --destination-port/--dport 來指明端口4、準備工做
1. 編譯內核,編譯時選中如下選項,具體可參看 iptales 實現包過慮型防火牆 一文:
Full NAT
MASQUERADE target support
REDIRECT target support
2. 要使用 NAT 表時,必須首先載入相關模塊:   
modprobe ip_tables
modprobe ip_nat_ftp
iptable_nat 模塊會在運行時自動載入。
5、案例
1. NAT(SNAT)
好比,更改全部來自 192.168.1.0/24 的數據包的源 ip 地址爲 1.2.3 .4
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 1.2.3 .4
系統在路由及過慮等處理直到數據包要被送出時才進行 SNAT
有一種 SNAT 的特殊狀況是 ip 欺騙,也就是所謂的 Masquerading ,一般建議在使用撥號上網的時候使用,或者說在合法 ip 地址不固定的狀況下使用。好比 # iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
2. 目的 NAT(DNAT)   
好比,更改全部來自 192.168.1.0/24 的數據包的目的 ip 地址爲 1.2.3 .4
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -i eth1 -j DNAT --to 1.2.3 .4
系統是先進行 DNAT ,而後才進行路由及過慮等操做。
有一種 DNAT 的特殊狀況是重定向,也就是所謂的 Redirection ,這時候就至關於將符合條件的數據包的目的 ip 地址改成數據包進入系統時的網絡接口的 ip 地址。一般是在與 squid 配置造成透明代理時使用,假設 squid 的監聽端口是 3128 ,咱們能夠經過如下語句來未來自 192.168.1.0/24 ,目的端口爲 80 的數據包重定向到 squid 監聽
端口:   
iptables -t nat -A PREROUTING -i eth1 -p tcp -s 192.168.1.0/24 --dport 80
-j REDIRECT --to-port 3128
6、綜合例子
1. 使用撥號帶動局域網上網       
小型企業、網吧等多使用撥號網絡上網,一般可能使用代理,可是考慮到成本、對協議的支持等因素,建議使用 ip 欺騙方式帶動區域網上網。
成功升級內核後安裝 iptables ,而後執行如下腳本:       
# 載入相關模塊
modprobe ip_tables
modprobe ip_nat_ftp
# 進行 ip 假裝
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
 2. ip 映射
  假設有一家 ISP 提供園區 Internet 接入服務,爲了方便管理,該 ISP 分配給園區用戶的 IP 地址都是僞 IP ,可是部分用戶要求創建本身的 WWW 服務器對外發布信息。咱們能夠在防火牆的外部網卡上綁定多個合法 IP 地址,而後經過 ip 映射使發給其中某一個 IP 地址的包轉發至內部某一用戶的 WWW 服務器上,而後再將該內部 WWW 服務器響應包假裝成該合法 IP 發出的包。
咱們假設如下情景:
ISP 分配給 A 單位 www 服務器的 ip 爲:
ip 192.168.1.100  真實 ip 202.110.123.100
ISP 分配給 B 單位 www 服務器的 ip 爲:
ip 192.168.1.200  真實 ip 202.110.123.200
linux 防火牆的 ip 地址分別爲:
內網接口 eth1 192.168.1.1
外網接口 eth0 202.110.123.1   
而後咱們將分配給 A B 單位的真實 ip 綁定到防火牆的外網接口,以 root 權限執行如下命令:    
ifconfig eth0 add 202.110.123.100 netmask 255.255.255.0
ifconfig eth0 add 202.110.123.200 netmask 255.255.255.0
成功升級內核後安裝 iptables ,而後執行如下腳本:       
# 載入相關模塊
modprobe ip_tables
modprobe ip_nat_ftp  
首先,對防火牆接收到的目的 ip 202.110.123.100 202.110.123.200 的全部數據包進行目的 NAT(DNAT):
iptables -A PREROUTING -i eth0 -d 202.110.123.100 -j DNAT --to 192.168.1.100
iptables -A PREROUTING -i eth0 -d 202.110.123.200 -j DNAT --to 192.168.1.200
其次,對防火牆接收到的源 ip 地址爲 192.168.1.100 192.168.1.200 的數據包進行源 NAT(SNAT):
iptables -A POSTROUTING -o eth0 -s 192.168.1.100 -j SNAT --to 202.110.123.100
iptables -A POSTROUTING -o eth0 -s 192.168.1.200 -j SNAT --to 202.110.123.200
這樣,全部目的 ip 202.110.123.100 202.110.123.200 的數據包都將分別被轉發給 192.168.1.100 192.168.1.200 ;而全部來自 192.168.1.100 192.168.1.200 的數據包都將分別被假裝成由 202.110.123.100 202.110.123.200 ,從而也就實現了 ip 映射。
例創建包過濾防火牆
#touch /etc/rc.d/filter-firewall
#chmod u+x /etc/rc.d/filter-firewall
#echo "/etc/rc.d/filter-firewall">>/etc/rc.d/rc.local 使腳本能在系統啓動時自動執行
#vi /etc/rc.d/filter-firewall
#!/bin/bash
echo "starting iptables rules..."
echo "1">/proc/sys/net/ipv4/ip_forward 開啓內核轉發功能
IPT=/sbin/iptables 定義變量
$IPT -F 刷新全部鏈的規則
$IPT -P FORWARD DROP 爲永久鏈指定默認規則。 DROP 表示包被丟棄,即禁止轉發任何經過的包
$IPT -A FORWARD -p tcp -d 192.168.80.251 --dport www -i eth0 ACCEPT
$IPT -A FORWARD -p tcp -d 192.168.80.252 --dport ftp -i eth0 ACCEPT
$IPT -A FORWARD -p tcp -d 192.168.80.253 --dport smtp -i eth0 ACCEPT
$IPT -A FORWARD -p tcp -s 0/0 --sport ftp-data -d 192.168.80.0/24 -i eth0 -j accept
$IPT -A FORWARD -p ICMP -s 0/0 -d 192.168.80.0/24 -i eth0 -j REJECT
#/etc/rc.d/filter-firewall 使防火牆起做用
例配置 SNAT 帶動簡單的局域網使用 Internet 資源
#touch /etc/rc.d/snat-firewall
#chmod u+x /etc/rc.d/snat-firewall
#echo "/etc/rc.d/snat-firewall">>/etc/rc.d/rc.local
#vi /etc/rc.d/snat-firewall
#!/bin/bash
echo "1">/proc/sys/net/ipv4/ip_forward
IPT=/sbin/iptables
加載內核模塊
/sbin/modprobe iptables
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_LOG
清除已設規則,還原到不設防火牆的狀態
$IPT -p INPUT ACCEPT
$IPT -p FORWARD ACCEPT
$IPT -p OUTPUT ACCEPT
$IPT -t nat -p PREROUTING ACCEPT
$IPT -t nat -p POSTROUTING ACCEPT
$IPT -t nat -p OUTPUT ACCEPT
for TABLE in filter nat mangle;do
$IPT -t $TABLE -F 清除預設表 filter 中全部規則鏈中的規則
$IPT -t $TABLE -X 清除預設表 filter 使用者自定義鏈中規則
done
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 容許全部已經初始化了的迴應數據包
for DNS in $(grep ^n /etc/resolv.conf|awk '{print $2}');do
$IPT -A INPUT -p udp -s $DNS --sport domain -j ACCEPT 容許 DNS 服務器進入防火牆的數據包
done
$IPT -N LOGDENY 建立用戶定義鏈 LOGDENY, 在此鏈中添加規則,拒絕全部 ( 除了 lo 接口 ) 新創建或無效的鏈接請求並記入日誌
$IPT -A LOGDENY -j LOG --log-prefix "iptables:"
$IPT -A LOGDENY -j DROP
$IPT -A INPUT -i ! lo -m state --state NEW,INVALID -j LOGDENY
$IPT -t nat -A POSTROUTING -o eth1 -j SNAT --to 200.200.200.1
例在局域網對外發布服務
#touch /etc/rc.d/snat-firewall
#chmod u+x /etc/rc.d/snat-firewall
#echo "/etc/rc.d/snat-firewall">>/etc/rc.d/rc.local
#vi /etc/rc.d/snat-firewall
#!/bin/bash
echo "1">/proc/sys/net/ipv4/ip_forward
IPT=/sbin/iptables
加載內核模塊
/sbin/modprobe iptables
/sbin/modprobe iptable_nat
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ipt_LOG
清除已設規則,還原到不設防火牆的狀態
$IPT -p INPUT ACCEPT
$IPT -p FORWARD ACCEPT
$IPT -p OUTPUT ACCEPT
$IPT -t nat -p PREROUTING ACCEPT
$IPT -t nat -p POSTROUTING ACCEPT
$IPT -t nat -p OUTPUT ACCEPT
for TABLE in filter nat mangle;do
$IPT -t $TABLE -F 清除預設表 filter 中全部規則鏈中的規則
$IPT -t $TABLE -X 清除預設表 filter 使用者自定義鏈中規則
done
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 容許全部已經初始化了的迴應數據包
for DNS in $(grep ^n /etc/resolv.conf|awk '{print $2}');do
$IPT -A INPUT -p udp -s $DNS --sport domain -j ACCEPT 容許 DNS 服務器進入防火牆的數據包
done
容許訪問被開放的服務
$IPT -A INPUT -p tcp --sport 80 -j ACCEPT
$IPT -A INPUT -p tcp --sport 443 -j ACCEPT
$IPT -A INPUT -p tcp --sport 21 -j ACCEPT
$IPT - N LOGDENY
$IPT -A LOGDENY -j LOG --log-prefix "iptables:"
$IPT -A LOGDENY -j DROP
$IPT -A INPUT -i ! lo -m state --state NEW,INVALID -j LOGDENY
$IPT -t nat -A POSTROUTING -o eth1 -j SNAT --to 200.200.200.1 SNAT
對防火牆的服務請求重定向到局域網內部
$IPT -t nat -A PREROUTIGN -p tcp -d 200.200.200.1 --dport 80 -j DNAT --to 192.168.88.47:80
相關文章
相關標籤/搜索