1、搭建vsftpd,并實(shí)現(xiàn)虛擬用戶
root用戶登錄
#?yum? install? vsftpd -y
安裝完后可以使用以下命令來(lái)啟停vsftpd服務(wù)
#?service? vsftpd? start
# service vsftpd? stop
# service vsftpd? restart
它的配置文件目錄為/etc/vsftpd/,該目錄下有主配置文件vsftpd.conf,接下就以實(shí)現(xiàn)虛擬用戶功能來(lái)配置一下vsftpd
虛擬用戶就是系統(tǒng)當(dāng)中不存在的實(shí)體用戶,它只能訪問(wèn)和使用ftp資源,但不允許訪問(wèn)系統(tǒng)的其他資源。虛擬用戶的認(rèn)證使用口令庫(kù)文件
(1)編寫(xiě)虛擬用戶的賬戶和密碼數(shù)據(jù)庫(kù)文件
編寫(xiě)一文本文件,奇數(shù)行為賬戶,偶數(shù)行為密碼。
# vi? /etc/vsftpd/vusers.list
用戶名1
密碼1
用戶名2
密碼2
……
安裝db4工具來(lái)把文本文件轉(zhuǎn)換成二進(jìn)制數(shù)據(jù)庫(kù)文件
#?yum install? ?db4-utils? ?-y
#? db_load? -T? -t? hash? ?-f? ?vusers.list? ? vusers.db
#? ?chmod 600? /etc/vsftpd/vusers.*
(2)創(chuàng)建ftp根目錄和虛擬用戶映射的系統(tǒng)用戶
#?mkdir? /var/ftproot
#? useradd -d /var/ftproot? -s? /sbin/nologin? ?virtual
#? chmod? ?755? ? /var/ftproot
(3)創(chuàng)建支持虛擬用戶的PAM認(rèn)證文件
#? vi? ?/etc/pam.d/vsftpd
auth? required? ?pam_userdb.so db=/etc/vsftpd/vusers
account? required??pam_userdb.so db=/etc/vsftpd/vusers
這里指向數(shù)據(jù)庫(kù)文件名時(shí),不要加后綴
(4)修改主配置文件
#? vi? ?/etc/vsftpd/vsftpd.conf
anonymous_enable=NO? ?#禁用匿名用戶
local_enable=YES? ? #啟用本地用戶
write_enable=YES? ? #本地用戶可以可寫(xiě)
anon_umask=022? ? ? #匿名用戶創(chuàng)建文件的掩碼權(quán)限
chroot_local_user=YES? ? #禁錮本地用戶不能超出其家目錄
guest_enable=YES? ? ?#?啟用guest用戶
guest_username=virtual? ? #虛擬用戶映射的系統(tǒng)用戶名
pam_service_name=vsftpd? ?#虛擬用戶的pam文件名,不需要路徑
(5)創(chuàng)建虛擬用戶配置文件
#? mkdir? ?/etc/vsftpd/vusers_dir? ? 創(chuàng)建虛擬用戶配置文件目錄
在主配置文件中開(kāi)啟虛擬用戶,并指定虛擬用戶配置文件目錄
#? vi? ?/etc/vsftpd/vsftpd.conf
virtual_use_local_privs=YES
user_config_dir=/etc/vsftpd/vusers_dir
在虛擬用戶配置文件目錄中為個(gè)別用戶創(chuàng)建獨(dú)立的配置文件
# vi /etc/vsftpd/vusers_dir/user1
anon_upload_enable=YES
anon_mkdir_enable=YES
(6)重啟vsftpd來(lái)重新加載
#? service? vsftpd restart
(7)測(cè)試過(guò)程
發(fā)現(xiàn)報(bào)錯(cuò)
226 transfer done but failed to open directory
需要把selinux關(guān)掉。
#? vi /etc/selinux/config
SELINUX=disabled
重啟# reboot
發(fā)現(xiàn)報(bào)錯(cuò):500 OOPS: vsftpd: refusing to run with writable root inside chroot()
如果啟用chroot,必須保證ftp根目錄不可寫(xiě),這樣對(duì)于ftp根直接為網(wǎng)站根目錄的用戶不方便
#? chmod? a-x? /var/ftproot
然后如果需要在ftp根目錄下創(chuàng)建目錄或文件。請(qǐng)自行創(chuàng)建。
2、簡(jiǎn)述iptales四表五鏈及詳細(xì)介紹iptables命令使用方法。
Linux系統(tǒng)上的防火墻是由iptables/netfilter組成,其中iptables是規(guī)則的制定工具,工作在用戶空間,它制定的規(guī)則送到內(nèi)核空間,netfilter在內(nèi)核協(xié)議框架中定義了5個(gè)位置通過(guò)鉤子函數(shù)對(duì)進(jìn)出的數(shù)據(jù)包進(jìn)行過(guò)濾。
iptables四表為filter ,? nat ,mangle ,? raw 。默認(rèn)表是flter,表的處理優(yōu)先級(jí)為:raw ,mangle,nat,filter。
filter:一般的過(guò)濾功能;
nat:?用于nat功能(地址轉(zhuǎn)換、映射、端口映射等)
mangle:用于對(duì)特定數(shù)據(jù)包的修改(使用情況少)
raw:? 一般是為了不再讓iptables做數(shù)據(jù)包的鏈接跟蹤處理,從而提高性能。
五個(gè)鏈分別是:
INPUT:?通過(guò)路由表判斷后目的地是本機(jī),然后進(jìn)入本機(jī)內(nèi)部資源
OUTPUT:?由本機(jī)產(chǎn)生的數(shù)據(jù)向外部轉(zhuǎn)發(fā)
FORWARD:通過(guò)路由表判斷后目的地不是本機(jī),然后通過(guò)路由轉(zhuǎn)發(fā)到其他地方
PREROUTING:流入的數(shù)據(jù)包進(jìn)入路由表之前
POSTROUTING:傳出的數(shù)據(jù)包到達(dá)網(wǎng)卡出口前
四個(gè)表對(duì)應(yīng)的鏈分別為:
filter: INPUT? ,? ?OUTPUT? ,? ?FORWARD
nat:? ?PREROUTING? ,? POSTROUTING? ?FORWARD
mangle: INPUT? OUTPUT??PREROUTING? ,? POSTROUTING? ?FORWARD
raw:??PREROUTING ?OUTPUT
iptables的語(yǔ)法格式:
iptables? ?[-t? TABLE ]? COMMAND? ?CHAIN? ?[-m matchname [per-match-options]]? ?-j? ?targetname? [per-target-options]
-t? TABLE:? 默認(rèn)為filter? ,可以是filter ,nat? ,mangle, raw
COMMAND有以下幾種:
(1)查看:-L? ?list列出指定鏈上所有的規(guī)則,有以下幾條子選項(xiàng)
-n? :? ?numberic?以數(shù)字格式顯示地址與端口號(hào),例如任意地址不加-n顯示為anywhere?加-n顯示為0.0.0.0/0
-v? :? ? verbose顯示詳細(xì)信息 , -vv? -vvv顯示的信息更為詳細(xì)
-x:? ? ?顯示計(jì)數(shù)器結(jié)果的精確值,不加的話顯示四舍五入的值,但是更有可讀性
--line-numbers:? ?顯示規(guī)則的序號(hào)
(2)鏈管理:
-N: new,定義一臺(tái)新的自定義規(guī)則鏈
-X:delete? 刪除一條自定義規(guī)則鏈(僅能刪除自定義的?引用計(jì)數(shù)為0的? 空的?鏈)
-E:? 重命名自定義鏈(僅能重命名引用計(jì)數(shù)為0的自定義鏈)
-P:policy? 設(shè)置默認(rèn)策略,對(duì)于filter表中的鏈來(lái)說(shuō),以三種策略:ACCEPT? /? ?DROP? /? ?REJECT
(3)規(guī)則管理
-A:?append? 在最后一條規(guī)則之后,追加規(guī)則
-I:? ?insert? ?插入規(guī)則,要指定位置,不指定位置則在第一條前插入規(guī)則
-D:? delete? 刪除規(guī)則,指定規(guī)則序號(hào)或規(guī)則本身來(lái)進(jìn)行刪除
-R:? replace? 替換規(guī)則,替換指定鏈上的指定規(guī)則
-F:? flush? ?清空指定鏈上的規(guī)則
-Z:? zero? ?計(jì)數(shù)器置零,每條規(guī)則對(duì)匹配的報(bào)文個(gè)數(shù)和報(bào)文的大小之和進(jìn)行統(tǒng)計(jì)。
CHAIN?就是鏈,參考之前的鏈與表的關(guān)系
匹配條件:
基本匹配條件:無(wú)需加載任何模塊,由iptables/netfilter來(lái)提供
[!]? -s:? ?檢查報(bào)文中的源IP地址是否符合對(duì)應(yīng)IP或網(wǎng)絡(luò)地址范圍 ,前加“!"表示條件取反(下同)
如:0.0.0.0/0表示所有地址,其他地址網(wǎng)段可以用CIDR方式書(shū)寫(xiě)
[!]? -d:? ?檢查報(bào)文中的目標(biāo)IP地址是否符合對(duì)應(yīng)IP或網(wǎng)絡(luò)地址范圍
[!]? -p:? 網(wǎng)絡(luò)協(xié)議,常見(jiàn)的有tcp? /? udp? ?/icmp
[!] -i? ?:數(shù)據(jù)報(bào)文流入的接口(即哪張網(wǎng)卡),只能應(yīng)用于?INPUT? ?PREROUTING? ,? ?FORWARD? 鏈
[!]? -o? :數(shù)據(jù)報(bào)文流出的接口(即哪張網(wǎng)卡),只能應(yīng)用于OUTPUT? ? POSTROUTING? ?FORWARD鏈
擴(kuò)展匹配條件:
隱式擴(kuò)展:使用-p指定了協(xié)議后,隱式包含了一些擴(kuò)展選項(xiàng)
tcp協(xié)議:
[!]? --source-port? 或? --sport? port[:port]? ?匹配報(bào)文的源端口,可以是端口范圍兩個(gè)port之間用“:”隔開(kāi)
[!]? --destination-port? 或? --dport? port[:port]? ?匹配報(bào)文的目標(biāo)端口,可以是端口范圍
[!]? --tcp-flags? 檢查的標(biāo)志位列表? 必須為1的標(biāo)志位列表? ?用于匹配報(bào)文的標(biāo)志位,如果標(biāo)志位出現(xiàn)在第一列表中,而沒(méi)有出現(xiàn)在第二列表中,則必須為0。第二列表是第一列表的子集。
[!]? --syn? ?用于匹配第一次握手,相當(dāng)于"--tcp-flags? SYN,ACK,FIN,RST? SYN"
udp協(xié)議:
[!]? --source-port? 或? --sport? port[:port]? ?匹配報(bào)文的源端口,可以是端口范圍兩個(gè)port之間用“:”隔開(kāi)
[!]? --destination-port? 或? --dport? port[:port]? ?匹配報(bào)文的目標(biāo)端口,可以是端口范圍
icmp協(xié)議:
[!]? --icmp-type? {type[/code]| typename}
echo-request? :? ?8
echo-replay? ? :? ?0
顯式擴(kuò)展:使用-m來(lái)指明要調(diào)用的擴(kuò)展模塊, -m? 模塊名? 模塊對(duì)應(yīng)選項(xiàng),常用的模塊名舉例如下:
multiport:
以離散方式來(lái)指定端口號(hào)列表
[!]? --source-port? 或? --sport? port,port,port ....指定多個(gè)源端口
[!]? --destination-port? 或? --dport? ?port,port,port ..指定多個(gè)目標(biāo)端口
iprange:指定IP地址范圍
[!}? --src-range? ?fromIP[-toIP]? 來(lái)源IP范圍
[!}? --dst-range? ?fromIP[-toIP]? 目標(biāo)IP范圍
time:? 指定日期時(shí)間范圍
--timestart? hh:mm[:ss]? ? 開(kāi)始時(shí)間
--timestop? ?hh:mm[:ss]? ? 結(jié)束時(shí)間
[!]? --weekdays day,day.....?周幾
[!]? --monthdays? ?day,day,....?每月內(nèi)的幾日
--datestart? ?YYYY[-MM[-DD[Thh[:mm[:ss]]]]]? ? 開(kāi)始日期和時(shí)間
--datestop? ?YYYY[-MM[-DD[Thh[:mm[:ss]]]]]? ? ?結(jié)束日期和時(shí)間
--kerneltz? ?使用內(nèi)核配置的時(shí)區(qū),而不是默認(rèn)的UTC
string:?匹配報(bào)文中的字符串
--algo {bm|kmp}? ? 必選項(xiàng)? ?指定匹配字符串的算法
[!]? --string? 模式字符串
[!]? --hex-string? 16進(jìn)制編碼的模式字符串
--from? offset? ?指定開(kāi)始檢查的位置
--to? ?offset? ? ? 指定結(jié)束檢查的位置
connlimit :單IP的并發(fā)連接數(shù)限制
--connlimit-upto? n? 連接數(shù)小于等于n
--connlimit-above? n? ? 連接數(shù)大于等于n
limit? :使用令牌桶過(guò)濾器,指定令牌生成速率
--limit-burst? n? ?令牌桶的大小
--limit? n[/second|/minute|/hour|/day]? ?限制每秒多少個(gè)包(每分鐘/小時(shí)/天多少個(gè)包)
state:? 連接追蹤記錄,在并發(fā)訪問(wèn)量大的主機(jī)不要開(kāi)啟
追蹤到的連接:/proc/net/nf_conntrack
調(diào)整可記錄的連接數(shù)量最大值:/proc/sys/net/nf_conntrack_max
超時(shí)時(shí)長(zhǎng):/proc/sys/net/netfilter/* timeout *
[!]? --state? 狀態(tài)
這里的狀態(tài)可以為以下幾種:
NEW:新連接請(qǐng)求
ESTABLISHED:已建立的連接
INVALID:未識(shí)別的連接
RELATED:相關(guān)聯(lián)連接,附屬于某個(gè)已存在連接的新請(qǐng)求
UNTRACKED:未追蹤的連接
-j?targetname? ? 跳轉(zhuǎn)的目標(biāo)或處理動(dòng)作:
基本處理動(dòng)作:
ACCEPT:接受
DROP:? 丟棄
擴(kuò)展處理動(dòng)作:
REJECT:拒絕
--reject-with type?定義拒絕類型
LOG? ?日志記錄,默認(rèn)保存在/var/log/messages文件中,
--log-level? ?日志級(jí)別
--log-prefix? ?日志前綴
RETURN
從自定義鏈返回原鏈繼續(xù)檢查規(guī)則
自定義鏈名作為目標(biāo)
自定義鏈中的規(guī)則如果都不匹配時(shí),再返回原鏈繼續(xù)檢查原鏈上的規(guī)則
其它命令
iptables-save? > filename? ?保存iptables內(nèi)容到某一文件中
iptables-restore
-n? 不清除原有規(guī)則
-t? :僅檢查分析生成的規(guī)則集是否有語(yǔ)法錯(cuò)誤