iptables -t nat -A PREROUTING -s c網段/24 -d A伺服器專ip/32 -p tcp -m tcp --dport 7000 -j DNAT --to-destination 目標屬ip:7000
Ⅱ linux如何做埠轉發
1、SSH 埠轉發
SSH 提供了一個非常有意思的功能,就是埠轉發,它能夠將其他 TCP 埠的網路數據通過 SSH 鏈接來轉發,並且自動提供了相應的加密及解密服務。
2、iptables 埠轉發
CentOS 7.0 以下使用的是iptables,可以通過iptables實現數據包的轉發。
3、firewall 埠轉發
CentOS 7.0以上使用的是firewall,通過命令行配置實現埠轉發。
4、rinetd 埠轉發
rinetd是一個輕量級TCP轉發工具,簡單配置就可以實現埠映射/轉發/重定向。
Ⅲ 【轉載】通過iptables實現埠轉發和內網共享上網
【出處】 http://blog.51cto.com/wwdhks/1154032
【作者】張天成, [email protected]
iptables操作的是2.4以上內核的netfilter,所以需要 linux的內核在2.4以上。其功能與安全性遠遠比其前輩 ipfwadm, ipchains強大,iptables大致是工作在OSI七層的二、三、四層,其前輩ipchains不能單獨實現對tcp/udp port以及對mac地址的的定義與操作,所以我想ipchains應該是僅僅工作在三層的。
我們先簡單介紹一下netfilter的大致工作流程,也就是一個數據包(或者叫分組、packet,我個人習慣叫包)在到達linux的網路介面的時候 (網卡)如何處理這個包,然後鄭困再介紹一下如何用iptables改變或者說控制對這個數據包進行操作。
netfilter內部分為三個表,分別是 filter,nat,mangle,每個表又有不同的操作鏈(Chains)。
下面有一張圖清晰的描繪了netfilter對包的處理流程(該圖摘自網上,不知作者是誰,在此深表敬意!),一般情況下,我們用不到這個mangle表,在這里我們就不做介紹了。
當一個包來到Linux的網路介面的時候先執行PREROUTING操作,依次經過mangle、nat的PREROUTING鏈。從這個Chain的名字我們可以看出,這個Chain是在路由之前(pre-routing)要過的。為什麼要在路由之前過呢?因為在這個鏈裡面我們對包的操作是DNAT,也就是改變目的地址和(或埠),通常用在埠轉發(修改P
ort),或者NAT到內網的DMZ區(修改地址)。
環境配置如下:
我們怎麼樣能讓Internet用戶通過公網IP訪問內部的web伺服器呢? 在這個PREROUTING鏈上定義一個規則,把訪問60.1.1.1:80的用戶的目的地址改變一下,改變為10.1.1.2:80,這樣就實現了internet用戶對內網伺服器的訪問了。當然,這個埠是比較靈活的,我們可以定義任何一個埠的轉發,不一定是80-->80。具 體的命令我們在下面的例子中介紹,這里我們只談流程與概念上的實現方法。
好了,我們接著往下走,來到圖中下方的那個菱形(FORWARD),轉發!
默認情況下,當Linux收到了一喊數念個目的IP地址不是本地IP的包,Linux會把這個包丟棄。因為默認情況下,Linux的三層包轉發功能是關閉的,如果要讓我們的Linux實現轉發,則需要打開這個轉發功能,可以 改變它的一個系統參數,使用如下命令打開轉發功能:
處理順序上,依然是mangle優先、隨後流經filter的FORWOARD鏈。我們操作任何一個鏈都會影響到這個包的命運,在 下面的介紹中,我們就忽略掉mangle表,我們基本用不到操作它,所以我們假設它是透明的。假設這個包被我們的規則放過去了,也就是ACCEPT了,它將進入POSTROUTING部分。
注意!這里我注意到一個細節問題,也就是上面的圖中數據包過了FORWARD鏈之後直接進入了POSTROUITNG 鏈,我覺得這中間缺少一個環節,也就是ROUTING。對於轉發的包來說,Linux同樣需要在選路(路由)之後才能將它送出,這個圖卻沒有標明這一點,我認為它是在過了ROUTING之後才進入的POSTROUITNG。當然了,這對於我們討論iptables的過濾轉發來說不是很重要,只是我覺得流程上有這個問題,還是要說明 一下。
POSTROUTING鏈是數據包要送出這台Linux的最後一個環節了,也是極其重要的一個環節。這個時候Linux已經完成了對這個包的路由(選路工作),已經找到了合適的介面送出這個包了,在這個鏈裡面我們要進行重要的操作,就是被Linux稱為 SNAT的一個動作,修改源IP地址!
為什麼修改源IP地址?最常見的就是我們內網多台機器需要共享一個或幾個公網IP訪問 Internet。因為我們的內網地址是私畢銀有的,假如就讓Linux給路由出去,源地址也不變,這個包能訪問到目的地,但卻回不來。因為 Internet上的路由節點不會轉發私有地址的數據包,也就是說,不用合法IP,我們的數據包有去無回。
有人會說:「既然是這樣,我就不用私有IP了,我自己分配自己合法的地址不行嗎?那樣包就會回來了吧?」。答案是否定的,IP地址是ICANN來分配的,Internet上的路由器會把這個返回包送到合法的IP去,你同樣收不到。而你這種行為有可能被定義為一種ip欺騙,很多設備會把這樣的包在接入端就給濾掉了。
那麼Linux如何做SNAT 呢?環境配置如下:
當內網節點10.1.1.12需要訪問202.2.2.2的web伺服器,發送數據包時先路由到10.1.1.1節點,隨後(在10.1.1.1節點配置SNAT)將源IP改為60.1.1.1後送出。同時在ip_conntrack表裡面做一個記錄:內網的哪一個ip的哪個埠訪問的這個web伺服器,自己把它的源地址改成多少了,埠改成多少了,以便這個web伺服器返回數據包的時候linux將它准確的送回給發送請求的這個pc.
大體的數據轉發流程我們說完了,我們看看iptables使用什麼樣的參數來完成這些操作。在描述這些具體的操作之前,我還要說幾個我對iptables的概念的理解(未必完全正確),這將有助於大家理解這些規則,以實現更精確的控制。
上文中我們提到過,對包的控制是由我們在不同的Chain(鏈)上面添加不同的規則來實現的。那麼既然叫鏈,一定就是一條或者多條規則組成的了,這時就有一個問題了,如果多個規則對同一種包進行了定義,會發生什麼事情呢?
在Chain中,所有的規則都是從上向下來執行的,也就是說,如果匹配了第一行,那麼就按照第一行的規則執行,一行一行的往下找,直到找到 符合這個類型的包的規則為止。如果找了一遍沒有找到符合這個包的規則怎麼辦呢?iptables裡面有一個概念,就是Policy(策略),如果找了一遍找不到符合處理這個包的規則,就按照policy來辦。iptables 使用-P來設置Chain的策略。
對鏈的操作就那麼幾種:
比如我們要添加一個規則到filter表的FORWARD鏈:
在iptables中,默認的表名就是filter,所以這里可以省略-t filter直接寫成:
iptables中的匹配參數: 我們在這里就介紹幾種常用的參數,詳細地用法可以man iptables看它的聯機文檔,你會有意外的收獲。
環境信息:
或者使用如下命令
配置完成,在內網節點(192.168.234.72)發起的伺服器節點(8.1.234.73)請求,會由外網節點修改源ip後轉發出去。
在8.1.234.73上啟動nginx服務,在192.168.234.72上通過curl訪問效果如下:
可以將上述配置寫到一個文件中,以便重復執行。
除此之外,也可以精確控制他的訪問地址,比如我就允許10.1.1.99訪問3.3.3.3這個ip
或者只允許他們訪問80埠
更多的控制可以自己靈活去做,或者查閱iptables的聯機文檔。
環境信息:
確保服務監聽的是ip是內網ip
或者使用如下命令
同樣,可以將這部分配置放到一個文件中:
OK,至此配置完成,我們可以嘗試在外網節點(8.1.234.73)上,通過網關節點(8.1.234.71)訪問內網(192.168.234.72)提供的服務(80埠)。
在前面的配置中,內網節點將互通的外網節點做為網關,由網關節點修改目的地址,源地址保持不變。其實,還存在另外一種配置方式,同時修改源地址、目的地址。將內網地址中的默認路由配置刪除
增加一個SNAT配置
這條命令不太好懂?其實很簡單,如果使用這條命令,那麼你的web server不需要再設置默認網關,就能收到這個請求,只要他和linux的lan ip地址是能互訪的(也就是說web server和Linux的Lan ip在一個廣播域)。我們在根據上面的netfilter流程圖來分析這個包到底被我們怎麼樣了:
修改目的地址,於是這個包變成了8.1.234.73:1333-->192.168.234.72:80。
進入route box選路,找到合適路徑,此時這個包依舊是8.1.234.73:1333-->192.168.234.72:80。
原來是一個SNAT,改你的源地址,於是這個包變成了192.168.234.71:xxxx(隨機埠)-->192.168.234.72:80。
看了上面的兩個例子,不知道大家是否清楚了iptables的轉發流程,希望對大家有所幫助。
下面來講前面提到的ESTABLISHED,RELATED規則是怎麼回事,到底有什麼用處。
我們知道,網路的訪問是雙向的,也就是說一個Client與Server之間完成數據交換需要雙方的發包與收包。在netfilter中,有幾種狀態,也就是New, Established,Related,Invalid。
當一個客戶端,在本文例一中,內網的一台機器訪問外網,我們設置了規則允許他出去,但是沒有設置允許回來的規則啊,怎麼完成訪問呢?這就是netfilter的 狀態機制 ,當一個Lan用戶通過這個Linux訪問外網的時候,它發送了一個請求包,這個包的狀態是New(配置了內網IP的轉發規則,放行)。當外網回包的時候他的狀態就是Established,所以,Linux知道,哦,這個包是我的內網的一台機器發出去的應答包,他就放行了。
而外網試圖對內發起一個新的連接的時候,他的狀態是New,所以Linux壓根不去理會它。這就是我們為什麼要加這一句的原因。
還有那個Related,他是一個關聯狀態,什麼會用到呢?sftp、ftp都會用到,因為他們的傳輸機制決定了,它不像http訪問那樣,Client_IP: port-->Server:80然後server:80-->Client_IP:port,ftp使用tcp21建立連接,使用20埠發送數據,其中又有兩種方式,一種主動active mode,一種被動passive mode。主動模式下,client使用port命令告訴server我用哪一個埠接受數據,然後server主動發起對這個埠的請求。被動模式下,server使用port命令告訴客戶端,它用那個埠監聽,然後客戶端發起對他的數據傳輸,所以這對於一個防火牆來說就是比較麻煩的事情,因為有可能會有New狀態的數據包,但是它又是合理的請求,這個時候就用到這個Related狀態了,他就是一種關聯,在linux中,有個叫 ftp_conntrack的模塊,它能識別port命令,然後對相應的埠進行放行。
對了,還有幾個在實際中比較實用(也比較受用:-))的命令參數,寫出來供大家參考
Ⅳ linux埠轉發.求高手!!!!急 想實現訪問A的8999其實就是訪問B的8999。 A的ip 192.168.1.100 B是200
>192.168.1.100
1.開啟轉發功能:vi /etc/sysctl.conf net.ipv4.ipforward = 1
sysctl -p
2.防火牆:iptables -t nat -A PREROUTING -d 192.168.1.100 -p tcp --dport 8889 -j DNAT --to-destination 192.168.1.200:8999(-p 這里認為服務是tcp協議的)
>192.168.1.200
iptables -t nat -A POSTROUTING -s 192.168.1.200 -p tcp --sport 8889 -j SNAT --to-source 192.168.1.100:8999(認為是tcp協議,回包埠回為8999)
操作答系統使用centos6.3
另外使用反向代理也可實現
Ⅳ linux iptables 做埠轉發怎麼做 網上教程查看了好多 怎麼也做不成功
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -I FORWARD -p tcp --dport 22 -j ACCEPT
iptables -t nat -I PREROUTING -p tcp --dport 7777 -j DNAT --to B伺服器IP:22
iptables -t nat -I POSTROUTING -p tcp --dport 22 -j MASQUERADE
Ⅵ Linux埠轉發(iptables)
當伺服器遷移,因為DNS未同步或某些人使用ip訪問,一些流量還是會流向老的伺服器。
使用iptables及其偽裝特性,將所有流量轉發到老的伺服器。 點擊看iptables的介紹 。
本文假設沒有運行的iptables,至少沒有針對prerouting鏈和postrouting鏈的NAT表的轉發規則。
1) 首先開啟埠轉發
# echo "1" > /proc/sys/net/ipv4/ip_forward
或sysctl net.ipv4.ip_forward=1
2) 增加埠轉發
將埠1111上的流量轉發到主機2.2.2.2 上的埠1111。
# iptables -t nat -A PREROUTING -p tcp --dport 1111 -j DNAT --to-destination 2.2.2.2:1111
然後告訴IPtables偽裝起來(masquerade)
# iptables -t nat -A POSTROUTING -j MASQUERADE
僅僅重定向一個固定網路甚至是一台主機的流量
# iptables -t nat -A PREROUTING -s 192.168.1.1 -p tcp --dport 1111 -j DNAT --to-destination 2.2.2.2:1111
僅僅重定向一個網段的流量
# iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 1111 -j DNAT --to-destination 2.2.2.2:1111
這就可以進行Linux埠轉發流量了。
查看轉發規則 sudo iptables -t nat -nL
1) docker bridge模式
2) 安全方面,同主機上埠指定網卡ip上的流量轉發
3) 埠轉發到另外的伺服器,見上邊案例
4) snat場景
5) dnat場景,內網訪問外網
https://www.debuntu.org/how-to-redirecting-network-traffic-to-a-new-ip-using-iptables/