linux nat


(一)Iptables 的使用語法 
在使用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. 使用完整的域名,如“ www.linuxaid.com.cn ”;
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來指明端口。

(二)iptabls的使用實例:
假如有一個廣域網的ip地址為a.b.c.d 網關a.b.c.x 掩碼 255.255.255.252
局域網ip地址為192.168.0.1-192.168.0.255 網關 192.168.0.1 
軟件環境為:Linux7.2 選擇server安裝
指定eth0:a.b.c.d eth1:192.168.0.1
添加路油表
vi /etc/sysconfig/static-routes
etho net a.b.c.d netmask 255.255.255.252 gw a.b.c.x
eth1 net 192.168.0.1netmask 255.255.255.0 gw 192.168.0.1
指定網關
vi /etc/sysconfig/network
NETWORKING=yes
GATEWAYDEV=eth0
GATEWAY=a.b.c.x
HOSTNAME=(主機名字)
起用路油
vi /etc/sysctl.conf
net.ipv4.ip_forward=1
net.ipv4.conf.default.rp_filter=1
kernel.core_uses_pid=1
kernel.sysrq=0
配置iptables的腳本
建立rc.fw
#for this to run iptables firewall
!/bin/sh
/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -X
/sbin/iptables -Z
echo"1">/proc/sys/net/ipv4/ip_forward
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
iptables -A FORWARD -s 0/0 -d 0/0 -j ACCEPT
上面這些是沒有任何限制的iptables要想有些安全限制可以自行
新的聯接
(三)端口的轉發
假如內部有一個www 服務器 一個ftp服務器
地址分別是192.168.0.8(www)
192.168.0.9(ftp)
在上面的腳本里最后添加
iptables -t nat -A PREROUTING -d a.b.c.d -p tcp --dport 80 –j DNAT --to 192.168.0.8:80
iptables -t nat -A PREROUTING -d a.b.c.d -p tcp --dport 21 -j DNAT --to 192.168.0.9:21
附錄:
-p 指定協議(--protocol)
--dport 指明端口(--source-port/--sport和 --destination-port)
-i 或者-o 指定網絡接口(PREROUTING鏈用-i POSTROUTING 用-o)
-s 指明源地址(--source/--src/源地址destination/--dst/目的地址)
-A 加入一個新規則到一個鏈(一般寫到最后面)(append)
-I 在鏈內某個位置插入(insert)一般最后面
-R 在鏈內某個位置替換一條規則
-D 刪除鏈內第一條規則(delete) 
-d 指明目的地址 
——————————————————————————————————————
下面是一個iptable的腳本沒有安全性能
touch /var/lock/subsys/local
#for this to run iptables firewall
!/bin/sh
/sbin/modprobe ip_tables
/sbin/modprobe ip_nat_ftp
/sbin/modprobe ip_conntrack_ftp
/sbin/iptables -F
/sbin/iptables -F -t nat
/sbin/iptables -X
/sbin/iptables -Z
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT

echo"1">/proc/sys/net/ipv4/ip_forward
/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
/sbin/iptables -A FORWARD -s 0/0 -d 0/0 -j ACCEPT 

————————————————————————————————————————
iptables 過濾規則
# 過濾表規則

*filter

# 默認徹略
:FORWARD DROP [ ]
:INPUT DROP [ ]
:OUTPUT ACCEPT [ ]

# 定義新鏈
-N ICMP_FORWARD
-N TCP_FORWARD
-N UDP_FORWARD
-N ICMP_INPUT
-N TCP_INPUT
-N UDP_INPUT

# Fix a bug
-A OUTPUT -p icmp -m state --state INVALID -j DROP

# 以下是FORWARD鏈的規則
# 若是ICMP協議則跳到 ICMP_FORWARD
-A FORWARD -p icmp -j ICMP_FORWARD
# 若是TCP協議則跳到 TCP_FORWARD
-A FORWARD -p tcp -j TCP_FORWARD
# 若是UDP協議則跳到 UDP_FORWARD
-A FORWARD -p udp -j UDP_FORWARD
# 允許碎片通過的速率200個/s,從200開始計數
-A FORWARD -f -m limit --limit 200/s --limit-burst 200 -j ACCEPT
# 不匹配FORWARD鏈的所有規則,丟棄數據包,結束FORWARD鏈
-A FORWARD -j DROP

# 以下是FORWARD鏈中針對ICMP協議的規則
# 從內網到外網的放行
-A ICMP_FORWARD -p icmp -s 192.168.0.0/24 -i eth0 -o ppp+ -j ACCEPT
# 從外網進來的回應包放行
-A ICMP_FORWARD -p icmp -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 丟棄所有不匹配的ICMP數據包,結束FORWARD鏈
-A ICMP_FORWARD -p icmp -j DROP

# 以下是FORWARD鏈中針對TCP協議的規則
# 允許內網1024以上的端口連接外網
-A TCP_FORWARD -p tcp -s 192.168.0.0/24 -m tcp --sport 1024: -i eth0 -o ppp+ -j ACCEPT
# 允許內網進行主動式的FTP
-A TCP_FORWARD -p tcp -m tcp --sport 21 --dport 1024: -m state --state ESTABLISHED -i ppp+ -j ACCEPT
-A TCP_FORWARD -p tcp -m tcp --sport 20 --dport 1024: -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 允許外網進來的回應包通過
-A TCP_FORWARD -p tcp -m state --state ESTABLISHED -m tcp --dport 1024: -i ppp+ -j ACCEPT
# 丟棄所有不匹配的TCP數據包,結束FORWARD鏈
-A TCP_FORWARD -p tcp -j DROP

# 以下是FORWARD鏈中針對UDP協議的規則
# 允許內網1024以上的端口連接外網
-A UDP_FORWARD -p udp -s 192.168.0.0/24 -m udp --sport 1024: -i eth0 -o ppp+ -j ACCEPT
# 允許外網中指明的DNS服務器進行域名解析
-A UDP_FORWARD -p udp -s 202.96.96.68 -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT 
-A UDP_FORWARD -p udp -s 202.96.*.* -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT 
# 開放IRC OICQ 端口
-A UDP_FORWARD -p udp -m multiport --source-port 4000,8000 -m udp --dport 1024: -i ppp+ -j ACCEPT
# 允許從外網進來的UDP回應包通行
-A UDP_FORWARD -p udp -m state --state ESTABLISHED,RELATED -m udp --dport 1024: -i ppp+ -j ACCEPT
# 丟棄所有不匹配的UDP數據包,結束FORWARD鏈
-A UDP_FORWARD -p udp -j DROP

# 以下開始是對網關服務器的匹配規則

# 允許數據包進入本地回環接口
-A INPUT -p all -i lo -j ACCEPT

# 若是ICMP協議則跳到ICMP_INPUT進行規則匹配
-A INPUT -p icmp -j ICMP_INPUT
# 若是TCP協議則跳到TCP_INPUT進行規則匹配
-A INPUT -p tcp -j TCP_INPUT
# 若是UDP協議則跳到UDP_INPUT進行規則匹配
-A INPUT -p udp -j UDP_INPUT
# 允許碎片通過的速率200個/s,從200開始計數
-A INPUT -f -m limit --limit 200/s --limit-burst 200 -j ACCEPT
# 不匹配INPUT鏈的所有規則,丟棄數據包,結束INPUT鏈
-A INPUT -j DROP

# 以下是INPUT鏈中針對ICMP協議的規則
# 允許從內網來的ICMP數據包
-A ICMP_INPUT -p icmp -i eth0 -j ACCEPT
# 允許從外網來的ICMP回應包通行
-A ICMP_INPUT -p icmp -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 丟棄所有不匹配的ICMP數據包,結束INPUT鏈
-A ICMP_INPUT -p icmp -j DROP

# 以下是INPUT鏈中針對TCP協議的規則
# 對內網機器提供 http https 網上鄰居 透明代理服務
-A TCP_INPUT -p tcp -s 192.168.0.0/24 -m multiport --destination-port 80,443,137,138,139,8080 -i eth0 -j ACCEPT
# 允許服務器以主動方式連接外網的FTP服務器
-A TCP_INPUT -p tcp -m tcp --sport 21 --dport 1024: -m state --state ESTABLISHED -i ppp+ -j ACCEPT
-A TCP_INPUT -p tcp -m tcp --sport 20 --dport 1024: -m state --state ESTABLISHED,RELATED -i ppp+ -j ACCEPT
# 提供 ssh smtp pop3 http https 服務
-A TCP_INPUT -p tcp -m multiport --destination-port 22,25,110,80,443 -j ACCEPT
# 拒絕外網主動連接本服務器
-A TCP_INPUT -p tcp -m tcp --syn -i ppp+ -j DROP
# 允許進來的回應包通過
-A TCP_INPUT -p tcp -m state --state ESTABLISHED -m tcp --dport 1024: -j ACCEPT
# 丟棄所有不匹配的TCP數據包,結束INPUT鏈
-A TCP_INPUT -p tcp -j DROP

# 以下是INPUT鏈中針對UDP協議的規則
# 允許外網中指明的DNS服務器進行域名解析
-A UDP_INPUT -p udp -s 202.96.96.68 -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT 
-A UDP_INPUT -p udp -s 202.96.*.* -m udp --sport 53 --dport 1024: -i ppp+ -j ACCEPT 
# 為內網的機器提供DNS和SAMBA服務
-A UDP_INPUT -p udp -s 192.168.0.0/24 -m multiport --destination-port 53,137,138,139 -i eth0 -j ACCEPT
# 允許服務器作為samba client
-A UDP_INPUT -p udp -s 192.168.0.0/24 -m udp --sport 137:139 --dport 1024: -i eth0 -j ACCEPT
# 允許進來的回應包通過
-A UDP_INPUT -p udp -m state --state ESTABLISHED,RELATED -m udp --dport 1024: -j ACCEPT
# 為內網的機器提供DHCP服務
-A UDP_INPUT -p udp -m udp --sport 68 --dport 67 -i eth0 -j ACCEPT
# 丟棄所有不匹配的UDP數據包,結束INPUT鏈
-A UDP_INPUT -p udp -j DROP

COMMIT


# 路由表規則

*nat

# 默認徹略
:PREROUTING ACCEPT [ ]
:POSTROUTING ACCEPT [ ]
:OUTPUT ACCEPT [ ]

# 為內網機器使用squid透明代理進行端口重定向
-A PREROUTING -i eth0 -p tcp -d ! 192.168.0.1 -m tcp --dport 80 -j REDIRECT --to-ports 8080
# 對內網機器應用IP偽裝
-A POSTROUTING -o ppp+ -j MASQUERADE

COMMIT 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM