開啟路由轉發功能
[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上.
1
|
# iptables -t nat -A PREROUTING -p tcp --dport 81 -j REDIRECT --to-ports 8080
|
如果需要本機也可以訪問,則需要配置OUTPUT鏈:
1
|
iptables -t nat -A OUTPUT -p tcp --dport 81 -j REDIRECT --to-ports 8080
|
原因:外網訪問需要經過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