作者 主題: NAT 問題~~  (閱讀 18685 次)

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

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
NAT 問題~~
« 於: 2005-01-13 16:08 »
以下我的firewall.sh設定檔
無法外連內192.168.3.252:3389
煩請賜教~

代碼: [選擇]
[root@MyServer root]# vi /usr/sbin/firewall
#!/bin/sh
NAT=1
NATSRC="192.168.3.0/24"
EXTIF="eth0"
INTIF="eth1"
BADIPS="12.34.56.78 123.100.200.0/24"
TCP_PORTALLOWED="20 21 22 25 53 80 110 3306 10000"
UDP_PORTALLOWED="53"
ICMPALLOWED="0 3 8 11"
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc

echo -n "Initiating iptables..."
iptables -t filter -F
iptables -t nat -F
iptables -t filter -X
iptables -t nat -X
echo "ok"
if [ "$NAT" = "1" ]; then
        echo -n "Setting NAT..."
        echo "1" > /proc/sys/net/ipv4/ip_forward
        modprobe ip_nat_ftp
        iptables -t nat -A POSTROUTING -o $EXTIF -s $NATSRC -j MASQUERADE
        echo "ok"
fi
echo -n "Setting rules..."
for ip in $BADIPS ; do
iptables -A INPUT -i $EXTIF -s $ip -j DROP
done
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
#iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
#iptables -A OUTPUT -p udp -m state --state NEW --dport 53 -j ACCEPT
#iptables -A OUTPUT -m owner ! --uid-owner 0 -j DROP
iptables -N other
for type in $ICMPALLOWED ; do
        iptables -A other -p icmp -m state --state NEW --icmp-type $type -j ACCEPT
done
for port in $TCP_ALLOWED ; do
        iptables -A other -p tcp --dport $port --syn -m state --state NEW -i $EXTIF -j ACCEPT
done
for port in $UDP_PORTALLOWED ; do
        iptables -A other -p udp --dport $port -m state --state NEW -i $EXTIF -j ACCEPT
done

#iptables -t nat -A PREROUTING -d 220.229.37.48 -p tcp --dport 3389 -j DNAT --to 192.168.3.252:3389
#iptables -t nat -A PREROUTING -p tcp --dport 3389 -i eth0 -j DNAT --to 192.168.3.252:3389
#iptables -t nat -A PREROUTING -p tcp -i eth1 -d 220.229.37.48 --dport 3389 -j DNAT --to 192.168.3.252:3389
#iptables -t nat -A PREROUTING -p tcp -i eth0 --dport 3389 -j DNAT --to 192.168.3.252
#iptables -t nat -A PREROUTING -p tcp --dport 3389 -i eth0 -j DNAT --to 192.168.3.252
iptables -A INPUT -p tcp -i $EXTIF --dport 20 -j ACCEPT
iptables -A INPUT -p tcp -i $EXTIF --dport 21 -j ACCEPT
iptables -A INPUT -p tcp -s 220.228.54.189 -i $EXTIF --dport 22 -j ACCEPT
iptables -A INPUT -p tcp -i $EXTIF --dport 25 -j ACCEPT
iptables -A INPUT -p tcp -i $EXTIF --dport 53 -j ACCEPT
iptables -A INPUT -p tcp -i $EXTIF --dport 80 -j ACCEPT
iptables -A INPUT -p tcp -i $EXTIF --dport 110 -j ACCEPT
iptables -A INPUT -p tcp -s 220.228.54.189 -i $EXTIF --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp -i $EXTIF --dport 3389 -j ACCEPT
iptables -t nat -A PREROUTING -d 220.229.37.48 -p tcp --dport 3389 -j DNAT --to 192.168.3.252:3389
iptables -A INPUT -p tcp -s 220.228.54.189 -i $EXTIF --dport 10000 -j ACCEPT

iptables -A other -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A other -m state --state NEW,INVALID -i $EXTIF -j DROP
iptables -A other -m state --state NEW -i ! $EXTIF -j ACCEPT
iptables -A INPUT -j other
iptables -A OUTPUT -j other
iptables -A FORWARD -j other
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
iptables -t nat -I PREROUTING -m mac --mac-source 00:00:00:00:00:00 -j DROP
echo "ok"
if [ "$1" = "start" ]; then exit ;fi
        echo -e "\n TEST MODE"
        echo -n "ALL chains will be cleand after 7 sec."
        i=1;while [ "$i" -le "7" ]; do
        echo -n "."
        i=`expr $i + 1`
        sleep 1
done
echo -en "\nFlushing ruleset..."
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT
iptables -t filter -F
iptables -t nat -F
iptables -t filter -X
iptables -t nat -X
echo "ok"

以下為iptables-save
代碼: [選擇]

[root@MyServer root]# iptables-save
# Generated by iptables-save v1.2.7a on Thu Jan 13 15:49:06 2005
*nat
:PREROUTING ACCEPT [10522:674050]
:POSTROUTING ACCEPT [7392:468700]
:OUTPUT ACCEPT [7412:469704]
-A PREROUTING -m mac --mac-source 00:00:00:00:00:00 -j DROP
-A PREROUTING -d 220.229.37.48 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.3.252:3389
-A POSTROUTING -s 192.168.3.0/255.255.255.0 -o eth0 -j MASQUERADE
COMMIT
# Completed on Thu Jan 13 15:49:06 2005
# Generated by iptables-save v1.2.7a on Thu Jan 13 15:49:06 2005
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT DROP [0:0]
:other - [0:0]
-A INPUT -s 12.34.56.78 -i eth0 -j DROP
-A INPUT -s 123.100.200.0/255.255.255.0 -i eth0 -j DROP
-A INPUT -i lo -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 20 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 21 -j ACCEPT
-A INPUT -s 220.228.54.189 -i eth0 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 25 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 53 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 80 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 110 -j ACCEPT
-A INPUT -s 220.228.54.189 -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
-A INPUT -i eth0 -p tcp -m tcp --dport 3389 -j ACCEPT
-A INPUT -s 220.228.54.189 -i eth0 -p tcp -m tcp --dport 10000 -j ACCEPT
-A INPUT -j other
-A FORWARD -j other
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -j other
-A other -p icmp -m state --state NEW -m icmp --icmp-type 0 -j ACCEPT
-A other -p icmp -m state --state NEW -m icmp --icmp-type 3 -j ACCEPT
-A other -p icmp -m state --state NEW -m icmp --icmp-type 8 -j ACCEPT
-A other -p icmp -m state --state NEW -m icmp --icmp-type 11 -j ACCEPT
-A other -i eth0 -p udp -m udp --dport 53 -m state --state NEW -j ACCEPT
-A other -m state --state RELATED,ESTABLISHED -j ACCEPT
-A other -i eth0 -m state --state INVALID,NEW -j DROP
-A other -i ! eth0 -m state --state NEW -j ACCEPT
COMMIT
# Completed on Thu Jan 13 15:49:06 2005

以下為iptables -t nat -L
代碼: [選擇]

[root@MyServer root]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination        
DROP       all  --  anywhere             anywhere           MAC 00:00:00:00:00:00
DNAT       tcp  --  anywhere             adsl-220-229-37-48.NH.sparqnet.nettcp dpt:3389 to:192.168.3.252:3389

Chain POSTROUTING (policy ACCEPT)
target     prot opt source               destination        
MASQUERADE  all  --  192.168.3.0/24       anywhere          

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
NAT 問題~~
« 回覆 #1 於: 2005-01-17 18:00 »
我在想事先Forward還事先Accept?
而且Forward好像沒作用
只有ACCEPT的功能....

[root@MyServer /]# iptables -L
代碼: [選擇]

Chain INPUT (policy DROP)
target     prot opt source               destination        
DROP       all  --  12.34.56.78          anywhere          
DROP       all  --  123.100.200.0/24     anywhere          
ACCEPT     all  --  anywhere             anywhere          
DROP       tcp  --  anywhere             anywhere           tcp flags:!SYN,RST,ACK/SYN state NEW
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:ftp-data
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:ftp
ACCEPT     tcp  --  LL-220-228-54-189.LL.sparqnet.net  anywhere           tcp dpt:ssh
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:smtp
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:domain
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:pop3
ACCEPT     tcp  --  LL-220-228-54-189.LL.sparqnet.net  anywhere           tcp dpt:mysql
ACCEPT     tcp  --  anywhere             anywhere           tcp dpt:3389
ACCEPT     tcp  --  LL-220-228-54-189.LL.sparqnet.net  anywhere           tcp dpt:10000
other      all  --  anywhere             anywhere          

Chain FORWARD (policy DROP)
target     prot opt source               destination        
other      all  --  anywhere             anywhere          

Chain OUTPUT (policy DROP)
target     prot opt source               destination        
ACCEPT     all  --  anywhere             anywhere          
ACCEPT     udp  --  anywhere             anywhere           state NEW udp dpt:domain
DROP       all  --  anywhere             anywhere           OWNER UID match !root
other      all  --  anywhere             anywhere          

Chain other (3 references)
target     prot opt source               destination        
ACCEPT     icmp --  anywhere             anywhere           state NEW icmp echo-reply
ACCEPT     icmp --  anywhere             anywhere           state NEW icmp destination-unreachable
ACCEPT     icmp --  anywhere             anywhere           state NEW icmp echo-request
ACCEPT     icmp --  anywhere             anywhere           state NEW icmp time-exceeded
ACCEPT     udp  --  anywhere             anywhere           udp dpt:domain state NEW
ACCEPT     all  --  anywhere             anywhere           state RELATED,ESTABLISHED
DROP       all  --  anywhere             anywhere           state INVALID,NEW
ACCEPT     all  --  anywhere             anywhere           state NEW

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
NAT 問題~~
« 回覆 #2 於: 2005-01-17 18:41 »
奇怪我怎麼看都看到iptables-save
-A PREROUTING -d 220.229.37.48 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.3.252:3389
有開啟轉送
-A INPUT -i eth0 -p tcp -m tcp --dport 3389 -j ACCEPT
有接受
難道是缺個POSTROUTING?

jade-rabbit

  • 鑽研的研究生
  • *****
  • 文章數: 833
  • 性別: 男
    • 檢視個人資料
NAT 問題~~
« 回覆 #3 於: 2005-01-17 19:29 »
您需要了解 packets 什麼時候會走 INPUT chain 何時會走 FORWARD chain ?
這樣就知道錯在那裡了喔..^^
--(中也者天下之大本也,和也者天下之達道也)--

dark

  • 俺是博士!
  • *****
  • 文章數: 1581
    • 檢視個人資料
NAT 問題~~
« 回覆 #4 於: 2005-01-17 20:56 »
引述: "andyj"
奇怪我怎麼看都看到iptables-save
-A PREROUTING -d 220.229.37.48 -p tcp -m tcp --dport 3389 -j DNAT --to-destination 192.168.3.252:3389
有開啟轉送
-A INPUT -i eth0 -p tcp -m tcp --dport 3389 -j ACCEPT
有接受
難道是缺個POSTROUTING?

INPUT -i eth0 -p tcp -m tcp --dport 3389 -j ACCEPT
應該是多餘的
INPUT  OUTPUT 是對 SERVER

小弟沒用過 3389 , 故不知連線方式
但若是 pcanywhere , 則有 broadcast 方式呼叫同網段功能
這時若區網中有 2 台 pcanywhere
這時需要多一個
-t nat -A POSTROUTING -o $LAN_IF -j SNAT --to-source $SERV_LAN_IP

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
NAT 問題~~
« 回覆 #5 於: 2005-01-17 23:24 »
引述: "JadeRabbit"
您需要了解 packets 什麼時候會走 INPUT chain 何時會走 FORWARD chain ?
這樣就知道錯在那裡了喔..^^

那就是說要先INPUT後Filter完Forward?
那要如何改呢?

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
NAT 問題~~
« 回覆 #6 於: 2005-01-17 23:32 »
引述: "andyj"
引述: "JadeRabbit"
您需要了解 packets 什麼時候會走 INPUT chain 何時會走 FORWARD chain ?
這樣就知道錯在那裡了喔..^^

那就是說要先INPUT後Filter完Forward?
那要如何改呢?


忽略 mangle table 的 chain 部分的話,nat 環境封包通過一般為 PREROUTING(nat) --> FORWARD (filter) --> POSTROUTING(nat)。

所以您的 DNAT 不會有機會走到 filter table 裡面的 INPUT chain。

-
I am kenduest - 小州

my website: http://kenduest.sayya.org/

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
NAT 問題~~
« 回覆 #7 於: 2005-01-17 23:35 »
引述: "kenduest"
引述: "andyj"
引述: "JadeRabbit"
您需要了解 packets 什麼時候會走 INPUT chain 何時會走 FORWARD chain ?
這樣就知道錯在那裡了喔..^^

那就是說要先INPUT後Filter完Forward?
那要如何改呢?


忽略 mangle table 的 chain 部分的話,nat 環境封包通過一般為 PREROUTING(nat) --> FORWARD (filter) --> POSTROUTING(nat)。

所以您的 DNAT 不會有機會走到 filter table 裡面的 INPUT chain。

-

那就代表Forwatd那行要往前搬就對了?先讓他跑nat才filter.......?
可是我那個forward已經在最前面了阿~

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
NAT 問題~~
« 回覆 #8 於: 2005-01-17 23:45 »
引述: "andyj"

那就代表Forwatd那行要往前搬就對了?先讓他跑nat才filter.......?
可是我那個forward已經在最前面了阿~


就您的 iptables-save 內容來看,PREROUTING 那行語法看起來應該是沒錯。不過那個 mac 過濾應該先拿掉一下吧,確認不是該行導致的問題。

再來是您的問題就是 rule 又臭又長,我的建議就是您還是把有的沒有的 rule 清除掉吧,包含把 default policy 改成 ACCEPT,那結果一定是很好測試可不可行。都可以了,改成上面 rule 不行表示您的過濾 rule 阻擋了封包所以無法成功。

-
I am kenduest - 小州

my website: http://kenduest.sayya.org/

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
NAT 問題~~
« 回覆 #9 於: 2005-01-18 17:54 »
引述: "kenduest"
引述: "andyj"

那就代表Forwatd那行要往前搬就對了?先讓他跑nat才filter.......?
可是我那個forward已經在最前面了阿~


就您的 iptables-save 內容來看,PREROUTING 那行語法看起來應該是沒錯。不過那個 mac 過濾應該先拿掉一下吧,確認不是該行導致的問題。

再來是您的問題就是 rule 又臭又長,我的建議就是您還是把有的沒有的 rule 清除掉吧,包含把 default policy 改成 ACCEPT,那結果一定是很好測試可不可行。都可以了,改成上面 rule 不行表示您的過濾 rule 阻擋了封包所以無法成功。

-

原來我的Rule又臭又長
我還想說這以經很短了說
且還蠻安全的
起碼是全關後開,且針對我所需要的IP連線所建立的~

netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
NAT 問題~~
« 回覆 #10 於: 2005-01-19 00:26 »
長的 rule 不是不好, 若設得好, 可增加安全性.
但也同時會有如下副作用:
1) 效率低
2) 耗資源
3) 除錯難
4) 易犯設計錯誤
我想, kenduest 兄是建議留意 3,4 兩點啦, 別多心~~~

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
NAT 問題~~
« 回覆 #11 於: 2005-01-19 10:00 »
引述: "netman"
長的 rule 不是不好, 若設得好, 可增加安全性.
但也同時會有如下副作用:
1) 效率低
2) 耗資源
3) 除錯難
4) 易犯設計錯誤
我想, kenduest 兄是建議留意 3,4 兩點啦, 別多心~~~

沒啦...沒有多心拉
想麻煩人家本該謙虛點....只是剛好心情有點......我該沉著點
回歸正題
我將firewall rule做個註解,好讓學長們較好幫我除錯
    #!/bin/sh
    #######################################基礎環境設定#######################################
    #是否啟動NAT,"NAT=1"為啟動,"NAT=0"為不啟動
    NAT=1

    #啟動NAT時,私有IP範圍
    NATSRC="192.168.3.0/24"

    #對外連線網卡
    EXTIF="eth0"

    #對內連線網卡
    INTIF="eth1"

    #禁止連線IP
    BADIPS="12.34.56.78 123.100.200.0/24"

    #允許連線的TCP Port
    TCP_PORTALLOWED="20 21 22 25 53 80 110 3306 3389 10000"

    #與許連線的UDP Port
    UDP_PORTALLOWED="53"

    #與許使用的ICMP類型
    ICMPALLOWED="0 3 8 11"

    #載入想關的核心模組
    modprobe ip_tables
    modprobe ip_conntrack
    modprobe ip_conntrack_ftp
    modprobe ip_conntrack_irc

    #清除目前iptables所有table的規則
    echo -n "Initiating iptables..."
    iptables -t filter -F
    iptables -t nat -F
    iptables -t filter -X
    iptables -t nat -X
    echo "ok"

    #NAT
    if [ "$NAT" = "1" ]; then
            echo -n "Setting NAT..."
            echo "1" > /proc/sys/net/ipv4/ip_forward
            modprobe ip_nat_ftp
            iptables -t nat -A POSTROUTING -o $EXTIF -s $NATSRC -j MASQUERADE
            echo "ok"
    fi

    #Firewall rule
    echo -n "Setting rules..."

    阻擋特定ip的連線
    for ip in $BADIPS ; do
            iptables -A INPUT -i $EXTIF -s $ip -j DROP
    done

    #允許流經lookback介面的封包進出
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT

    #設定所有新連線都必須以SYN開始,可藉此阻擋port scan 軟體
    iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP

    #允許對外查詢DNS
    iptables -A OUTPUT -p udp -m state --state NEW --dport 53 -j ACCEPT

    #不允許非root帳號的封包連線到外部網路
    #iptables -A OUTPUT -m owner ! --uid-owner 0 -j DROP

    #自訂一個新鏈other,來處理剩餘的封包
    iptables -N other

    #與許特定的ICMP類型封包進出
    for type in $ICMPALLOWED ; do
            iptables -A other -p icmp -m state --state NEW --icmp-type $type -j ACCEPT
    done

    #允許由Internet(eth0)網卡介面進來,特定目的的port的新TCP連線
    for port in $TCP_ALLOWED ; do
            iptables -A other -p tcp --dport $port --syn -m state --state NEW -i $EXTIF -j ACCEPT
    done

    #允許由Internet(eth0)網卡介面進來,特定目的的port的新UDP連線
    for port in $UDP_PORTALLOWED ; do
            iptables -A other -p udp --dport $port -m state --state NEW -i $EXTIF -j ACCEPT
    done

    #允許已建立的連線和回應的封包通過
    iptables -A INPUT -p tcp -i $EXTIF --dport 20 -j ACCEPT
    iptables -A INPUT -p tcp -i $EXTIF --dport 21 -j ACCEPT
    iptables -A INPUT -p tcp -s 220.228.54.189 -i $EXTIF --dport 22 -j ACCEPT
    iptables -A INPUT -p tcp -i $EXTIF --dport 25 -j ACCEPT
    iptables -A INPUT -p tcp -i $EXTIF --dport 53 -j ACCEPT
    iptables -A INPUT -p tcp -i $EXTIF --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp -i $EXTIF --dport 110 -j ACCEPT
    iptables -A INPUT -p tcp -s 220.228.54.189 -i $EXTIF --dport 3306 -j ACCEPT
    iptables -A INPUT -p tcp -i $EXTIF --dport 3389 -j ACCEPT
    iptables -A PREROUTING -t nat -p tcp -d 220.229.37.48 --dport 3389 -j DNAT --to 192.168.3.252:3389
    iptables -A INPUT -p tcp -s 220.228.54.189 -i $EXTIF --dport 10000 -j ACCEPT
    iptables -A other -m state --state ESTABLISHED,RELATED -j ACCEPT

    #由Internet介面網卡進來的其餘新連線及非法連線均丟棄
    iptables -A other -m state --state NEW,INVALID -i $EXTIF -j DROP

    #至於不是由Internet網路介面卡進來的其餘新連線均允許通過
    iptables -A other -m state --state NEW -i ! $EXTIF -j ACCEPT

    #設定INPUT OUTPUT FORWARD表格其餘的封包均交給other處理
    iptables -A INPUT -j other
    iptables -A OUTPUT -j other
    iptables -A FORWARD -j other

    #設定INPUT OUTPUT FORWARD練愈設的過慮原則
    iptables -P INPUT DROP
    iptables -P OUTPUT DROP
    iptables -P FORWARD DROP

    #網卡mac address符合的電腦禁止上網
    #iptables -t nat -I PREROUTING -m mac --mac-source 00:00:00:00:00:00 -j DROP

    #如果啟動參數沒有加上start者七秒後清除iptables的規則,避免遠端操作者將自己阻擋在防火牆外
    echo "Done"
    if [ "$1" = "start" ]; then exit ;fi
            echo -e "\n TEST MODE"
            echo -n "ALL chains will be cleand after 7 sec."
            i=1;while [ "$i" -le "7" ]; do
            echo -n "."
            i=`expr $i + 1`
            sleep 1
    done
    echo -en "\nFlushing ruleset..."
    iptables -P INPUT ACCEPT
    iptables -P OUTPUT ACCEPT
    iptables -P FORWARD ACCEPT
    iptables -t filter -F
    iptables -t nat -F
    iptables -t filter -X
    iptables -t nat -X
    echo "ok"


netman

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 17465
    • 檢視個人資料
    • http://www.study-area.org
NAT 問題~~
« 回覆 #12 於: 2005-01-19 14:05 »
前面 kenduest 兄有教了你一些測試方法了呢, 是否先參考看看?

要不, 若你用 redhat/fedora 的話, 試試我的 example (僅參考用):
代碼: [選擇]
#!/bin/bash

# example for nat

IPT=/sbin/iptables
MODP=/sbin/modprobe
EXT_IF=eth1
EXT_IP=1.2.3.4
INT_IF=eth0
INT_IP=192.168.1.254
INT_NET=192.168.1.0/24

#-- loading modules --#
$MODP ip_conntrack_ftp
$MODP ip_nat_ftp

#-- enable ip_forward --#
echo "1" > /proc/sys/net/ipv4/ip_forward

#-- flush rules --#
$IPT -F
$IPT -t nat -F
$IPT -t mangle -F

#-- set policy --#
$IPT -P INPUT ACCEPT
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat PREROUTING ACCEPT
$IPT -t nat POSTROUTING ACCEPT
$IPT -t nat OUTPUT ACCEPT
$IPT -t mangle PREROUTING ACCEPT
$IPT -t mangle OUTPUT ACCEPT

#-- set input rules --#
$IPT -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
$IPT -A INPUT -i lo -j ACCEPT
#$IPT -A INPUT -i $EXT_IF -p ICMP --icmp-type 8 -j DROP
$IPT -A INPUT -p ICMP -j ACCEPT
$IPT -A INPUT -i $INT_IF -p tcp --dport 22 -d $INT_IP -s 192.168.1.5 -j ACCEPT
$IPT -A INPUT -j DROP

#-- set nat rules --#
$IPT -t nat -A POSTROUTING -o $EXT_IF -s $INT_NET -j MASQUERADE
$IPT -t nat -A PREROUTING -i $EXT_IF -d $EXT_IP -p tcp --dport 80 -j DNAT --to 1
92.168.1.4
$IPT -t nat -A PREROUTING -i $EXT_IF -d $EXT_IP -p tcp --dport 22 -s 4.3.2.1 -j
DNAT --to 192.168.1.5
$IPT -t nat -A PREROUTING -i $EXT_IF -d $EXT_IP -p udp --dport 53 -j DNAT --to 1
92.168.1.6

jade-rabbit

  • 鑽研的研究生
  • *****
  • 文章數: 833
  • 性別: 男
    • 檢視個人資料
NAT 問題~~
« 回覆 #13 於: 2005-01-19 20:05 »
您還沒找出來阿,給您點 Hint:

從外面連線要往其他 NIC forwarding packets 不通阿..

為什麼不通,去找找本酷學園討論區文章有一個 kernel packets traveling diagram 把它看懂^^
--(中也者天下之大本也,和也者天下之達道也)--

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
NAT 問題~~
« 回覆 #14 於: 2005-01-20 09:28 »
您說的應該是http://www.docum.org/docum.org/kptd/這張圖吧
那是流程沒錯...
因為原來的那個是看書的範例做的
不過我想我應該一步一步來將自己的防火牆自己設計

1.環境基本設定
2.清除所有tables
3.關閉所有port
4.開啟特定的port
5.forward
6.阻擋ddos及port scan
3,4,5,6順序何為優先?

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
NAT 問題~~
« 回覆 #15 於: 2005-01-21 11:26 »
回Netman的話
kenduest兄教的方式確實可行....但把rule都拿掉豈不危險
[quota=Netman]#-- set policy --#
$IPT -P INPUT ACCEPT
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat PREROUTING ACCEPT
$IPT -t nat POSTROUTING ACCEPT
$IPT -t nat OUTPUT ACCEPT
$IPT -t mangle PREROUTING ACCEPT
$IPT -t mangle OUTPUT ACCEPT
[/quota]
$IPT -P INPUT ACCEPT這個好像打了兩次
且policy為全開後關?這樣豈不危險?
如果改為這樣呢?
1.先全關
###-----------------------------------------------------###
# 設定 filter table 的預設政策(預設全部丟棄)
###-----------------------------------------------------###
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
2.打開特定的port
iptables -A INPUT -p tcp -i $EXTIF --dport 20 -j ACCEPT
iptables -A INPUT -p tcp -i $EXTIF --dport 21 -j ACCEPT
這樣是否安全點?

kenduest

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3675
    • 檢視個人資料
    • http://kenduest.sayya.org
NAT 問題~~
« 回覆 #16 於: 2005-01-21 15:03 »
引述: "andyj"
回Netman的話
kenduest兄教的方式確實可行....但把rule都拿掉豈不危險
[quota=Netman]#-- set policy --#
$IPT -P INPUT ACCEPT
$IPT -P INPUT ACCEPT
$IPT -P OUTPUT ACCEPT
$IPT -t nat PREROUTING ACCEPT
$IPT -t nat POSTROUTING ACCEPT
$IPT -t nat OUTPUT ACCEPT
$IPT -t mangle PREROUTING ACCEPT
$IPT -t mangle OUTPUT ACCEPT
[/quota]
$IPT -P INPUT ACCEPT這個好像打了兩次
且policy為全開後關?這樣豈不危險?
如果改為這樣呢?
1.先全關
###-----------------------------------------------------###
# 設定 filter table 的預設政策(預設全部丟棄)
###-----------------------------------------------------###
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
2.打開特定的port
iptables -A INPUT -p tcp -i $EXTIF --dport 20 -j ACCEPT
iptables -A INPUT -p tcp -i $EXTIF --dport 21 -j ACCEPT
這樣是否安全點?


是非常非常的安全,但是你網路也掛了,因為都不通 :(

您說把 POLICY 改成 ACCEPT 您當初要的設定就通,那您有沒有思考過因為就是您把 POLICY 改成 DROP 後,還有一堆細節沒有處理好,所以才導致最終結果沒有達成所預期的呢?

OUTPUT chain 基本上是沒有必要設定為 DROP 的,因為那是找自己麻煩,自己主機對外連線預設都是封死的。連自己連自己 loop back 都連不通,還有對外要查詢 dns 也是不通。除非你確定你要做的事情,否則一般來說沒必要弄成這樣子。

再來就是,我想您打算要把 POLICY 設定為 DROP 時,那您應該就得了解所謂 TCP/IP 雙向連線溝通的做法,否則您怎樣設定網路還是不會通的。

我前面說您的 rule 有長厄長,所以那是讓除錯非常不利的情況。所以建議您要把規則簡化後再說,因為一個關卡錯誤其他就會有問題。

希望 firewall 設定是對外開放某些 port,然後最後封死,做法有...

預設 POLICY 為 ACCEPT 做法會像是:

代碼: [選擇]

modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp

iptables -P INPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -m state --state NEW -j DROP


預設 POLICY 為 DROP 做法會像是:

代碼: [選擇]

modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp

iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT


您的問題在於您只是把 INPUT chain 設定為 DROP,但是沒有考慮過若是您要對外連線時,對方回應丟回來的封包會因為您的 INPUT chains 是 DROP 而讓封包無法傳入。

所以 -m state --state ESTABLISHED 扮演很重要繳色,那就是允許連線出去後對方主機回應進來的封包。

你打算把 OUTPUT 的 POLICY 設定為 DROP,若你沒考慮剛剛說的雙向問題,那網路不通一點都沒錯。

再者,您也忽略了 FTP protocol 的傳輸架構,因為 FTP 本身有兩個通道在傳輸資料。一個為 command channel,另外一個是 data channel。其中 data channel 是動態於 command channel 溝通後才建立的,而該 data channel 的 port 是動態建立來傳輸後續要上傳與下載檔案的內容資料。您這樣的架構設定沒有考慮該情況,那另外一個 connection 傳輸是不通的。

更何況所謂 ftp 傳輸資料在 data channel 上,還細分 passive 與 active mode 兩種傳輸,您也沒有注意這兩個差異性質,那 firewall rule 常看到這樣設定的結果也是有問題的。像是:

代碼: [選擇]

iptables -P INPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state NEW -j DROP


或者是

代碼: [選擇]

iptables -P INPUT DROP
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT


這個方式來看其實一般網路連線存取是正常,但是 ftp 連線若是使用 active mode 的傳輸方式就會掛掉,因為到時候 ftp client 與 ftp server 溝通時,其 ftp server 會連到 ftp client 指定某個 > 1023 編號 的 port 把資料傳入,因為該 port 沒有允許連入,所以資料會無法送進來。這也是為何前面規則內我會補上 --state RELATED 的規則允許關係。因為 RELATED 是偵測另外一個 NEW CONNECTION,比方向是於ftp 這類傳輸另外建立的通道有關係的項目。

代碼: [選擇]
modprobe ip_conntrack
modprobe ip_conntrack_ftp

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

netman 在 study-area 文章部分也已經討論過這問題很多次了,若您打算要深入了解一點,請先去看一下 netman 之前花時間寫的文章吧。

個人的建議是,若是您學習 iptables 的 firewall rule,您有打算希望預設為 DROP 然後一一開放,或者是一一開放後最後 DROP 無法連線,您都需要知道 tcp/ip 是雙向溝通的原則,並且還需要熟悉 iptables 在 state 狀態比對的語法使用,這樣才能夠達成所需要的最終結果。

題外話的就是,很多網路文章看到,有人說預設開啟 FORWARD 是危險的,所以要改成這樣:

代碼: [選擇]
iptables -P FORWARD DROP
iptables -A FORWARD  -s 192.168.1.0/24 -j ACCEPT


就是只有允許內部 192.168.1.0/24 開放 FORWARD 封包轉送。不過為何實際內部網段還是無法出去?若是您有思考過雙向問題時,應該就知道問題點在那邊。所以您的原本問題也許就是在這邊 ?因為您的轉送進來流程會是:

PREROUTING --> FORWARD --> ...

很多人是說 POLICY 設定為 DROP 然後一一開放是非常安全這點我非常認同,但是前提是您要能夠掌握住整個架構設定,否則 firewall 結果可能讓網路還是處於不通的狀態,那就真的傷腦筋了。

--
I am kenduest - 小州

my website: http://kenduest.sayya.org/

andyj

  • 鑽研的研究生
  • *****
  • 文章數: 957
    • 檢視個人資料
NAT 問題~~
« 回覆 #17 於: 2005-01-24 09:50 »
原來事情不是傻子所想的這麼簡單
看完學長用心的回覆文章
感到心寒呀~
嘻嘻嘻~我就是把自己關在外面的那個人
看樣子我應該先用學長的範例
然後要好好用新的學習iptables
最後才考慮把實際自己需要的放上去
而不是一昧的堅持阿.