iptable埠重定向 MASQUERADE
首先簡述下NAT伺服器在負載均衡中做了什麼,簡單的說就是Linux (核心2.4以後是Netfilter肩負起這個使命滴)核心緩衝區修改來源,目標地址。
但是,由於Netfilter工作在Linux 核心我們無法直接操作它,所以Linux提供了iptables。
用iptables實現:
說到iptables目前最多應用在防火牆了,我們公司的所有的伺服器都配置了iptables防火牆,比如
它完成的是,告訴核心當前伺服器只允許外部通過TCP訪問80埠。
另外iptables還可以實現埠重定向,比如
它將外部訪問80埠轉發到8000埠。
iptables NAT規則
nat表需要的三個鏈:
1.PREROUTING:可以在這裡定義進行目的NAT的規則,因為路由器進行路由時只檢查資料包的目的ip地址,所以為了使資料包得以正確路由,我們必須在路由之前就進行目的NAT;
2.POSTROUTING:可以在這裡定義進行源NAT的規則,系統在決定了資料包的路由以後在執行該鏈中的規則。
3.OUTPUT:定義對本地產生的資料包的目的NAT規則。
需要用到的幾個動作選項:(真實環境中用大寫)
redirect | 將資料包重定向到另一臺主機的某個埠,通常用實現透明代理和對外開放內網某些服務。 | ||||
snat | 源地址轉換,改變資料包的源地址 | ||||
dnat | 目的地址轉換,改變資料包的目的地址 | ||||
masquerade | IP偽裝,只適用於ADSL等動態撥號上網的IP偽裝,如果主機IP是靜態分配的,就用snat |
PRERROUTING:DNAT 、REDIRECT (路由之前)只支援-i,不支援-o。在作出路由之前,對目的地址進行修改
POSTROUTING:SNAT、MASQUERADE (路由之後)只支援-o,不支援-i。在作出路由之後,對源地址進行修改
OUTPUT:DNAT 、REDIRECT (本機)DNAT和REDIRECT規則用來處理來自NAT主機本身生成的出站資料包.
一、開啟核心的路由功能。
要實現nat,要將檔案/proc/sys/net/ipv4/ip_forward內的值改為1,(預設是0)。
二、nat不同動作的配置
1)MASQUERADE:是動態分配ip時用的IP偽裝:在nat表的POSTROUTING鏈加入一條規則:所有從ppp0口送出的包會被偽裝(MASQUERADE)
[root@localhost]# iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
要想系統啟動時自動實現nat,在/etc/rc.d/rc.local檔案的末尾新增
[root@localhost]# echo "1">/proc/sys/net/ipv4/ip_forward
[root@localhost]# /sbin/iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
2) SNAT:一般正常共享上網都用的這個。
所有從eth0(外網路卡)出來的資料包的源地址改成61.99.28.1(這裡指定了一個網段,一般可以不指定)
[root@localhost]# iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to 61.99.28.1
3)DNAT:目的nat 做智慧DNS時會用到
智慧DNS:就是客戶端在dns項裡無論輸入任何ip,都會給他定向到伺服器指定的一個dnsip上去。
在路由之前所有從eth0(內網路卡)進入的目的埠為53的資料包,都傳送到1.2.3.4這臺伺服器解析。
[root@localhost]# iptables -t nat -I PREROUTING -i eth0 -p udp --dport 53 -j DNAT --to-destination 1.2.3.4:53
[root@localhost]# iptables -t nat -I PREROUTING -i eth0 -p tcp --dport 53 -j DNAT --to-destination 1.2.3.4:53
4)REDIRECT:重定向,這個在squid透明代理時肯定要用到它
所有從eth1進入的請求80和82埠的資料,被轉發到80埠,由squid處理。
[root@localhost]# iptables -t nat -A PREROUTING - -i eth1 -p tcp -m multiport --dports 80,82 -j REDIRECT --to-ports 80
問題
解決方案
iptables中可以靈活的做各種網路地址轉換(NAT)
snat是source network address translation的縮寫
即源地址目標轉換
比如,多個PC機使用ADSL路由器共享上網
每個PC機都配置了內網IP
PC機訪問外部網路的時候,路由器將資料包的報頭中的源地址替換成路由器的ip
他的日誌記錄下來的是路由器的ip地址,而不是PC機的內網ip
這是因為,這個伺服器收到的資料包的報頭裡邊的“源地址”,已經被替換了
所以叫做snat,基於源地址的地址轉換
DNAT是destination network address translation的縮寫
即目標網路地址轉換
典型的應用是,有個web伺服器放在內網配置內網ip,前端有個防火牆配置公網ip
網際網路上的訪問者使用公網ip來訪問這個網站
當訪問的時候,客戶端發出一個資料包
這個資料包的報頭裡邊,目標地址寫的是防火牆的公網ip
防火牆會把這個資料包的報頭改寫一次,將目標地址改寫成web伺服器的內網ip
然後再把這個資料包傳送到內網的web伺服器上
這樣,資料包就穿透了防火牆,並從公網ip變成了一個對內網地址的訪問了
即DNAT,基於目標的網路地址轉換
MASQUERADE,地址偽裝,在iptables中有著和snat相近的效果,但也有一些區別
但使用snat的時候,出口ip的地址範圍可以是一個,也可以是多個,例如:
如下命令表示把所有10.8.0.0網段的資料包snat成192.168.5.3的ip然後發出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j snat --to-source 192.168.5.3
如下命令表示把所有10.8.0.0網段的資料包snat成192.168.5.3/192.168.5.4/192.168.5.5等幾個ip然後發出去
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j snat --to-source 192.168.5.3-192.168.5.5
這就是snat的使用方法,即可以NAT成一個地址,也可以NAT成多個地址
但是,對於snat,不管是幾個地址,必須明確的指定要snat的ip
假如當前系統用的是ADSL動態撥號方式,那麼每次撥號,出口ip192.168.5.3都會改變
而且改變的幅度很大,不一定是192.168.5.3到192.168.5.5範圍內的地址
這個時候如果按照現在的方式來配置iptables就會出現問題了
因為每次撥號後,伺服器地址都會變化,而iptables規則內的ip是不會隨著自動變化的
每次地址變化後都必須手工修改一次iptables,把規則裡邊的固定ip改成新的ip
這樣是非常不好用的
MASQUERADE就是針對這種場景而設計的,他的作用是,從伺服器的網路卡上,自動獲取當前ip地址來做NAT
比如下邊的命令:
iptables -t nat -A POSTROUTING -s 10.8.0.0/255.255.255.0 -o eth0 -j MASQUERADE
如此配置的話,不用指定snat的目標ip了
不管現在eth0的出口獲得了怎樣的動態ip,MASQUERADE會自動讀取eth0現在的ip地址然後做snat出去
這樣就實現了很好的動態snat地址轉換
相關文章
- Linux防火牆Iptable設定只允許某ip訪問某埠Linux防火牆
- [轉]IPTABLES中SNAT和MASQUERADE的區別
- 使用iptable實現動態防火牆(轉)防火牆
- 一個簡單的iptable的應用
- Windows 上使用 PowerShell 設定防火牆規則和埠轉發; Windows 上配置埠轉發,將 3389 埠的流量重定向到自定義埠;Windows防火牆
- Python實現TCP/IP協議下的埠轉發及重定向示例PythonTCP協議
- Facebook收購換臉應用開發商Masquerade
- Shell 重定向(一):檔案重定向
- 重定向
- AMD R2000 Bilby 單板 Inside BIOS 串列埠重定向的使用IDEiOS串列埠
- nginx 重定向Nginx
- javaweb重定向JavaWeb
- Response重定向
- CI重定向:php(codeigniter)中如何重定向PHP
- linux iptable 防火牆沒有關閉會影響監聽Linux防火牆
- Linux重定向Linux
- HTTP 的重定向HTTP
- linux shell重定向Linux
- 資料流重定向
- bp 開放重定向
- 使用檔案重定向
- 轉發和重定向
- 重定向Redirect 的知識
- Linux 資料重定向Linux
- Linux 重定向輸出Linux
- IISURLRewrite重定向域名到www
- Linux 檔案重定向Linux
- python 輸出重定向Python
- Fiddler(6)AutoResponder,重定向
- 8、flask-Redirect重定向Flask
- Laravel 重定向的幾種方法Laravel
- PHP重定向與偽靜態PHP
- nginx下thinkphp的URL重定向NginxPHP
- shell基礎-輸出重定向
- [shell基礎]——I/O重定向
- Linux命令學習(重定向)Linux
- 深入 Linux I/O 重定向Linux
- java -version重定向到檔案Java