配置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