入侵某台電腦有很多種途徑,其中通過端口進行入侵比較普遍,而且一經成功危害比較大。特别是作為伺服器的計算機,把不必要的端口關閉,這是常用的做法。 對端口的處理 常用的做法: 關閉所有端口,隻打開要對外使用的端口。 例如:作為web伺服器 我們可以關閉所有端口,隻打開80端口。 |
修改預設設定
# iptables -L -n
看到 INPUT ACCEPT, FORWARD ACCEPT , OUTPUT ACCEPT
我們可以這樣了解,iptables 由3個部分組成INPUT, FORWARD 和 OUTPUT,我們先看 INPUT 和 OUTPUT(policy ACCEPT) 表示是完全接受 所有的資料,也就是說現在的iptables 防火牆 沒有起到任何作用。
修改防火牆的預設設定:
# iptables -P INPUT DROP
# iptables -P INPUT ACCEPT
隻允許某個端口通路
配置伺服器時往往是隻打開某個端口,其他的端口全部關閉來提高我們伺服器的安全性。 下面我就用端口22來舉個例子如何實作,隻允許端口22的通路 其他端口全部都不能通路的, 端口22就是我們通過ssh來進行遠端通路Linux預設端口。 |
關閉所有端口
看我現在伺服器的情況:
通過指令 netstat -tnl 可以檢視目前伺服器打開了哪些端口
[root@localhost ~]# netstat -tnl
下面我們關閉所有的端口
]# iptables -P INPUT DROP
]# iptables -P FORWARD DROP
]# iptables -P OUTPUT DROP
再檢視一下 iptables -L -n
好成功關閉了所有端口。
打開22端口
下面我隻打開22端口,就是下面2個語句
]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
]# iptables -A OUTPUT -p tcp --sport 22 -j ACCEPT
]# service iptables save
* 打開53端口(原始檔案沒有)
下面我隻打開53端口,就是下面2個語句
針對本地服務的設定
]# iptables -A INPUT -p tcp --sport 53 -j ACCEPT
]# iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT
針對DNS伺服器的設定
]# iptables -A INPUT -p tcp --dport 53 -j ACCEPT
]# iptables -A OUTPUT -p tcp --sport 53 -j ACCEPT
再檢視下 iptables -L -n 是否添加上去, 看到添加了
針對這2條指令進行一些講解吧 -A 參數就看成是添加一條 INPUT 的規則 -p 指定是什麼協定 我們常用的tcp 協定,當然也有udp 例如53端口的DNS 到時我們要配置DNS用到53端口 大家就會發現使用udp協定的 而 --dport 就是目标端口 當資料從外部進入伺服器為目标端口 反之 資料從伺服器出去 則為資料源端口 使用 --sport -j 就是指定是 ACCEPT 接收 或者 DROP 不接收 |
禁止、允許 某個IP通路
很多時候我們出于安全的角度需要禁止某個ip通路本伺服器,或者隻能接受某個ip通路。 例如發現伺服器受到某個ip攻擊,就可以拒絕該ip的通路。 還有就是我這台伺服器裡面很多保密資料,不允許任何ip通路,就隻允許給某一個ip可以通路。 |
1. 首先第一種情況 禁止某個ip通路我的網站
要禁止 192.168.1.1 通路
]# iptables -A INPUT -p tcp -s 192.168.1.1 -j DROP
2. 隻允許某台電腦通路
隻允許 ip為 192.168.1.2 的電腦通路, 隻設定 INPUT 通過還是不行;還要設定 OUTPUT 才行。
[root@localhost ~]# iptables -A INPUT -p tcp -s 192.168.1.2 -j ACCEPT
[root@localhost ~]# iptables -A OUTPUT -p tcp -d 192.168.1.2 -j ACCEPT
[root@localhost ~]# iptables -L -n
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 192.168.1.2 0.0.0.0/0
Chain FORWARD (policy DROP)
Chain OUTPUT (policy DROP)
ACCEPT tcp -- 0.0.0.0/0 192.168.1.2
3. 删除規則
删除一些規則 我們經常會添加一些規則,但是當我們不再使用了其中一條規則,就要删除。或者添加寫錯了一些資料,也需要删除。 |
我們都知道 iptables -L -n 可以檢視iptables 的設定情況
通過 iptables -L -n --line-number 可以顯示規則和相對應的編号,多了 num 這一列, 這樣就可以用規則對應的 編号進行删除了
iptables -D INPUT 2
删除INPUT鍊編号為2的規則。
下面我把其餘的 也删除掉。 删除完了。
]# netstat -nltp
]# iptables -L -n
]# iptables -L -n --line-number
]# iptables -D INPUT 2
]# iptables -D OUTPUT 2
]# iptables -D FORWARD 2
再 iptables -L -n 檢視一下 已經被清除了。
過濾無效的資料包
之前我們配置過iptables隻開放某些端口,但是想安全點的話,還需要過濾一些無效的資料包,怎樣才算無效? 不是正常請求回應的資料包。 |
為什麼這樣說呢? 例如,現在有台Linux伺服器,隻開放22和80端口,也就是 INPUT和OUTPUT都是開放的,這個2個端口。
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:80
情況就像現在這樣。為什麼說不夠安全呢 ??
假設有人進入了伺服器,或者有病毒木馬程式,它可以通過22,80端口向伺服器外傳送資料。它的這種方式就和我們正常通路22,80端口有差別。它發向外發的資料不是我們通過通路網頁請求而回應的資料包。
下面我們要禁止這些沒有通過請求回應的資料包,統統把它們堵住掉。iptables 提供了一個參數 是檢查狀态的,下面我們來配置下 22 和 80 端口,防止無效的資料包。
]# iptables -A OUTPUT -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
可以看到和我們以前使用的:
多了一個狀态判斷。
同樣80端口也一樣, 現在删掉原來的2條規則,iptables -L -n --line-number這個是檢視規則而且帶上編号。我們看到編号就可以删除對應的規則了。
這樣就可以防止别人利用22和80端口,随意發出沒有經過請求的資料包了。
DNS端口53
上幾次視訊我們做了端口方面的設定, 如果你發現不能解析一些域名,說明DNS不可用,而DNS不能用了,有幾種可能性,其中一種就是防火牆把DNS端口給關閉了。 |
如何設定iptables來打開DNS端口,DNS端口對應的是53
ping 一下域名也是不通(iptables限制了域名解析請求)
[root@localhost ~]# ping www.google.com
ping: unknown host www.google.com
下面示範下如何使用 iptables 來設定DNS 53這個端口,如果你不知道 域名服務端口号,你
可以用指令 : grep domain /etc/services
[root@localhost ~]# grep domain /etc/services
domain 53/tcp # name-domain server
domain 53/udp
domaintime 9909/tcp # domaintime
domaintime 9909/udp # domaintime
同時還要設定
]# iptables -A INPUT -p udp --dport 53 -j ACCEPT
]# iptables -A OUTPUT -p udp --sport 53 -j ACCEPT
ping 方面可能還要設定些東西。
用 nslookup 看看吧
[root@localhost ~]# nslookup
> www.google.com
Server: 192.168.1.1
Address: 192.168.1.1#53
Non-authoritative answer:
www.google.com canonical name = www.l.google.com.
www.l.google.com canonical name = www-china.l.google.com.
Name: www-china.l.google.com
Address: 64.233.189.147
Address: 64.233.189.99
Address: 64.233.189.104
說明本機DNS正常, iptables 允許53這個端口的通路。
FTP服務設定
我之前也做過iptables允許某個端口通路的視訊,為什麼還要做ftp端口這個示範?因為ftp端口真的比較特殊,并不像80,22這些端口。
FTP服務使用了兩個端口20,21
[root@localhost root]# iptables -A INPUT -p tcp --dport 21 -j ACCEPT
[root@localhost root]# iptables -A INPUT -p tcp --dport 20 -j ACCEPT
[root@localhost root]# iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT
[root@localhost root]# iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT
這樣就添加完了,我們用浏覽器通路一下ftp,出現逾時。是以我剛才說 ftp 是比較特殊的端口,它還有一些端口是資料傳輸端口,例如目錄清單, 上傳 ,下載下傳 檔案都要用到這些端口。而這些端口是任意端口。這個任意真的比較特殊。
如果不指定什麼一個端口範圍, iptables 很難對任意端口開放的,如果iptables允許任意端口通路, 那和不設定防火牆沒什麼差別,是以不現實的。那麼我們的解決辦法就是指定這個資料傳輸端口的一個範圍。
下面我們修改一下ftp配置檔案。
我這裡使用vsftpd來修改示範。
[root@localhost root]# vi /etc/vsftpd.conf
在配置檔案的最下面 加入
pasv_min_port=30001
pasv_max_port=31000
然後儲存退出。
這兩句話的意思告訴vsftpd, 要傳輸資料的端口範圍就在30001到31000 這個範圍内傳送。這樣我們使用 iptables 就好辦多了,我們就打開 30001到31000 這些端口。
[root@localhost root]# iptables -A INPUT -p tcp --dport 30001:31000 -j ACCEPT
[root@localhost root]# iptables -A OUTPUT -p tcp --sport 30001:31000 -j ACCEPT
[root@localhost root]# service iptables save
最後進行儲存, 然後我們再用浏覽器範圍下 ftp。可以正常通路
上傳和下載下傳都正常。。 再檢視下 iptables 的設定
[root@localhost root]# iptables -L -n
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:20
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:30001:31000
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:22
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:21
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spt:20
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp spts:30001:31000
可以添加一些對資料包的驗證例如 -m state --state ESTABLISHED,RELATED 等等要求更加高的驗證