Linux 實現 NAT

前言

    NAT:網絡地址轉換(Network Address Translation),也叫作網絡掩蔽或者IP掩蔽(IP masquerading),是一種在IP封包經過路由器或防火牆時重寫來源IP地址或目的IP地址的技術。nginx

    簡單來講在數據傳輸中,通過7層網絡結構時,爲了實現三次握手,就須要在發送數據的時候告訴目的地你的位置,以便對方能夠回覆,可是在數據報中只有起點域和目的域,不可能全部的終端都是點對點鏈接的,這時候就須要一箇中轉站來傳遞消息數據,這裏只討論軟件來實現 nat,路由器的因爲基本不會直接操做,就沒查資料了。apache

 

iptables 實現 NAT

    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 實現

    阿里雲的幫助文檔裏面提供了一種經過 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

    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 了。

相關文章
相關標籤/搜索