茫茫網海中的冷日
         
茫茫網海中的冷日
發生過的事,不可能遺忘,只是想不起來而已!
 恭喜您是本站第 1671884 位訪客!  登入  | 註冊
主選單

Google 自訂搜尋

Goole 廣告

隨機相片
PIMG_00074.jpg

授權條款

使用者登入
使用者名稱:

密碼:


忘了密碼?

現在就註冊!

小企鵝開談 : [分享]一張網卡 bind 兩個不同網段的 IP

發表者 討論內容
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]iptables ─ 功能看齊 enterprise 防火牆
kernel 已更新至 2.4.x 就有很多人知了,但隨著 kernel 改變而要更新的軟件就有很多不為人知,這個 iptables 即為其中一個。kernel 2.4 已經推出這麼久,但仍然有人問︰為甚麼我的 ipchains 不能使用?皆因 Rusty Russell 等人(ipchains,即 kernel 2.2.x 所用的防火牆工具﹐也是他的傑作!)覺得 ipchains 仍未完善,於是決定在 kernel 2.3.15 時開始重寫,希望在 kernel 2.4 推出時有一個功能更強的 firewall 出現。他們的心血就是今期要介紹的 iptables 了。

這個 iptables 的前身稱為 netfilter,作者仍未搞清楚為何突然會改名,但新名稱約是在 kernel 2.3.99 時出現的。在本章末後的 URL 也可看到點端倪。

話又說回來,憑甚麼說它的功能強大呢?這要由 stateless firewall 這名詞說起了。

所謂 stateless firewall,乃是存在於普遍的 router 中,會對每個 packet 分別加以檢查,再決定是否讓它通過、回傳錯誤還是完全忽略。要點是 "分別" 兩個字。這裡拿 TCP 作個例子。所有 TCP connection 都是以三個 packet 開始︰一是由 client 送出一個 set 了 SYN bit 的 packet 到 server(不明白的,可當是一個特別的標籤表示 connection 開始),第二個是由 server 送出一個 set 了 SYN 和 ACK bit 的 packet 回答 client,而最後是由 client 傳回一個 set 了 ACK bit 的 packet 給 server。

問題來了。如果有人無故 send 一個有 ACK bit 的 packet,那怎分辦是故意的呢,還是一個正常的 connection 呢?stateless firewall 不能分辦這一點,於是就讓它通過了。這種技巧經常被用來 scan 網絡,因這方法可騙過很多的 firewall。

stateful firewall 和 stateless firewall 的分別就在於此了。statefull firwall 會記著每個 connection,若有任何 packet,會先看看這個 packet 是否已知的 connection 的一部份,若找過記憶中的 connection 還沒有任何資料,就可肯定這 packet 是假的,把它丟進垃圾桶裡去!當然,這是簡化了的例子,不過可向大家解釋個大概了。

它還有甚麼好處呢?以往的 ipchains 只用一個 binary,要加入其它功能十分艱難,需要直接修改源程式碼所有有關的地方並再編譯一次 ipchains 才行;但現在 iptables 使用 modules 的架構,所有外加的功能只要寫一個 module 就行,可發展的功能不限於只修改主要的 source code 才可實現,連發展速度也順帶加快了。

沒了?等等,筆者還未說完呢;iptables 能限制 connection 的速率 ── 這個對於防止長期轟炸造成的系統資源完全用盡的情況很有效。最後一點和剛才筆者提及的甚麼 SYN、ACK bit 等有關,統稱 TCP flag。ipchains 只能檢查數種可能的 flag 的其中一種,於是其它不正常的 packet 甚至某些正常的 packet 都可肆無忌憚地通過。現在 iptables 可檢查任何這類的 packet,使得許多的 scanning 無所遁形。

唔……好像在說教似的,到現在還是在講理論。不過,筆者會假設讀者對 IP、TCP、connection 等等有點概念,否則整本書也放不下呢!而且暫時只會簡簡單單地講解一些非常"小兒科"的設定,希望將來會有機會讓各位真正觸摸到 iptables 的威力!

安裝指示

文末 iptables 主網頁的 URL 裡有下載 iptables 的 link,很易看見。下載最新版本前(筆者所能找到的最新版本是 1.2.1a),先得弄清楚︰你的 kernel 是甚麼版本?如果不是 2.4.x,不好意思!還是用 ipchains 罷!

另外,也要清楚你的 kernel 是否預先支援了 iptables。從以下兩點可以判斷︰

1. /proc/net/ip_tables_names 是否存在?
2. /lib/modules/2.x.x/kernel/net/ipv4/netfilter/ip_tables.o 是否存在?

只要其中一個答案是肯定的,就表示可跳過以下兩段 recompile kernel 的步驟了。否則繼續看看怎樣 recompile kernel……

下載 kernel 後(截稿前最新還是 2.4.2,但做清兵的有特權下載 2.4.3-pre4),在 "Networking option" 中選上 "Network packet filtering (replaces ipchains)",之後就會多了一個 "IP: Netfilter Configuration --->" 的選項在 "TCP/IP Networking" menu 下,在那裡按 enter 即可開始選擇你想支援的防火牆功能了。個人提議裡面所有選項都是 "M" (即 module),因為這樣可不用浪費記憶體在沒有用的地方,也可減少 boot 機時間,同時也不怕某些功能會因沒有 compile 而用不到。

這時開始 compile kernel 並 reboot 及使用新的 kernel 吧。若在 compile 時或 compile 後的 depmod 步驟出問題,而且肯定出錯在有關 netfilter(iptables)的地方,隨時可以把剛才有關的 module 選回 "Y"(即內建在 kernel 裡)並重新 compile,沒問題的!(筆者試過了)

接下來就是 compile iptables 了。把 iptables-1.x.x.tar.gz 解壓後,先開啟文字編輯器看看有沒有問題或要修改的地方(例如想將所有 binary 放在 /usr/sbin 裡,便設定 BINDIR 為 /usr/sbin,如此類推)。修改完畢後,鍵入
# make all experimental


就會開始 compile……哎唷,出了 error?是不是像以下那樣?
libipulog/libipulog.c: In function `ipulog_create_handle':
libipulog/libipulog.c:142: `NETLINK_NFLOG' undeclared (first use in this function)
libipulog/libipulog.c:142: (Each undeclared identifier is reported only once
libipulog/libipulog.c:142: for each function it appears in.)
make: *** [libipulog/libipulog.o] Error 1


不緊要,再 edit 一次 Makefile,將 COPT_FLAGS 的一行由
COPT_FLAGS:=-O2 -DNDEBUG


變成
COPT_FLAGS:=-O2 -DNDEBUG -DNETLINK_NFLOG=4


再 compile 一次就行了!最後,輸入
# make install install-experimental



它就會把 iptables、iptables-save 及 iptables-restore 抄到 /usr/local/sbin 中。如果要用,就要把 /usr/local/sbin 加進你的 PATH 裡,這裡不詳細說明了。

若急不及待要試一試,好,鍵入以下一句︰
# iptables -L -v -n


是否 warn 你說甚麼不支援 iptables?這樣似乎是不知何故不能載入 kernel module,需要先用人手加入 module︰
# modprobe iptables


再 run 一次 iptables,就該看到像以下的輸出︰
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination

Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination


是嗎?那就成功了!且看看下一章,教你怎樣建立簡單的 firwall!

設定 firewall

處理 firewall rule 的選項

且不忙著設計甚麼的,先來熱熱身︰
# iptables -A INPUT -j ACCEPT


大小楷絕不可以亂!輸入這條 rule 後,用 "iptables -L -v -n" 該看到類似以下結果︰
Chain INPUT (policy ACCEPT 2939 packets, 1124863 bytes)
pkts bytes target prot opt in out source destination
1 241 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0


它表示甚麼呢?-A 是 append,它會在 INPUT、FORWARD、OUTPUT 其中一條 "chain" 裡加一條 "rule" 而這條 rule 在隨後的參數將會見到。而 -j 呢,則是定義究竟那些 packet 該怎樣處理。現在是 ACCEPT,即讓它通過。如果不想讓任何 packet 通過呢?十分簡單︰
# iptables -R INPUT 1 -j DROP


今次由 ACCEPT 變 DROP,就不會有任何 packet 可以過關了。但…… -R 又是甚麼?那是 replace 的意思,隨後的 "INPUT 1" 即 replace 了第一條 chain,即剛才 ACCEPT 那一條呀!

當然,firewall 的功用不可能是禁止任何 traffic 吧!因此讓我們先清除它︰
# iptables -D INPUT 1


-D 表示 delete,用法和上面的 -R 一樣。除了 -A、-R、-D 外還有 -I 表示 insert;-A 是逐條逐條 rule 加上去,-I 則是在整串的 rule 中間加插某一條 rule,除此之外沒有其它分別了。

最後還有 -F 表示 flush,顧名思義它會把你辛辛苦苦 set 好的 rule 都沖進馬桶裡!

有關 IP address 的選項

再多點熱身才好辦事,試試吧︰
# iptables -A INPUT -s 199.95.206.201 -j DROP


為甚麼用這個 IP 作示範?總之是個討人厭的地方吧!不要問了!一句說完,就是 block 了這一個 IP 不准它有任何 traffic 進入自己的地盤。不單是一個 IP,一個 range 的 IP 也可以︰
# iptables -A INPUT -s 10.0.0.0/8 -j DROP


如果你的 LAN 是使用 192.168.0.x 的,那當然不希望有 10.x.x.x 地址出現!因此 DROP 了這種 IP 是很正常的。

上面兩個例子是用 -s(即 source IP)的,且看看它的反面,即 -d(destination)的例子︰
# iptables -A INPUT -d 192.168.0.1 -j DROP


假設你的 IP 是 192.168.0.2 吧,那麼這條 rule 對你完全沒有影響;相反,若你的 IP 是 192.168.0.1,那任何到你的機器的 packet 都會被 DROP 了。

-s 和 -d 可以放在一起用,而且它們和 IP address 之間可以放一個嘆號(!)表示 "not" 的意思。例如︰
# iptables -P INPUT DROP
# iptables -A INPUT -s ! 192.168.0.3 -d 192.168.0.0/24 -j ACCEPT


筆者漏了 -P 未介紹,那是 default policy 的意思,即預先定義如果甚麼 rule 也不能決定 packet 的去向的時候,會預設讓它通過呢,還是預設拒諸門外,還是做其它動作。這裡預設是 DROP。好了,下一句才是筆者想講的,意思是︰如果 source 不是 192.168.0.3,而 destination 是 192.168.0.x 任何一個 IP,都會讓它通過。那即是封殺了 192.168.0.3!

在看下一節前,先清一清舊的垃圾 rules 罷︰
# iptables -F


指定 network interface 的選項

屬於這類的選項很少,和上面的一樣,只有兩個︰-i 和 -o。-i 是指明 input 的 interface,只會在 INPUT chain 時有用;相反,-o 是 output interface,只會在 output 時有用。先看看實例︰
# iptables -A INPUT -i eth1 -s 192.168.0.0/24 -d 192.168.0.0/24 -j ACCEPT


很簡單,接受所有 LAN 的 traffic 罷了。不過還加上 "-i eth1",防止 LAN 外有人刻意送入一些假的 packet,扮成是內部的 traffic。但這個其實已不需要了,因 kernel 本身已有機制可防止這種情況,輸入以下一句就行,解釋就免了。^_^
# echo '1' > /proc/sys/net/ipv4/conf/all/rp_filter


還有 -o……用一個簡單的例子吧。
# iptables -A OUTPUT -o ppp0 -d 205.138.3.22 -j REJECT


其實並不簡單。首先,-j REJECT 和 -j DROP 的相同之處都是拒絕,但 DROP 是當沒事發生,REJECT 則是送出回應說這個 packet 被 REJECT 了。另外,緊記︰-o 是和 OUTPUT chain 一起用的!至於那個 IP 嘛……總之這條 rule 可防止你的資料在不知情的情況下被送出到某間專收集全世界所有人的上網習慣等資料的公司吧!

這恐怕暫時已經夠一部份讀者們學一段時間了。至於其它早已懂得這方面知識的朋友,筆者謹此致歉!將來希望會有機會和大家探討一些較深入的設定呢!

iptables 主網址︰
http://netfilter.kernelnotes.org
http://netfilter.filewatcher.org
http://netfilter.samba.org

ipchains 網址︰
http://netfilter.kernelnotes.org/ipchains/
http://netfilter.filewatcher.org/ipchains/
http://netfilter.samba.org/ipchains/

原文出處 : 網路農夫
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]iptables經典設置
iptables經典設置

舉些例子,自己學習
iptables 使用時的樣板
在設定 iptables 的封包過濾規則時,有幾個樣板的動作,若先熟悉它們,往後就可自行套用,依此類推,很快地,您就可以進入這個天地之中。

觀察目前的設定
作法如下︰
iptables -L -n
iptablse -t nat -L -n


定義變數
FW_IP="163.26.197.8"


打開核心 forward 功能
作法如下︰

###-----------------------------------------------------###
# 打開 forward 功能
###-----------------------------------------------------###
echo "1" > /proc/sys/net/ipv4/ip_forward


清除所有的規則
一開始要先清除所有的規則,重新開始,以免舊有的規則影響新的設定。作法如下︰
###-----------------------------------------------------###
# 清除先前的?#93;定
###-----------------------------------------------------###
# 清除預?#93;表 filter 中,所有規則鏈中的規則
iptables -F
# 清除預?#93;表 filter 中,使用者自訂鏈中的規則
iptables -X

# 清除mangle表中,所有規則鏈中的規則
iptables -F -t mangle
# 清除mangle表中,使用者自訂鏈中的規則
iptables -t mangle -X

# 清除nat表中,所有規則鏈中的規則
iptables -F -t nat
# 清除nat表中,使用者自訂鏈中的規則
iptables -t nat -X


選定預設的政策
接著,要選定各個不同的規則鏈,預設的政策為何。作法如下︰

預設全部丟棄︰
###-----------------------------------------------------###
# ?#93;定 filter table 的預?#93;政策
###-----------------------------------------------------###
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP


或者預設全部接受︰
###-----------------------------------------------------###
# ?#93;定 filter table 的預?#93;政策
###-----------------------------------------------------###
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT


各個規則鏈的預設政策可獨立自主的設定,不必受其它鏈的影響。

以下練習,若目標為 DROP,則 policy 請設為 ACCEPT;若目標為 ACCEPT,則 policy 請設為 DROP,如此方可看出效果。

開放某一個介面
作法如下︰
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

注︰IPFW 或 Netfilter 的封?#93;流向,local process 不會經過 FORWARD Chain,
?#93;此 lo 只在 INPUT 及 OUTPUT 二個 chain 作用。

iptables -A INPUT -i eth1 -j ACCEPT
iptables -A OUTPUT -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -o eth1 -j ACCEPT


IP 偽裝
使內部網路的封包經過偽裝之後,使用對外的 eth0 網卡當作代表號,對外連線。作法如下︰
###-----------------------------------------------------###
# 啟動內部對外轉?#125;
###-----------------------------------------------------###

iptables -t nat -A POSTROUTING -o eth0 -s 172.16.0.0/16 -j SNAT --to-source $FW_IP


上述指令意指︰把 172.16.0.0/16 這個網段,偽裝成 $FW_IP 出去。

虛擬主機
利用轉址、轉 port 的方式,使外部網路的封包,可以到達內部網路中的伺服主機,俗稱虛擬主機。這種方式可保護伺服主機大部份的 port 不被外界存取,只開放公開服務的通道(如 Web Server port 80),因此安全性甚高。

作法如下︰
###-----------------------------------------------------###
# 啟動外部對內部轉?#125;
###-----------------------------------------------------###
# 凡對 $FW_IP:80 連線者, 則轉?#125;至 172.16.255.2:80
iptables -t nat -A PREROUTING -i eth0 -p tcp -d $FW_IP --dport 80 -j DNAT --to-destination 172.16.255.2:80


開放內部主機可以 telnet 至外部的主機
開放內部網路,可以 telnet 至外部主機。

作法如下︰(預設 policy 為 DROP)
###-----------------------------------------------------###
# open 外部主機 telnet port 23
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 23 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 23 -d $FW_IP --dport 1024:65535 -j ACCEPT


開放郵包轉遞通道
開放任意的郵件主機送信包給你的 Mail Server,而你的 Mail Server 也可以送信包過去。

作法如下︰(預設 policy 為 DROP)
###-----------------------------------------------------###
# open SMTP port 25
###-----------------------------------------------------###

# 以下是︰別人可以送信給你
iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 1024:65535 -d $FW_IP --dport 25 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 25 -d any/0 --dport 1024:65535 -j ACCEPT

# 以下是︰你可以送信給別人
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 25 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 25 -d $FW_IP --dport 1024:65525 -j ACCEPT


開放對外離線下載信件的通道
開放內部網路可以對外部網路的 POP3 server 取信件。

作法如下︰(預設 policy 為 DROP)
###-----------------------------------------------------###
# open 對外部主機的 POP3 port 110
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 110 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 110 -d $FW_IP --dport 1024:65535 -j ACCEPT


開放觀看網頁的通道
開放內部網路可以觀看外部網路的網站。

作法如下︰(預設 policy 為 DROP)
###-----------------------------------------------------###
# open 對外部主機的 HTTP port 80
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 80 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 80 -d $FW_IP --dport 1024:65535 -j ACCEPT


開放查詢外部網路的 DNS 主機
開放內部網路,可以查詢外部網路任何一台 DNS 主機。

作法如下︰(預設 policy 為 DROP)
###-----------------------------------------------------###
# open DNS port 53
###-----------------------------------------------------###

# 第一次會用 udp 封?#93;來查詢
iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 若有錯誤,會改用 tcp 封?#93;來查詢
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 53 -d $FW_IP --dport 1024:65535 -j ACCEPT

# ?#125;放這台主機上的 DNS 和外部的 DNS 主機互動查詢︰使用 udp
iptables -A OUTPUT -o eth0 -p udp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p udp -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT
# ?#125;放這台主機上的 DNS 和外部的 DNS 主機互動查詢︰使用 tcp
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 53 -d any/0 --dport 53 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! -y -s any/0 --sport 53 -d $FW_IP --dport 53 -j ACCEPT


開放內部主機可以 ssh 至外部的主機
開放內部網路,可以 ssh 至外部主機。

作法如下︰(預設 policy 為 DROP)
###-----------------------------------------------------###
# open 外部主機 ssh port 22
###-----------------------------------------------------###

iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 以下是 ssh protocol 比較不同的地方
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1020:1023 -d any/0 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 22 -d $FW_IP --dport 1020:1023 -j ACCEPT


開放內部主機可以 ftp 至外部的主機
開放內部網路,可以 ftp 至外部主機。

作法如下︰(預設 policy 為 DROP)
###-----------------------------------------------------###
# open 對外部主機 ftp port 21
###-----------------------------------------------------###

# 以下是打?#125;命令 channel 21
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 21 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 21 -d $FW_IP --dport 1024:65535 -j ACCEPT

# 以下是打?#125;資料 channel 20
iptables -A INPUT -i eth0 -p tcp -s any/0 --sport 20 -d $FW_IP --dport 1024:65535 -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp ! --syn -s $FW_IP --sport 1024:65535 -d any/0 --dport 20 -j ACCEPT

# 以下是打?#125; passive mode FTP 資料通道
iptables -A OUTPUT -o eth0 -p tcp -s $FW_IP --sport 1024:65535 -d any/0 --dport 1024:65535 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp ! --syn -s any/0 --sport 1024:65535 -d $FW_IP --dport 1024:65535 -j ACCEPT

開放 ping
可以對外 ping 任何一台主機。

作法如下︰(預設 policy 為 DROP)
iptables -A OUTPUT -o eth0 -p icmp -s $FW_IP --icmp-type 8 -d any/0 -j ACCEPT
iptables -A INPUT -i eth0 -p icm -s any/0 --icmp-type 0 -d $FW_IP -j ACCEPT 
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]iptables動態NAT對應測試
iptables DNAT port mapping test

環境: 內部的一台機器 listen tcp port 135,139 供測試
測試工具: nmap, 設好 rule 後作多次 port scan 動作, 觀查 open port


135-139 對 135-139 (一對一 mapping)
結果: port 135,139 open


235-239 對 135-139 (一對一 shift mapping)
結果: 動態 port 對應
(在 235-239 中動態分配 2 個 port 分別 mapping 到 135,139)


100-150 對 135-139 (多對少 mapping, --dport 在 listen port 範圍內)
結果: 動態 port 對應, 135 對 135, 139 對 139 的機率很高


150-200 對 135-139 (多對少 mapping, --dport 不在 listen port 範圍內)
結果: 動態 port 對應


130-140 對 120-150 (少對多 mapping, --dport 在 listen port 範圍內)
結果: 固定 135,139 open


140-150 對 120-140 (少對多 mapping, --dport 不在 listen port 範圍內)
結果: 動態 port 對應
有掃到 0 個 port, 1 個 port , 2 個 port 均有出現
因為 10 個 port 無法一一 mapping 到 20 個 port


結論: 當 port 無法直接 mapping 時, 會動態 mapping

冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]一張網卡 bind 兩個不同網段的 IP
冷日當年發mail問半天的問題,現在看起來是找到解決法了。
冷日順便就po上來ㄌㄡ。

一張網卡 bind 兩個不同網段的 IP

環境: 兩條對外網路, 兩個 ATU-R 均接到 Hub, 電腦接 Hub


IP1 100.100.100.100/24 Gateway 100.100.100.254
IP2 200.200.200.200/24 Gateway 200.200.200.254

ifconfig eth0 100.100.100.100 netmask 255.255.255.0
ifconfig eth0:0 200.200.200.200 netmask 255.255.255.0

由於 default gateway 只能設一個, 所以會有其中一個 IP 不通



必需用 ip route2 來解決這個問題
kernel option 中的 IP: policy routing 必需勾選(CONFIG_IP_MULTIPLE_TABLES)
否則在使用 ip rule 時會出現如下錯誤訊息

# ip rule list
RTNETLINK error: Invalid argument
dump terminated


先在 /etc/iproute2/rt_tables 下建兩個 table

echo "100 line1" >> /etc/iproute2/rt_tables 
echo "200 line2" >> /etc/iproute2/rt_tables

# 設定 line1 的 gateway

ip route add default via 100.100.100.254 table line1

# 設定 line2 的 gateway
ip route add default via 200.200.200.254 table line2

# 指定從 100.100.100.100 進來的連線走 rule line1
ip rule add from 100.100.100.100 table line1 

# 指定從 200.200.200.200 進來的連線走 rule line1
ip rule add from 200.200.200.200 table line2</p>

設完後, 從外面連兩個 IP 都可以通



連外負載平衡
kernel option 中的 IP: equal cost multipath 必需勾選(CONFIG_IP_ROUTE_MULTIPATH)
指定 multipath

ip route add default scope global nexthop via 100.100.100.254 dev eth0 weight 1 nexthop via 200.200.200.254 dev eth0 weight 1

設完後就達成 line1 line2 路由平衡, 可以調整 weight 參數來決定 line1 或 line2 的比重
ip route list 會看到 default 如下
default 
        nexthop via 100.100.100.254  dev eth0 weight 1
        nexthop via 200.200.200.254  dev eth0 weight 1</p>

ref. http://lartc.org/

冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[分享]Linux 指令簡單將攻擊IP列入iptables 限制範圍
Linux 指令簡單將攻擊IP列入iptables 限制範圍

今天部分服務器收到真IP的非SYN攻擊,鬱悶.
netstat -an | grep -v LISTEN | \
awk '{print $5}' | \
awk 'BEGIN { FS=":" } { Num[$1]++ } END { for(i in Num) if(Num[i]>8) { print i} }' | \
xargs -i[] iptables -I INPUT -s [] -j DROP

紅色部分為設定值,這條句子會自動將netstat -an 中查到的來自同一IP的超過一定量的連接的列入禁止範圍。

用netstat 查看所有監聽,計算同一IP的數量,如果大於「8」,把fw的iptable的input規則中加入drop,
現可以利用N多個IP攻擊, 如果ipfw中加的規則太多想必系統效率也會下降。
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]防 ssh 暴力攻擊 使用iptables & shell
防 ssh 暴力攻擊 使用iptables & shell @ CentOS
作者: phptw 日期: 2008-06-30 22:06

原則上 ssh port 能不要全部開啟事最好的,如果一定要開啟的話,必需要作些防護措施,

port 22 一旦開啟後最容易遇到的就是會有人不斷的try密碼

設計原理:
抵擋 ssh 暴力攻擊
如果連續攻擊3次以上則抵擋
利用 TCP-Wrapper 偵測是否有登入失敗 ,有失敗才執行shell
mkdir /etc/firewall/

touch /etc/firewall/sshd.sh

chmod 755 /etc/firewall/sshd.sh

vi /etc/firewall/sshd.sh


寫入以下資料

#!/bin/bash

# 檔案存放的路徑
basedir="/etc/firewall"

# log 存放的地方
sshlog="/var/log/auth.log"

# mail for
mailfor="root"

# 登入錯誤訊息
faildMsg="sshd.*Failed password"
faildMsgInvalid="sshd.*Failed password for invalid user"

# 登入幾次失敗 就擋掉
loginCountFail=3

# 計算前 XXXX 行是否有登入失敗的狀況
failcount=`/usr/bin/tail -n 50 "$sshlog" | /bin/grep "$faildMsg" | wc -l`

#cat "$sshlog" | grep "sshd.*Failed password for" | grep -v "invalid" | cut -d " " -f11
#cat "$sshlog" | grep "sshd.*Failed password for invalid user" | cut -d " " -f13

# 如果有登入失敗的話
if [ "$failcount" -gt "0" ]; then

   # 建立 登入失敗 暫存檔
   #cat /var/log/auth.log | grep "sshd.*Failed password for" | grep -v "invalid"
   cat "$sshlog" | grep "sshd.*Failed password for" | grep -v "invalid" > /tmp/ssh_tmp.log
   #cat /var/log/auth.log | grep "sshd.*Failed password for" | grep -v "invalid"
   cat "$sshlog" | grep "sshd.*Failed password for invalid user" > /tmp/ssh_tmp2.log

   # 建立 登入失敗 IP 暫存檔
   #cat "$sshlog" | grep "$faildMsg" | cut -d " " -f13 | sort | uniq > /tmp/ssh_ip_tmp.log
   cat /tmp/ssh_tmp.log | cut -d " " -f11 > /tmp/ssh_ip_tmp.log
   cat /tmp/ssh_tmp2.log | cut -d " " -f13 >> /tmp/ssh_ip_tmp.log


   # 取得要封鎖的IP位址
   #blockip=`cat /tmp/ssh_ip_tmp.log`
   blockip=`cat /tmp/ssh_ip_tmp.log | sort | uniq`

   # iptables中,找出定義的ruleexistchar中的ip。
   #iptables -L INPUT -n | grep "tcp dpt:22" | grep "DROP" | awk '{print $4}' | sort | uniq
   ruleexistip=`iptables -L INPUT -n | grep "tcp dpt:22" | grep "DROP" | awk '{print $4}' | sort | uniq`

   blacklist=`cat "$basedir"/ssd_blacklist_d`
   for ip in $blacklist
   do
 `iptables -D INPUT -p TCP -s $ip  --dport 22 -j DROP` > /dev/null
   done

   rm -rf "$basedir"/ssd_blacklist_d

   # 利用 for 迴圈去跑 drop IP
   for ip in $blockip
   do

 # 計算此IP登入幾次失敗
 count=`cat /tmp/ssh_ip_tmp.log | grep "$ip" | wc -l`

 # 如果登入失敗次數大於 預設值 則執行  drop
 if [ "$count" -gt "$loginCountFail" ] ; then
    #echo $ip  $count
    # 如果從secure找出的ip已存在於iptables,就不需要加這條rule了。
    if [ "$ip" = "$ruleexistip" ]; then
    :
    else
  `iptables -I INPUT -p TCP -s $ip  --dport 22 -j DROP`
    fi
    # if [ "$ip" = "$ruleexistip" ];

    # 建立黑名單
    echo "$ip" >> "$basedir"/ssd_blacklist_d
    cat "$basedir"/ssd_blacklist_d | sort | uniq > "$basedir"/ssd_blacklist_d

 fi
 # if [ "$count" -gt "$loginCountFail"] ;

   done
   # for loop done

   # 刪除暫存檔
   rm -rf /tmp/ssh*.log

   mail -s "ssh hacker 抵擋的IP位址" $mailfor < "$basedir"/ssd_blacklist_d

fi
# if [ "$failcount" -gt "0" ];



然後在
vi /etc/hosts.allow

加入
 sshd : ALL : spawn /etc/firewall/sshd.sh


參考資料:
http://www.andowson.com/posts/list/33.page
http://ssorc.tw/rewrite.php/read-93.html

如果在加上 root 的權限控管會更好,限制 root 的權限只有特定的管理者可以取得權限

原文出處:[Linux] 防 ssh 暴力攻擊 使用iptables & shell @ CentOS - linux - 墮落程式
冷日
(冷日)
Webmaster
  • 註冊日: 2008/2/19
  • 來自:
  • 發表數: 15771
[轉貼]自動擋掉嘗試用ssh入侵Linux的攻擊者IP
在 Linux 系統上的 /var/log/secure 裡面常會發現一些類似底下的紀錄
Jan 21 05:32:32 www sshd[24782]: Invalid user office from ::ffff:210.202.33.129
Jan 20 21:32:32 www sshd[24783]: input_userauth_request: invalid user office
Jan 21 05:32:35 www sshd[24782]: Failed password for invalid user office from ::ffff:210.202.33.129 port 61321 ssh2


可是系統上並沒有office這個使用者,而且這個210.202.33.129還出現在其他連續的多筆記錄上,可以知道這是個嘗試入侵的行為,我們可以寫支 shell script 程式來自動擋掉這些討厭的傢伙。

將底下的程式碼複製存檔為 /root/admin/banip.sh
#!/bin/bash
# Name: banip.sh
# Author: Andowson Chang (andowson [at] gmail [dot] com)
# Version: 0.1
# Last Modified: 2007-01-21

# 修改這邊的參數
EXTERNAL_INTERFACE="ppp0" # you must edit this
BANNEDHOSTFILE="/tmp/bannedhosts.txt" #edit this as required
HISTORYHOSTSFILE="/tmp/history.txt" #edit this as required
IPTABLES="/sbin/iptables"
GREP_PARAM="^[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*\.[[:digit:]]*"

# 找出攻擊的主機IP
grep "Failed password for invalid user" /var/log/secure | cut -d" " -f13 | sort | uniq | cut -d":" -f4 > /tmp/attack.log
grep "Failed password for invalid user" /var/log/secure | cut -d" " -f14 | sort | uniq | cut -d":" -f4 >> /tmp/attack.log

# 刪除一些不是IP的字,目前發現的有from和port,也可以包含測試用的來源IP
sed -e '/from/d' -e '/port/d' -e '/192.168.1/d' /tmp/attack.log > /tmp/attack.txt

# 加入新增的主機
touch $HISTORYHOSTSFILE
sort /tmp/attack.txt | uniq > /tmp/ip1
sort $HISTORYHOSTSFILE | uniq > /tmp/ip2
comm -23 /tmp/ip[1-2] > $BANNEDHOSTFILE   # 新增站台資料
rm -rf /tmp/ip[1-2]
rm -rf /tmp/attack.*

# 將攻擊的主機IP加到iptables擋掉
for i in $( grep $GREP_PARAM $BANNEDHOSTFILE )
do
	echo "Deny access to host: $i"
	$IPTABLES -A INPUT -i $EXTERNAL_INTERFACE -s $i -j DROP
	$IPTABLES -A OUTPUT -o $EXTERNAL_INTERFACE -d $i -j DROP
done

# 將處理過的IP清單加到歷史檔去
cat $BANNEDHOSTFILE >> $HISTORYHOSTSFILE
sort $HISTORYHOSTSFILE | uniq > /tmp/history.tmp
mv -f /tmp/history.tmp $HISTORYHOSTSFILE
rm -rf $BANNEDHOSTFILE


然後chmod 755 /root/admin/banip.sh
接著掛到/etc/crontab讓它每五分鐘執行一次
# ban intruder's ip (2007.01.21)
2 */5 * * * * root /root/admin/banip.sh > /var/log/banip.log


察看目前被擋掉的IP:iptables -L -n
如果有誤加的IP,可以利用類似底下的指令來刪除設定
view sourceprint?1 iptables -D INPUT -i ppp0 -s 192.168.1.5 -j DROP
iptables -D OUTPUT -o ppp0 -d 192.168.1.5 -j DROP


為避免重複加入iptables,已在$HISTORYHOSTSFILE裡面的ip,會被自動過濾掉。可是重開機之後iptables的設定會回到預設值,只剩下開放的服務port的設定,沒有擋掉任何主機的設定。如此一來,重開機後將不會再擋掉先前已在歷史檔內的主機。解決的方法是每次重開機後將歷史檔更名,如改為history.txt-yyyymmdd
vi /etc/rc.local
view sourceprint?1 mv /tmp/history.txt /tmp/history.txt-`date +%Y%m%d`



原文出處:自動擋掉嘗試用ssh入侵Linux的攻擊者IP
前一個主題 | 下一個主題 | 頁首 | | |



Powered by XOOPS 2.0 © 2001-2008 The XOOPS Project|