iptables做TCP/UDP端口轉發【轉】


開啟路由轉發功能

[root@test3domian]# echo 1 > /proc/sys/net/ipv4/ip_forward

1、打開包轉發功能:

echo “1” > /proc/sys/net/ipv4/ip_forward

2、修改/etc/sysctl.conf文件,讓包轉發功能在系統啟動時自動生效:

#. Controls IP packet forwarding

net.ipv4.ip_forward = 1

3、打開iptables的NAT功能:

/sbin/iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

說明:上面的語句中eth0是連接外網或者連接Internet的網卡. 執行下面的命令,保存iptables的規則: service iptables save

4、查看路由表:

netstat -rn 或 route -n

5、查看iptables規則:

iptables -L
————————————————
版權聲明:本文為CSDN博主「KK博客」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/weixin_43101391/article/details/82953051

 

ssh 也能實現本機的端口轉發,只不過原來的 1 條連接會變成 3 條。詳情見前一篇 ssh 端口轉發博文。而 iptables 的端口轉發則是在內核進行。

1、將本地的端口轉發到本機端口


將本機的 7777 端口轉發到 6666 端口。

iptables -t nat -A PREROUTING -p tcp --dport 7777 -j REDIRECT --to-port 6666

1.242 機器上將 7777 端口轉發到 6666,並偵聽 6666 端口。

 

1.237 機器上連接 1.242 的 7777 端口,雖然 1.242 的 7777 端口並未被偵聽,但是被轉發給了處於偵聽狀態的 6666 端口。

 

 

 

 

 1.237 上查看連接信息

 

 

 

 

1.242 上查看連接信息

 

 

 

 

 注意 1.242 查查看到的連接信息中,本端端口是轉發之后的端口 6666,而不是 7777.

刪除該端口轉發:

查看當前iptables 的 nat 表的所有規則:(不用 -t 指定表名默認的是指 filter 表)

iptables -t nat -nL --line

刪除指定表的指定鏈上的規則, -D 並指定序號即可。

iptables -t nat -D PREROUTING 1

*說明:PREROUTING鏈修改的是從外部連接過來時的轉發,如果本機連接到本機的轉發,需要修改 OUTPUT鏈。

iptables -t nat -A OUTPUT -p tcp --dport 7777 -j REDIRECT --to-port 6666

2、將本機的端口轉發到其他機器


通過 1.168 的 6666 端口訪問 1.8 的 7777 端口,在 1.168 上設置:

sysctl -w net.ipv4.ip_forward=1
iptables -t nat -A PREROUTING -p tcp --dport 6666 -j DNAT --to-destination 192.168.1.8:7777
iptables -t nat -A POSTROUTING -p tcp -d 192.168.1.8 --dport 7777 -j SNAT --to-source 192.168.1.168

 

 

 

 


 3138 端口從后邊的抓包結果中獲取。

 分別在 1.168 上抓包和 1.8 上抓包:tcpdump -i virbr0 port 6666 or 7777 -w result.cap.

-i 選項指定網卡,-w 選項保存結果到文件當中。抓包的結果使用 Wireshark 查看如下。

1.168 的抓包結果:

 

 

 

 

可以看到 168 收到的包被轉發。因為轉發發生在內核,在 1.168 轉發機上,使用 ss 看不到任何與 1.6 即 1.8 的連接。

 

 

 

 

 1.8 機器上,看到的就是正常的和 1.168 建立連接並傳送數據,1.8 並不知道 1.168 僅僅是轉發而已。

3、將一台公網 ip 主機的端口轉發到另一台公網 ip 主機

 我有兩台AWS主機,一台位於倫敦,一台位於俄勒岡。紅色為對應主機的公網 ip. 黑色為私網ip. 將 London 主機的 8016 端口轉發到 Oregon 的 8017 端口。

 

 

 

 

在 London 主機上操作:

iptables -t nat -A PREROUTING -p tcp --dport 8016 -j DNAT --to-destination 18.222.236.211:8017
iptables -t nat -A POSTROUTING -p tcp -d 18.222.236.211 --dport 8017 -j SNAT --to-source 10.53.1.49
 在 London 主機上抓包:

 

注意:這里關鍵的地方在於 SNAT 之后的 source 地址只能是內網地址,不能 London 主機的公網地址。

如果配成了 London 主機的公網地址,抓包結果如下,轉發不會成功。

 

雖然通過公網 ip 連接主機,但實際上在主機上抓包顯示,數據包的目的地址都是主機的私網地址。DNAT 修改了數據包的目的地址,SNAT修改了數據包的源地址,一旦源地址被修改為本機的公網地址,該數據包將會被丟棄。
————————————————

iptables轉發UDP

最近海拔在某個項目實踐過程中需要用到UDP端口轉發,比如我需要用A服務器做為中轉UDP服務器,用戶訪問A服務網的UDP端口時候轉發至后端B服務器對應的UDP端口。

經過在網上查找,發現實現此功能多種方案,比如haproxy、nginx都可以實現,但由於我不想在安裝其他的軟件,就想着利用系統本身的功能來實現相關轉發。經過查詢資料和測試海拔發現了一個更為簡單的方案——iptables。

請注意:此方案基於iptables,一般centos6自帶iptables,centos7需要自行安裝iptables。

一般情況下我們是用iptables轉發(TCP)代碼經常使用如下代碼(頭條代碼顯示不完善,湊活着看吧):

iptables -t nat -A PREROUTING -d 10.10.10.1 -p tcp --dport 100 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -A POSTROUTING -d 192.168.1.1 -p tcp --dport 80 -j SNAT --to 10.10.10.1

iptables -A FORWARD -o eth0 -d 192.168.1.1 -p tcp --dport 80 -j ACCEPT

iptables -A FORWARD -i eth0 -s 192.168.1.1 -p tcp --sport 80 -j ACCEPT

 

海拔按照一般思維將上述代碼中的TCP修改為UDP發現轉發失敗,經過在網上繼續查找相關資料,終於測試成功。

代碼如下(10.10.10.1 代表本機IP, 192.168.1.1 代表目的地IP):

iptables -t nat -A PREROUTING -d 10.10.10.1 -p udp --dport 100 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -A POSTROUTING -s 192.168.1.1 -p udp --dport 80 -j SNAT --to-source 10.10.10.1:100

iptables -A FORWARD -o eth0 -d 192.168.1.1 -p udp --dport 80 -j ACCEPT

iptables -A FORWARD -i eth0 -s 192.168.1.1 -p udp --sport 80 -j ACCEPT

iptables -t nat -A PREROUTING -d 10.10.10.1 -p tcp --dport 100 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -A POSTROUTING -s 192.168.1.1 -p tcp --dport 80 -j SNAT --to-source 10.10.10.1:100

iptables -A FORWARD -o eth0 -d 192.168.1.1 -p tcp --dport 80 -j ACCEPT

iptables -A FORWARD -i eth0 -s 192.168.1.1 -p tcp --sport 80 -j ACCEPT

 

將上述代碼復制,然后在ssh鏈接工具里粘貼執行即可。如果需要永久生效,記得用 iptables save 保存規則。

當然刪除規則也很簡單只需要執行以下代碼:

iptables -t nat -D PREROUTING -d 10.10.10.1 -p udp --dport 100 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -D POSTROUTING -s 192.168.1.1 -p udp --dport 80 -j SNAT --to-source 10.10.10.1:100

iptables -D FORWARD -o eth0 -d 192.168.1.1 -p udp --dport 80 -j ACCEPT

iptables -D FORWARD -i eth0 -s 192.168.1.1 -p udp --sport 80 -j ACCEPT

iptables -t nat -D PREROUTING -d 10.10.10.1 -p tcp --dport 100 -j DNAT --to-destination 192.168.1.1:80

iptables -t nat -D POSTROUTING -s 192.168.1.1 -p tcp --dport 80 -j SNAT --to-source 10.10.10.1:100

iptables -D FORWARD -o eth0 -d 192.168.1.1 -p tcp --dport 80 -j ACCEPT

iptables -D FORWARD -i eth0 -s 192.168.1.1 -p tcp --sport 80 -j ACCEPT

 

利用iptables做端口轉發

  • 在做內網滲透的時候,用iptables 做轉發感覺還是挺香的,不用再上工具啥的了。
 
#server-A 1.1.1.1
#server-B 2.2.2.2 #在server-A執行命令 iptables -t nat -A PREROUTING -p tcp -m tcp --dport 999 -j DNAT --to-destination 1.1.1.1:80 iptables -t nat -A POSTROUTING -d 1.1.1.1 -p tcp -m tcp --dport 80 -j SNAT --to-source 2.2.2.2 service iptables save iptables -t nat -nL #查看是否添加 #本地訪問 server-A:999 可以成功訪問到 server-B:80 訪問 http://1.1.1.107:999 獲取到 http://2.2.2.2:80 的內容

iptables 筆記

#PREROUTING:數據包進入本機,進入路由器之前。可以用於目標地址轉換(DNAT)。 #POSTROUTIONG 通過路由表后,發送到網卡接口之前。可以用於轉發數據(SNAT,MASQUERADE) iptables -F #清除預設表filter中的所有規則鏈的規則。 iptables -X #清除預設表filter中使用者自定鏈中的規則。 iptables –Z #數據包計數器歸零。 iptables -L INPUT --line-numbers #獲取要刪除的規則在哪行 iptables -D INPUT 行數 service iptables save #如果需要永久生效,則要保存.寫入到/etc/sysconfig/iptables文件里. #寫入后記得把防火牆重起一下,才能起作用。(手寫文件的情況) 

踩坑

  • CentOS 7默認沒有了iptables文件。
  • 要自己手動 yum install iptables-services #systemctl status iptables 查看失敗的話

參考文檔

https://www.cnblogs.com/shijiaqi1066/p/3812510.html

 

需求很簡單,把本地81端口映射到8080端口上

1. 所有的81請求轉發到了8080上.

如果需要本機也可以訪問,則需要配置OUTPUT鏈:

原因:外網訪問需要經過PREROUTING鏈,但是localhost不經過該鏈,因此需要用OUTPUT,或者POSTROUTING。POSTROUTING不行,需要看看。

 

Linux開啟路由轉發功能

標記一下,今天想讓一台Red Hat Enterprise Linux 7開通iptables的nat轉發功能,找了半天。

A服務器:192.168.30.20/24

B服務器:192.168.30.1/24,eth0;  192.168.40.1/24,eth1

C服務器:192.168.40.20/24

目標:讓A可以ping和ssh到c機器。這就需要通過B服務器來跳轉。

操作過程:

1、在B服務器上開啟內核路由轉發參數

臨時生效:

echo "1" > /proc/sys/net/ipv4/ip_forward

永久生效的話,需要修改sysctl.conf:

net.ipv4.ip_forward = 1

執行sysctl -p馬上生效

2、B服務器開啟iptables nat轉發

iptables  -t nat  -A POSTROUTING  -s 192.168.30.0/24 -d 192.168.40.0/24 -o eth1 -j  MASQUERADE

# 配置源地址30網段,目標地址40網段的地址轉換,從eth1網卡出。

iptables -t nat -A POSTROUTING -s 192.168.40.0/24  -d 192.168.30.0/24 -o eth0 -j MASQUERADE

#配置源地址40網段,目標地址30網段的地址轉換,從eth0網卡出。

永久保存:iptables-save > /etc/sysconfig/iptables

TIP:注意對應網卡。

3、在A和C服務器上設置路由為B服務器IP

A:  route add -net 192.168.40.0 netmask 255.255.255.0 gw 192.168.30.1

C: route add -net 192.168.30.0 netmask 255.255.255.0 gw 192.168.40.1

 

轉自

版權聲明:本文為CSDN博主「zhouguoqionghai」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/zhouguoqionghai/article/details/81947603

如何利用iptables讓端口映射快速實現?好用的方法推薦-oray貝銳科技花生殼官網
https://hsk.oray.com/news/6446.html 

利用iptables做端口轉發 - 0xdd - 博客園
https://www.cnblogs.com/0xdd/p/13178149.html

iptables端口轉發命令 – 運維生存時間
http://www.ttlsa.com/linux/iptables-port-redirect/

Linux開啟路由轉發功能_服務器應用_Linux公社-Linux系統門戶網站
https://www.linuxidc.com/Linux/2016-12/138661.htm

 


免責聲明!

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



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