andyj
鑽研的研究生
註冊時間: 2002-10-17
文章: 535
來自: 地球遙遠的那一方
|
發表於: 星期四 一月 13, 2005 4:08 pm 文章主題: NAT 問題~~
|
|
|
以下我的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 " 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 " Flushing 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
鑽研的研究生
註冊時間: 2002-10-17
文章: 535
來自: 地球遙遠的那一方
|
發表於: 星期一 一月 17, 2005 6:00 pm 文章主題:
|
|
|
我在想事先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
鑽研的研究生
註冊時間: 2002-10-17
文章: 535
來自: 地球遙遠的那一方
|
發表於: 星期一 一月 17, 2005 6:41 pm 文章主題:
|
|
|
奇怪我怎麼看都看到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?
|
|
回頂端
|
|
|
JadeRabbit
鑽研的研究生
註冊時間: 2002-02-27
文章: 800
來自: 台北縣板橋市
|
發表於: 星期一 一月 17, 2005 7:29 pm 文章主題:
|
|
|
您需要了解 packets 什麼時候會走 INPUT chain 何時會走 FORWARD chain ?
這樣就知道錯在那裡了喔..^^
|
|
回頂端
|
|
|

<noscript />
|
|
|
dark
鑽研的研究生
註冊時間: 2002-09-10
文章: 678
來自: 父母
|
發表於: 星期一 一月 17, 2005 8:56 pm 文章主題:
|
|
|
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
鑽研的研究生
註冊時間: 2002-10-17
文章: 535
來自: 地球遙遠的那一方
|
發表於: 星期一 一月 17, 2005 11:24 pm 文章主題:
|
|
|
JadeRabbit 寫到:
|
您需要了解 packets 什麼時候會走 INPUT chain 何時會走 FORWARD chain ?
這樣就知道錯在那裡了喔..^^
|
那就是說要先INPUT後Filter完Forward?
那要如何改呢?
|
|
回頂端
|
|
|
kenduest
酷!學園 學長們
註冊時間: 2005-01-12
文章: 1260
來自: Say Ya (telnet://bbs.sayya.org)
|
發表於: 星期一 一月 17, 2005 11:32 pm 文章主題:
|
|
|
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。
-
|
|
回頂端
|
|
|

<noscript />
|
|
|
andyj
鑽研的研究生
註冊時間: 2002-10-17
文章: 535
來自: 地球遙遠的那一方
|
發表於: 星期一 一月 17, 2005 11:35 pm 文章主題:
|
|
|
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
酷!學園 學長們
註冊時間: 2005-01-12
文章: 1260
來自: Say Ya (telnet://bbs.sayya.org)
|
發表於: 星期一 一月 17, 2005 11:45 pm 文章主題:
|
|
|
andyj 寫到:
|
那就代表Forwatd那行要往前搬就對了?先讓他跑nat才filter.......?
可是我那個forward已經在最前面了阿~
|
就您的 iptables-save 內容來看,PREROUTING 那行語法看起來應該是沒錯。不過那個 mac 過濾應該先拿掉一下吧,確認不是該行導致的問題。
再來是您的問題就是 rule 又臭又長,我的建議就是您還是把有的沒有的 rule 清除掉吧,包含把 default policy 改成 ACCEPT,那結果一定是很好測試可不可行。都可以了,改成上面 rule 不行表示您的過濾 rule 阻擋了封包所以無法成功。
-
|
|
回頂端
|
|
|

<noscript />
|
|
|
andyj
鑽研的研究生
註冊時間: 2002-10-17
文章: 535
來自: 地球遙遠的那一方
|
發表於: 星期二 一月 18, 2005 5:54 pm 文章主題:
|
|
|
kenduest 寫到:
|
andyj 寫到:
|
那就代表Forwatd那行要往前搬就對了?先讓他跑nat才filter.......?
可是我那個forward已經在最前面了阿~
|
就您的 iptables-save 內容來看,PREROUTING 那行語法看起來應該是沒錯。不過那個 mac 過濾應該先拿掉一下吧,確認不是該行導致的問題。
再來是您的問題就是 rule 又臭又長,我的建議就是您還是把有的沒有的 rule 清除掉吧,包含把 default policy 改成 ACCEPT,那結果一定是很好測試可不可行。都可以了,改成上面 rule 不行表示您的過濾 rule 阻擋了封包所以無法成功。
-
|
原來我的Rule又臭又長
我還想說這以經很短了說
且還蠻安全的
起碼是全關後開,且針對我所需要的IP連線所建立的~
|
|
回頂端
|
|
|
netman
酷!學園 學長們
註冊時間: 2002-06-12
文章: 10618
來自: 台南市
|
發表於: 星期三 一月 19, 2005 12:26 am 文章主題:
|
|
|
長的 rule 不是不好, 若設得好, 可增加安全性.
但也同時會有如下副作用:
1) 效率低
2) 耗資源
3) 除錯難
4) 易犯設計錯誤
我想, kenduest 兄是建議留意 3,4 兩點啦, 別多心~~~
_________________
甲: Linux? 我夠曉啦~~~
乙: 你又曉?!
甲: 哼! 唔通我寫過 kernel 又話俾你知咩?!
|
|
回頂端
|
|
|

<noscript />
|
|
|
andyj
鑽研的研究生
註冊時間: 2002-10-17
文章: 535
來自: 地球遙遠的那一方
|
發表於: 星期三 一月 19, 2005 10:00 am 文章主題:
|
|
|
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 " 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 " Flushing 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"
|
|
回頂端
|
|