iptables作port mapping的問題

這個版面主要討論 debian 在 server 端的應用問題, server 種類繁多..舉凡 Web Server 、 File Server、 DHCP Server..等等。

版主: 阿信

iptables作port mapping的問題

文章palmpilote » 週二 2月 10, 2004 2:36 am

我的網路架構適用一台機器裝兩張網卡做NAT
eth0對外連adsl(我的是giga的,所以ip固定,是203.204.129.24,然後有用twbbs的轉址)
eth1對內
然後web server是192.168.2.29
mail server是192.168.2.37
我的iptables的設定是:
代碼: 選擇全部
#!/bin/bash

# The interface that connect Internet
  EXTIF="ppp0"

#the inside interface. if you don't have this one
# and you must let this be black ex> INIF=""
  INIF="eth1"
  INNET="192.168.2.0/24"        # This is for NAT's network

#clean all rules
  /sbin/iptables -F
  /sbin/iptables -X
  /sbin/iptables -Z
  /sbin/iptables -F -t nat
  /sbin/iptables -X -t nat
  /sbin/iptables -Z -t nat
  /sbin/iptables -P INPUT   DROP
  /sbin/iptables -P OUTPUT  ACCEPT
  /sbin/iptables -P FORWARD ACCEPT
  /sbin/iptables -t nat -P PREROUTING  ACCEPT
  /sbin/iptables -t nat -P POSTROUTING ACCEPT
  /sbin/iptables -t nat -P OUTPUT      ACCEPT

#Setup trusted net
  /sbin/iptables -A INPUT -i lo   -j ACCEPT
  if [ "$INIF" != "" ]; then
        /sbin/iptables -A INPUT -i $INIF -j ACCEPT
        echo "1" > /proc/sys/net/ipv4/ip_forward
        /sbin/iptables -t nat -A POSTROUTING -s $INNET -o $EXTIF -j MASQUERADE
  fi

# ICMP
  /sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  AICMP="0 3 3/4 4 11 12 14 16 18"
  for tyicmp in $AICMP
  do
        /sbin/iptables -A INPUT -i $EXTIF -p icmp --icmp-type $tyicmp -j ACCEPT
  done

#DNAT
/sbin/iptables -t nat -A PREROUTING -p TCP -i ppp0  -d 203.204.129.24 --dport 80 -j DNAT --to-destination 192.168.2.29:80
/sbin/iptables -t nat -A PREROUTING -p TCP -i ppp0 -d 203.204.129.24 --dport 25 -j DNAT --to 192.168.2.37:25

LAN的連外沒有問題
mail server無論是收發信都正常
但是web的部份就有問題了
從外面連進來web是正常的
但是我從內部的機器輸入203.204.129.24或是palmpilote.twbbs.org或192.168.2.1都會出現拒絕的對話框
(如果是直接輸入192.168.2.29是正常的)
請問這問題是出在那裡?該怎麼改?
我個人是推測從lan過去的request並沒有被轉到192.168.2.29,而是被誤認為要直接連線到192.168.2.1,所以就失敗了,但是我知道該怎麼改比較好
試了一整個晚上還是搞不定,所以想請大家幫個忙
謝謝
圖檔
看啥?沒看過貓有五條腿的嗎?
http://palmpilote.twbbs.org
個人blog啟動
頭像
palmpilote
快樂的大學生
快樂的大學生
 
文章: 524
註冊時間: 週四 10月 17, 2002 4:01 pm
來自: 笨呆星球

Re: iptables作port mapping的問題

文章Tetralet » 週二 2月 10, 2004 9:27 am

palmpilote 寫:
代碼: 選擇全部
#DNAT
/sbin/iptables -t nat -A PREROUTING -p TCP -i ppp0  -d 203.204.129.24 --dport 80 -j DNAT --to-destination 192.168.2.29:80

我從內部的機器輸入203.204.129.24或是palmpilote.twbbs.org或192.168.2.1都會出現拒絕的對話框
(如果是直接輸入192.168.2.29是正常的)


我猜是因為您的 iptables 的設定只針對從 ppp0 介面進來的封包做 DNAT,
所以從內部,eth0 及 eth1 來的封包才會無法丟到 192.168.2.29 去。
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:iptables作port mapping的問題

文章palmpilote » 週二 2月 10, 2004 10:40 am

但是我加上
代碼: 選擇全部
/sbin/iptables -t nat -A PREROUTING -i eth1 -s $INNET -p TCP -d 203.204.129.24 --dport 80 -j DNAT --to 192.168.2.29:80

也沒有效果阿
現在問題是我該用那一個參數?
REDIRECT只能改port阿
圖檔
看啥?沒看過貓有五條腿的嗎?
http://palmpilote.twbbs.org
個人blog啟動
頭像
palmpilote
快樂的大學生
快樂的大學生
 
文章: 524
註冊時間: 週四 10月 17, 2002 4:01 pm
來自: 笨呆星球

re:iptables作port mapping的問題

文章evillon » 週二 2月 10, 2004 12:46 pm

如果把這裡
代碼: 選擇全部
#DNAT
/sbin/iptables -t nat -A PREROUTING -p TCP -i ppp0  -d 203.204.129.24 --dport 80 -j DNAT --to-destination 192.168.2.29:80


改成這樣子ㄋ?
代碼: 選擇全部
/sbin/iptables -t nat -A PREROUTING -p TCP -i ppp0 --dport 80 -j DNAT --to-destination 192.168.2.29:80
頭像
evillon
可愛的小學生
可愛的小學生
 
文章: 38
註冊時間: 週日 9月 07, 2003 3:42 pm
來自: CYUT

re:iptables作port mapping的問題

文章palmpilote » 週二 2月 10, 2004 3:10 pm

還是不行...
唉...真是搞弄不懂阿
圖檔
看啥?沒看過貓有五條腿的嗎?
http://palmpilote.twbbs.org
個人blog啟動
頭像
palmpilote
快樂的大學生
快樂的大學生
 
文章: 524
註冊時間: 週四 10月 17, 2002 4:01 pm
來自: 笨呆星球

re:iptables作port mapping的問題

文章Tetralet » 週二 2月 10, 2004 5:03 pm

請在您原始的 Script 的最後再加:
代碼: 選擇全部
/sbin/iptables -t nat -A PREROUTING -s $INNET -p TCP -d 203.204.129.24 --dport 80 -j DNAT --to 192.168.2.29:80

/sbin/iptables -t nat -A POSTROUTING -s $INNET -p TCP -d 192.168.2.29 --dport 80 -j MASQUERADE

試試看是否可行?
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:iptables作port mapping的問題

文章palmpilote » 週二 2月 10, 2004 5:14 pm

行了
原來要這樣作阿
不過我不太能明白最後一句的敘述原理
能否請Tetralet兄說明一下
非常感謝
圖檔
看啥?沒看過貓有五條腿的嗎?
http://palmpilote.twbbs.org
個人blog啟動
頭像
palmpilote
快樂的大學生
快樂的大學生
 
文章: 524
註冊時間: 週四 10月 17, 2002 4:01 pm
來自: 笨呆星球

re:iptables作port mapping的問題

文章Tetralet » 週二 2月 10, 2004 8:54 pm

我手邊沒有可供測試的機器,
所以有點擔心會不會出什麼差錯說...

能夠成功實在太好了!


我試著說明如下:

[Client] 的電腦如果想和 [Gateway] 的 HTTP 連線時,
[Client] 會丟出一個 SYN 封包給 [Gateway],
[Gateway] 收到這個封包後,(依據 Port Mapping 規則)會轉往 [HTTPServer] 丟,
而 [HTTPServer] 收到這個封包後,會回應給 [Client] 一個 [SYN+ACK] 封包。

看出問題所在了嗎?

[Client] 在等的是 [Gateway] 的 [SYN+ACK] 封包,
但是收到的卻是 [HTTPServer] 的 [SYN+ACK] 封包,
[Client] 對這個封包當然是置之不理,所以就無法正確建立連線了。


而我所提出的做法是在 [Gateway] 收到 [Client] 的 [SYN] 封包後,
再進行一次封包偽裝,把這個 [SYN] 封包來源改成 [Gateway],
那麼 [HTTPServer] 收到這個 [SYN] 封包後,會回應 [SYN+ACK] 封包給 [Gateway],
然後 [Gateway] 再把這個收到的 [SYN+ACK] 封包解偽裝後,丟回給 [Client]...

如此就可以正確得建立 TCP 連線了。
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:iptables作port mapping的問題

文章Tetralet » 週二 2月 10, 2004 8:57 pm

對了,忘了說,
我的解法似乎並不是正規的解決方案!

我想,
較正規的做法應該是要建立『內、外』的 DNS Server,
經由 DNS Server 來統一控管 HTTP Server 的 IP 位址似乎是比較好的...

還是版上的各位先進有其它的看法呢?
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm

re:iptables作port mapping的問題

文章palmpilote » 週二 2月 10, 2004 9:32 pm

原來如此,真是有趣的解法
這樣我就明白到底是為什麼了
但是這樣作有缺點嗎?
是會加重gateway的負擔?還是怕有可能外面的封包為裝成裡面的而進行攻擊?
不過內外分開的dns可行嗎?
因為我除了web外,還有另一台機器負責mail
以後還可能增加一臺來run ftp
但是dns server似乎並不能夠對於特定的服務(或是說port)來分辨該連線到那一台主機吧
還是說我的觀念錯誤,dns server也可以做到呢?
圖檔
看啥?沒看過貓有五條腿的嗎?
http://palmpilote.twbbs.org
個人blog啟動
頭像
palmpilote
快樂的大學生
快樂的大學生
 
文章: 524
註冊時間: 週四 10月 17, 2002 4:01 pm
來自: 笨呆星球

re:iptables作port mapping的問題

文章Tetralet » 週三 2月 11, 2004 9:04 am

palmpilote 寫:原來如此,真是有趣的解法
這樣我就明白到底是為什麼了


這不像是正規解法,
卻似是腦力激盪了。

palmpilote 寫:但是這樣作有缺點嗎?
是會加重gateway的負擔?還是怕有可能外面的封包為裝成裡面的而進行攻擊?


這樣的確會增加 Gateway 無謂的負擔,
也會增加網路不必要的流量。

並且,因為封包經過了偽裝,
對 [HTTPServer] 而言,所有區域網路的封包感覺上像都是來自 [Gateway],
這對於安全控管會造成困擾。

還有,Port Mapping 是一對一的,
一台 [Iptables] 只能對應到一台 [HTTPServer],
感覺上彈性不夠好。

palmpilote 寫:不過內外分開的dns可行嗎?


我所說的『內、外』DNS Server,
是指這一台 DNS Server 在回應 WWW 的位址時,
如果是來自 Internet,它會回應 203.204.129.24,
而如果是來自區域網路的,它會回應 192.168.2.29。

請以『view』這個關鍵字找找 bind 的相關文件。

palmpilote 寫:因為我除了web外,還有另一台機器負責mail
以後還可能增加一臺來run ftp
但是dns server似乎並不能夠對於特定的服務(或是說port)來分辨該連線到那一台主機吧
還是說我的觀念錯誤,dns server也可以做到呢?

DNS Server 只負責 FQDN 和 IP 的對應,
所以使用多個 A 記錄,如:www、mail、ftp... 來對應各個 Server,
配合 view 的話我想在實作上應該是沒有太大的問題的。
時間並不能治療我心中的疼痛
南方的春天說什麼也溫暖不了我冰冷的血

誦唱大復活咒文,今天的 Tetralet 又在唧唧喳喳了 重生!
Tetralet
俺是博士
俺是博士
 
文章: 3078
註冊時間: 週四 11月 28, 2002 3:02 pm


回到 debian server

誰在線上

正在瀏覽這個版面的使用者:沒有註冊會員 和 1 位訪客