NAT:網絡地址轉換(Network Address Translation),也叫作網絡掩蔽或者IP掩蔽(IP masquerading),是一種在IP封包經過路由器或防火牆時重寫來源IP地址或目的IP地址的技術。nginx
簡單來講在數據傳輸中,通過7層網絡結構時,爲了實現三次握手,就須要在發送數據的時候告訴目的地你的位置,以便對方能夠回覆,可是在數據報中只有起點域和目的域,不可能全部的終端都是點對點鏈接的,這時候就須要一箇中轉站來傳遞消息數據,這裏只討論軟件來實現 nat,路由器的因爲基本不會直接操做,就沒查資料了。apache
iptables 做用的 5 條規則鏈中,有兩條是 PREROUTING、POSTROUTING,分別表明的是路由前和路由後,iptables 就是實現 nat 的一種方式。vim
檢查系統是否開啓了 ip 轉發功能:後端
cat /etc/sysctl.conf| grep 'net.ipv4.ip_forward = 0'服務器
開啓轉發功能:網絡
sed -i 's/net.ipv4.ip_forward = 0/net.ipv4.ip_forward = 1/g' /etc/sysctl.conftcp
在 iptables 中添加 NAT 轉換規則:工具
iptables -t nat -I PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.1.1阿里雲
上面這條規則會將訪問 80 端口的全部請求都轉發給 192.168.1.1spa
添加數據返回規則:
iptables -t nat -I POSTROUTING -p tcp --dport 80 -j MASQUERADE
這樣請求就會被防火牆修改 ip 地址,而轉發出去。
阿里雲的幫助文檔裏面提供了一種經過 rinetd 的方法(不過配置說明方面寫的容易讓人誤會,我第一次就沒看明白,還也爲是註釋),看名字就知道這是一款用來實現 nat 的,很簡潔配置也方便,畢竟是專門用來作 nat 的。
官網下載編譯安裝:
wget http://www.boutell.com/rinetd/http/rinetd.tar.gz
tar -xvf rinetd.tar.gz
cd rinetd && mkdir /usr/man && make && make install
不須要 configure 生成 Makefile。
配置:
vim /etc/rinetd.conf
0.0.0.0 80 192.168.1.1 80
0.0.0.0 表明源地址,可作限制
80 請求的端口
192.168.1.1 轉發的目的地址
80 目的端口
全網請求在 80 端口的都會被 NAT 到 192.168.1.1 的 80 端口上。
rinetd -c /etc/rinetd.conf
啓動 rinetd
nginx 並無圍繞着傳統的 nat 去實現轉換,傳統的 nat 只能知足一個 ip 一個端口的轉發模式,可是若是有幾個 ip 都但願獲得同一個端口的轉發呢?
把轉發從以前的 3 層和 4 層的 ip 加端口的映射提升到應用層來實現,經過域名的不一樣來轉發至不一樣的 Ip,術語稱爲反向代理。
nginx 是一款很好用的反向代理工具,配置文件向較與 apache 來講更好理解,關於代理還有不少軟件,proxy 相關的模塊不少。
配置反向代理
經過域名的不一樣,nginx 會把請求轉發給 192.168.1.1 和 192.168.1.2 兩個服務器,這樣就實現了一個簡單的域名轉發功能。
nginx 的請求都是由反向代理傳遞給後端服務器的,全部後端服務器獲取的訪問 ip 地址都是反向代理服務器的,想要獲取真實的訪問 ip,若是後端服務器也是 nginx ,那麼就須要修改後端服務器的 nginx 日誌格式:
這樣就能夠在 access 日誌中打印出訪問的真實 IP 了。