鳥哥的 Linux ADSL 私房菜


使用 iptables 設定使用 NAT 分享網路頻寬
使用 iptables 設定一些安全防護功能 (1)
使用 iptables 設定一些安全防護功能 (2)
使用 iptables 設定一些安全防護功能 (3)
Eric 的心得補充


[文件]使用 iptables 設定使用 NAT 分享網路頻寬
作者: kenduest (小州) 站內: LinuxNetwork
標題: [文件]使用 iptables 設定使用 NAT 分享網路頻寬
時間: Tue May 15 19:09:03 2001

Linux 上使用 IP-Masquerade 所謂的 IP 儰裝以便於達成該功能。

Linux 上的 IPMASQ 因為 kernel 一些核心功能有調整過,所以相關的設定工具
因為不同的核心版本所以不同.

kernel 2.0.x 時代,是使用 ipfwadm 程式。(這個說法不算是完全正確)

kernel 2.1.x/2.2.x 時代,則是使用 ipchains 程式

kernel 2.3.x/2.4.x 時代,使用 netfilter 過濾機制, 是使用
iptables 程式。

演進來看,目前 kernel 2.4 配合使用 netfilter 核心過濾機制,
可以達到的功能相當棒.... 那 netfilter 提供那些機制呢?
比方:

1. 傳統 ipchains 的任何功能(基本來源與目的封包過濾、導向、偽裝)
2. 提供 Source NAT 與 Destination NAT 的功能
3. 可以針對特定使用者、群組、PID 等限制網路連結的過濾存取
4. 可以設定封包在 Routing Table 進出前時先預先處理
5. 提供可以讓 UserSpace 的程式處理 filter 部分。
6. 可以針對外面自動建立、與現有連線有關這類連線過濾處理...
7. 可以針對 Mac 卡號處理。

ipmasq 的文件,那邊可以閱讀呢? linux 本身提供的 howto 很足夠了...

使用 ipfwadm/ipchains 等程式的 kernel 環境,可以參考:

http://www.linux.org.tw/CLDP/IP-Masquerade-HOWTO.html

不過該版文件中文翻譯已經太久沒有更新了,建議找原文的
IP-Masquerade-HOWTO 文件。那邊找呢?可以上這裡找找:

http://www.linuxdoc.org

裡面提到了包含 port forward 等相關重要的資訊。比方
ipmasqadm 等程式的使用。

若是您目前使用 kernel 2.3/2.4,可以參考這給篇中譯文:

http://www.linux.org.tw/CLDP/NAT-HOWTO.html

http://www.linux.org.tw/CLDP/Packet-Filtering-HOWTO.html

相同的,原文部份,上 http://www.linuxdoc.org 也有喔..

當然,若是您的 linux dist 版本是最近的,那系統安裝好的
HOWTO 文件應該也可以找到..

ok.. 若是您目前要使用 nat 功能的話,首先就是確定您的核心是支援
linux firewall 與 ip masquerade 功能... 不過目前許多 Linux
Distribution 都已經把 IP Masquerade 支援編入到 kernel 內了,
所以重編 kernel 的部份可以略過....

當然啦,目前 kernel 2.4.0 正式 release 出沒有多久,所以若是
您打算使用 netfilter 提供的一些先進的機制,那您需要先更新
核心到 2.4,編譯核心時要選擇把 netfilter 提供的一些功能打開..
(可以選擇編入核心 或者是編譯成為 module)

這裡環境,假設:

對外 internet 連結的 ip 是: 210.1.1.1
對內的部份,使用 192.168.1.1

當然,您需要兩張網路卡,一張就是設定 210.1.1.1,另外一張
就是設定 192.168.1.1 (netmask: 255.255.255.0)

另外提到,有人會說到也許可以使用 ip aliases 達到一張網路卡
就可以有兩個 ip .. 當然,這是可行的.. 不過弟不建議使用在
nat 的環境下.. 一者是因為一般 nat 多半充當 firewall,而
若是使用 ip aliases 後對外與對內的封包都跑在同一個 interface
上,那就失去封包過濾功能了... 而不同區段的封包跑在一起,網路
效能也是會變差的...

OK.. 目前要啟動 nat/ipmasq 功能的話,首先就是只要 Linux 主機把
IP Forwarding 打開 (ip 轉送),並使用 ipchains/iptables 等這類程式
設定好後,Client 端就可以透過 Linux 這台 gateway 主機的協助而上網了。

kernel 2.2.x :

echo "1" > /proc/sys/net/ipv4/ip_forward
ipchains -P forward DENY
ipchains -A forward -i eth0 -j MASQ -s 192.168.1.0/24
ipchains -M -S 86400 86400 360 <-- 這是讓 timeout 拉長一點
modprobe ip_masq_ftp <-- 掛入 ftp 等 module 處理 ftp 相關連結問題

當然,我想另外的一些 ipmasq module 一起掛入也許比較完整一點...

ip_masq_cuseeme、ip_masq_irc、ip_masq_mfw、ip_masq_pptp、
ip_masq_quake、ip_masq_raudio、ip_masq_user、ip_masq_vdolive ..

kernel 2.3.x/2.4.x :

echo "1" > /proc/sys/net/ipv4/ip_forward
modprobe ip_tables # 這是編譯核心是選擇 module 才需要
modprobe ip_nat_ftp # 同上,處理 ftp 等連結問題
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobn ip_conntrack_irc
iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j MASQUERADE

上面等使用上,請先注意各位系統目前預設每個 INPUT、OUTPUT、FORWARD CHAIN
是不是為 ACCEPT ,而不是 DROP/DENY 或者是 REJECT。

for kernel 2.2 :

ipchains -P input ACCEPT
ipchains -P output ACCEPT
ipchains -P forward ACCEPT

若是要把就有規則清除,可以補上:

ipchains -F
ipchains -X

for kernel 2.4 :

iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

若是要把就有規則清除,可以補上:

iptables -F
iptables -X
iptables -F -t nat
iptables -X -t nat

上面很單純的提供 nat/ipmasq 服務,沒有針對一些安全性考量,比方
聲稱來自內部網路的 ip 範圍,是由 eth0 這個對外 interface 進入的話那就
應該拒絕.... 比方像是位於 eth1 上 192.168.1.x 這段虛擬 ip 區段就
是一個例子。所以這裡要說的是,若是要嚴謹一點的話,額外的設定是很需要的...

另外補充的,就是 port forward 部份,kernel 2.2.x 內是使用
ipmasqadm 達成:

ipmasqadm portfw -a -P tcp -L 210.1.1.1 25 -R 192.168.1.100 25

該 ipmasqadm 敘述,提供讓 nat 對外主機,可以讓他人使用
210.1.1.1 port 25 進行 tcp 服務連結,而該連結請求會轉給內部主機
192.168.1.100 port 25 .. 簡單說,這行敘述是給有一台 mail server
是放在 nat 架構內使用虛擬 ip,然後透過 nat 主機設定 port 重導
到內部的真實主機。

若是使用 kernel 2.4 的話,iptables 指令則是:

iptables -A PREROUTING -t nat -p tcp -d 210.1.1.1 \
--dport 25 -j DNAT --to 192.168.1.100:25

當然,以前有人提到,外面使用 telnet 210.1.1.1 25 的確是可以 work,
不過內部 192.168.1.x 的電腦若是 telnet 210.1.1.1 25 就不行..
那補上下面的敘述:

iptables -A OUTPUT -t nat -p tcp -d 210.1.1.1 \
--dport 25 -j DNAT --to 192.168.1.100:25

上面說的是單一 port 重導.. 若是需要的功能是全部 port 都
重導的話,比方就是使用:

iptables -A PREROUTING -t nat -p all -d 210.1.1.1 \
-j DNAT --to 192.168.1.1

ok.. 此外幾點要說明的是:

1. 目前許多人都使用 adsl 寬頻,若是使用計時制的話要注意的是,
因為透過 pppoe 這類程式撥接後,會產生一個 ppp0 的 interface,
然後再透過一個網路卡介面作封包的傳輸,所以先前的指令有指定
eth0 的敘述要改成 ppp0 才正確....

2. 使用 nat 後,使用虛擬 ip 連上網路的電腦,一般使用上應該是
不大會有問題的... 不過若是想與 internet 上的電腦玩網路
遊戲對戰的話,可能會發生一些問題.... 因為許多 game 的網路連線
的運作方式在 nat 架構下多半無法工作.... 一般解決方式,找看看
是否有專人寫出了 ipmasq 的 module,掛入後就可以解決了...
或者是找出相關的 game 是有那些 port 的連結,然後設定好 port
forwarding 的動作即可。

關於 port forwarding 部份,這裡有個連結提供很好的資訊:

http://www.tsmservices.com/masq

許多 ap 程式、game 等等都有提供相關解決設定,不過都是針對
kernel 2.2.x 內配合使用 ipmasqadm 程式.. 若是是使用 kernel 2.4
的話,研究一下 iptables 指令的用法後,同樣也是可以完成的。

3. 有人無法使用 icq 傳檔案,甚至無法正確傳訊息?我建議更新
icq 到 2000 等版本,然後把連結設定改成在 firewall 後面
使用,那就沒有問題了...

4. 要觀察目前設定規則,請使用 iptables -L 。若是當初有使用 -t xxxx
的話,請使用 iptables -L -t xxx 。ex: iptables -L -t nat

5. 先前 netfilter 核心機制有一些 bug (Connection State,Related state
bug) 會導致一些安全性的問題,see:

http://www.tempest.com.br/advisories/01-2001.html

http://netfilter.samba.org/security-fix/

(Mandrake 8.0 , the kernel is ok )

6. 若是遇到先前使用 kernel 2.2 都可以正常連線到一些站台,但是用了
kernel 2.4 後卻不行得情況... 實際例子可能就是,可以 ping 到對方,
不過卻連不上對方主機。

echo 0 > /proc/sys/net/ipv4/tcp_ecn

see: http://www.tux.org/lkml for more information

7. 該篇文章省略設定網路卡的步驟...

大概就是這樣子了,有問題請告知,也歡迎大家討論。

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而蓋全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: 碩誠資訊 <bbs.cynix.com.tw> 



作者: kenduest (小州) 站內: LinuxNetwork
標題: [文件]使用 iptables 設定一些安全防護功能 (1)
時間: Tue Feb 27 23:55:46 2001
 

常看到有人亂使用 port scan 軟體,(ex:nmap) 來亂掃他人的 port,
實在很討厭 @_@

這裡提供幾個方式,透過 linux kernel 2.4 的新核心機制 + iptables
來進行一些設限:

# NMAP FIN/URG/PSH
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL FIN,URG,PSH -j DROP

# Xmas Tree
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL ALL -j DROP

# Another Xmas Tree
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

# Null Scan(possibly)
iptables -A INPUT -i eth0 -p tcp --tcp-flags ALL NONE -j DROP

# SYN/RST
iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,RST SYN,RST -j DROP

# SYN/FIN -- Scan(possibly)
iptables -A INPUT -i eth0 -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP

這是針對一些像是使用 scan 軟體,配合所謂的 Stealth 等機制去亂掃他人
主機時,可以把這些封包丟棄不處理。那對方一掃就卡死了,或者是
要等連線 timeout 才能夠繼續工作,拉長 scan 所需的時間。

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而蓋全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: 碩誠資訊 <bbs.cynix.com.tw> 



作者: kenduest (小州) 站內: LinuxNetwork
標題: [文件]使用 iptables 設定一些安全防護功能 (2)
時間: Wed Feb 28 00:13:17 2001
 

下面是我設定 iptables 的一些簡單規則,可以參考一下。(與 NAT 無關喔)

# 掛入相關 module
modprobe ip_tables
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc

# 重設
iptables -F
iptables -X
iptables -F -t nat
iptables -X -t mangle

# 把 FORWARD 關閉
iptables -P FORWARD DROP

# 這是打開讓自己網域可以方便連結,也就是該網域不設防

iptables -A INPUT -p all -s ip_net/netmask -j ACCEPT

# 允許相關連結服務

iptables -A INPUT -i eth0 -p tcp --dport 20 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 23 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 113 -j ACCEPT

iptables -A INPUT -i eth0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -m state --state NEW,INVALID -j DROP

上面是打開允許 port 20、21、22、23、25、53、110、113 等服務才能夠
被外面所連線。

port 20、21 : ftp 使用的。
port 22 : ssh 連線
port 23 : telnet 連線。方便使用,其實不開放比較安全。
port 25 : sendmail 使用。讓信件可以寄進來。
port 53 : dns 使用。dns 需要打開 udp 使用。
port 110 : pop3 使用
port 113 : auth 身份確認。我打開是讓一些使用該 113 確認身份的主機
不至於反查時會卡住很久。

最後一行是對於主動連線或者是不合法連線,一律通通拒絕掉。

這個 script 內容,很適用只允許外面連結特定的 port 服務,剩下的其餘
port 就拒絕外面主動建立的連線。比方使用 Modem 撥接,只希望裡面可以
正常連線出去,外面都無法連線進來這個需求。(ps: modem 是使用 ppp0
等這些介面,上面的 eth0 要改成 ppp0 )

-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而蓋全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: 碩誠資訊 <bbs.cynix.com.tw> 



作者: kenduest (小州) 站內: LinuxNetwork
標題: [文件]使用 iptables 設定一些安全防護功能 (3)
時間: Tue May 15 19:28:55 2001

防止 sync flood 攻擊的設定:

iptables -N synfoold
iptables -A synfoold -p tcp --syn -m limit --limit 1/s -j RETURN
iptables -A synfoold -p tcp -j REJECT --reject-with tcp-reset
iptables -A INPUT -p tcp -m state --state NEW -j synfoold

這個方式對於一個很忙碌的站台來說,這個設定方式會不會有不良影響呢?
測試過一個很忙碌的站台用這個設定,老實說並不好....
所以也許可以調整時間與次數的觸發值。

防止 Ping of Death :

iptables -N ping
iptables -A ping -p icmp --icmp-type echo-request -m limit --limit \
1/second -j RETURN
iptables -A ping -p icmp -j REJECT
iptables -I INPUT -p icmp --icmp-type echo-request -m state --state NEW \
-j ping

這裡只有把 icmp 的 echo request 部份拒絕掉,可以視情況再調整。

或者是直接設定主機不回應 echo request 。

/proc/sys/net/ipv4/icmp_echo_ignore_all

--
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --

現代人普遍的現象: 「小學而大遺」、「捨本而逐末」
「以偏而蓋全」、「因噎而廢食」
-- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
--
※ Origin: 碩誠資訊 <bbs.cynix.com.tw> 



Eric 的補充心得

iptables 機制是逐條檢查...
但是假設當一個封包要通過時,第一條規則已經放行通過,封包的命運已經定下來,剩餘規則就不會再檢查,就算剩餘規則中有要擋下這個封包時也無效!

例:
規則 1 : 放行所有 80 port 的封包
規則 2 : 拒絕 210.58.221.241 80 port 封包
規則 3 ........

像這樣子時,根本無法擋下 210.58.221.241 80 port 封包...
因為第 1 條規則已經先放行所有 80 port 的封包了,所以該封包早就先通過了......
正確的寫法應該將規則 1 與規則 2 互換.....