問題

Mark 和我兩個人在研究怎麼把對外的 Port 9000 轉移到內部的 Port 80 ,結果我這個 Linux 新手搞了半天還是搞不出來。

環境

我的環境是這樣的:

|-- (DMZ) --> Linux Server 1(192.168.1.1)
IP 分享器 -|
|-----------> Linux Server 2(192.168.1.2)

註:之前示意圖畫錯了,更正一下。

然後從外面來的 Port 9000 要 Forward 到 Linux Server 2 的 Port 80 。

嘗試

我們用的 IP 分享器僅支援單一 Port 對應的功能 (就是 Port 80 就只能對到 Port 80) ,所以只好把腦筋動到 Linux Server 1 上。

本來以為用 iptables 的 NAT 功能可以用,看了一下鳥哥的 iptables 教學,得到以下的方式:

# iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 9000 -j DNAT --to 192.168.1.2:80

不過加入去以後還是不行…後來 Mark 又找到一篇 iptables 入門,裡面寫了:

# iptables -t nat -A PREROUTING -i eth0 -p tcp -d 192.168.1.1 --dport 9000 -j DNAT --to-destination 192.168.1.2:80

也是沒用…真是令人洩氣…

解決方案

後來我問我的同學 (他是個 FreeBSD 強者) ,他給我一個連結: [Linux] 簡單的 port forward 工具,裡面介紹了 redir 這個小程式,似乎符合我的要求。

然而我用的 OS 是 CentOS ,要自己編譯 redir ;把 redir 的 source 抓下來後,按照以下方式編譯:

# cd /usr/local/src
# wget http://sammy.net/~sammy/hacks/redir-2.2.1.tar.gz
# tar xvzf redir-2.2.1.tar.gz
# cd redir-2.2.1
# make (沒有 install)
# mv redir /usr/local/bin/

接下來我下的指令是這樣子的:

# redir --lport 9000 --caddr=192.168.1.2 --cport=80

不過還是沒用,而且就 redir 就沒有回應了,因為 redir 主要是跑 Daemon 模式。我想如果加上 Listen 的 Address 應該就可以,所以我把指令改成:

# redir --laddr 192.168.1.1 --lport 9000 --caddr=192.168.1.2 --cport=80 &

沒想到就成功了!讓 Mark 和我著實感動了一陣子。

最後把它加到 /etc/rc.d/rc.local 裡,讓它能在開機時自動執行就完成了。

後記

雖然我有在玩 Linux ,不過很多技術還是不熟,這次 Mark 出的問題真的讓我學到了不少東西。也感謝我的強者同學,他在 Unix like 方面的知識真的幫了我不少忙。

另外, redir 真的是不錯的小工具,如果要完全靠 iptables 來處理這個問題的話,我這個新手大概弄個三天三夜也搞不定…Orz

當然,如果大家有更好的方法的話,也歡迎分享喔。