作者 主題: iptables nat  (閱讀 4824 次)

0 會員 與 1 訪客 正在閱讀本文。

zelda

  • 憂鬱的高中生
  • ***
  • 文章數: 92
    • 檢視個人資料
iptables nat
« 於: 2013-12-12 17:22 »
環境:centos 5.9
架構:主機本身有兩張網卡,eth0為對外網路;eth1對內(ip:192.168.0.246)
有一服務因特殊原因,開放的port在eth0有綁定IP連入,其餘用戶使用別的port連入(就是不想讓不相干的人使用)
想要將這些用戶導到eth1的port

查看文件知道要用iptables 的 DNAT
有開ip_forward
但是例子都是連內部的其它電腦,有點不一樣
所以沒有設定成功
設定的文件請參考附件

經過一番測試,有些疑問
望大大幫忙解惑
在做完PREROUTING,因為目標IP還是機器自己,這時封包是傳到eth1嗎?
比對iptables的流程
我紀錄下nat output及postrouting,結果只有output有紀錄
同一封包,不是應該都會紀錄下嗎?
這封包最後怎麼跑的,完全迷糊了

希望有做過類似設定的大大指導一下
哪裡的觀念錯了
« 上次編輯: 2013-12-17 11:19 由 damon »

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Re: iptables nat
« 回覆 #1 於: 2013-12-12 20:47 »
看不太懂你的需求呢~~

jou

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 4989
  • 性別: 男
    • 檢視個人資料
Re: iptables nat
« 回覆 #2 於: 2013-12-13 08:37 »
其實也可以用另一個敲敲門的方法達到需求。

http://www.zeroflux.org/projects/knock

只有知道敲門暗碼的人才可以連上主機。

zelda

  • 憂鬱的高中生
  • ***
  • 文章數: 92
    • 檢視個人資料
Re: iptables nat
« 回覆 #3 於: 2013-12-13 08:56 »
其實也可以用另一個敲敲門的方法達到需求。

http://www.zeroflux.org/projects/knock

只有知道敲門暗碼的人才可以連上主機。

感謝jou提供此方法,之前沒有想到
只是用戶那邊不是修改程式,就是使用前先用另一程式敲敲門
不管如何,也是個參考方法
達到目標比較重要先

zelda

  • 憂鬱的高中生
  • ***
  • 文章數: 92
    • 檢視個人資料
Re: iptables nat
« 回覆 #4 於: 2013-12-13 09:05 »
看不太懂你的需求呢~~

我的表達能力果然讓人看不懂啊

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17383
    • 檢視個人資料
    • http://www.study-area.org
Re: iptables nat
« 回覆 #5 於: 2013-12-13 13:11 »
看不太懂你的需求呢~~

我的表達能力果然讓人看不懂啊

抱歉,也可能是我理解能力不夠~~  ^_^

dark

  • 俺是博士!
  • *****
  • 文章數: 1546
    • 檢視個人資料
Re: iptables nat
« 回覆 #6 於: 2013-12-14 17:31 »
小弟也不懂 , 所以不能解你的問題

不過說一下 iptables ..

雖然各 tables 有前後順序 , 但屏除這點可想成

-> pre-route -> route table -> [本機->route table , 非本機] -> post-route
如你那張圖 , 把 mangle , nat , filter tables 不看時 ...

其中 , 箭頭 C 其實需插入 "deamon , 程式處理"
這時可以想像成 "已經拆掉了 level 4 層的標籤了" (理當還沒)
... 聆聽的 deamon 若完全信賴 iptables , 這時其實可只處理 data
在 client/server 角色中 , 這裡是終點了
此時就算沒有 nat , mangle 的 "IP  偽裝" 功能 , 在 #ip route list 中仍可看到
10.0.1.0/24 dev eth2  proto kernel  scope link  src 10.0.1.254
src 254 正是這介面綁的 IP -- linux 自己出去

以上是為沒有網路設備單純兩台電腦單純連線



非本機 .. 你可做個實驗 ..
iptables -t nat -A PREROUTING -i eth -o eth -s x.x.x.x -d ethip -j DNAT --to-destination y.y.y.y
各參數定義清楚後 , x 連向 y 保持 10 分鐘連線 (web 傳大檔或限流)
接著將 route table 改變
ip route add y.y.y.y dev eth10 via z.z.z.z
此時新的連線會去找 z.z.z.z 而無法建立 , 但已經建立的 10 分鐘連線卻沒中斷
因為 10 MIN 連線建立完成時 , 起點到終點所有要素 , 都經 iptables 宣告在記憶體裡面了
(ps:此時終點若是本機呢 ?)


-------------------------------------
1.1.1.1:80 , 1.1.1.1:8080 = linux
111.1.1.1 = 遠端 client1
222.1.1.1 = 遠端 client2
192.168.1.1:80 = 內部 web

client1 可連 1.1.1.1:80
client2 連 1.1.1.1:80 會變成連 1.1.1.1:8080
其餘 client 連 1.1.1.1:80 都變成連 192.168.1.1:80

iptables -t nat -A PREROUTING -s 222.1.1.1 -d 1.1.1.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 1.1.1.1:8080
iptables -t nat -A PREROUTING -s ! 111.1.1.1 -p tcp -m tcp --dport 80 -j DNAT --to-destination 192.168.1.1:80

iptables -A INPUT -s 111.1.1.1 -p tcp -m tcp --dport 80 -j ACCEPT



zelda

  • 憂鬱的高中生
  • ***
  • 文章數: 92
    • 檢視個人資料
Re: iptables nat
« 回覆 #7 於: 2013-12-31 16:53 »
總算試出大概了
最大的問題應該是出在我想轉送udp的封包吧
我在NAT主機下有各別試過tcp及udp的port轉送
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j REDIRECT --to-port 1122
這語法沒什麼問題,tcp封包可以正常轉送
iptables -t nat -A PREROUTING -i eth0 -p udp --dport 8080 -j REDIRECT --to-port 1133
但是這條指令下達之後,在傳送只見用戶端收到icmp type 3 code3的回應
改成
iptables -t nat -A PREROUTING -i eth0 -p udp -m udp--dport 8080 -j REDIRECT --to-port 1133
立即可轉送成功
而且改回上一條指令還是可以通
重開機也一樣
實在不了問題出在哪
請問有哪位大大可以解釋其中的差別嗎?

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5384
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: iptables nat
« 回覆 #8 於: 2013-12-31 17:01 »
沒有差別吧. 應該有別的原因才對.
代碼: [選擇]
fw1:~# iptables -t nat -A PREROUTING -i eth0 -p udp --dport 18080 -j REDIRECT --to-port 18081
fw1:~# iptables-save | grep 18080
-A PREROUTING -i eth0 -p udp -m udp --dport 18080 -j REDIRECT --to-ports 18081
指令沒有 -m udp, iptables 會幫你加上去才對. 就最後的 iptables-save 內容來看, 兩者是一樣的.

zelda

  • 憂鬱的高中生
  • ***
  • 文章數: 92
    • 檢視個人資料
Re: iptables nat
« 回覆 #9 於: 2014-01-02 10:16 »
沒有差別吧. 應該有別的原因才對.
代碼: [選擇]
fw1:~# iptables -t nat -A PREROUTING -i eth0 -p udp --dport 18080 -j REDIRECT --to-port 18081
fw1:~# iptables-save | grep 18080
-A PREROUTING -i eth0 -p udp -m udp --dport 18080 -j REDIRECT --to-ports 18081
指令沒有 -m udp, iptables 會幫你加上去才對. 就最後的 iptables-save 內容來看, 兩者是一樣的.
就是這樣我才覺得奇怪
會是我直接是拿iptables-save存的檔案來修改的原因嗎?
再試試看

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5384
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
Re: iptables nat
« 回覆 #10 於: 2014-01-02 12:51 »
client 有 icmp type 3 的錯誤? 那是不是表示不單純只用 udp, 也會用到 icmp?
改了能通, 或許是在 netfilter restart 的過程中, 有關閉過 iptables, 造成 icmp 能通, 所以後續用 udp 就通了? (我猜的....)

dark

  • 俺是博士!
  • *****
  • 文章數: 1546
    • 檢視個人資料
Re: iptables nat
« 回覆 #11 於: 2014-01-03 23:48 »
icmp type 3 恐怕是 iptables 已經放行
但下一跳 iptables 真的到不了

這時無論 tcp / udp , 最後這台 linux 因為下一跳丟不到
理當都會回 icmp

若你的網路複雜 , 又未必能及時找出問題
或許可以裡面目的地 18081 那台持續 ping 向外部
讓一路上的設備的 arp mac table 永遠存在資料