實現vsftp虛擬用戶和iptables基本用法
1.安裝vsftpd服務
[root@centos7 ~]#yum install -y vsftpd
2.啟動服務
[root@centos7 ~]#systemctl start vsftpd [root@centos7 ~]#ss -ntl State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:111 *:* LISTEN 0 5 192.168.122.1:53 *:* LISTEN 0 128 *:22 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 100 127.0.0.1:25 *:* LISTEN 0 128 *:43550 *:* LISTEN 0 128 :::111 :::* LISTEN 0 128 :::80 :::* LISTEN 0 32 :::21 :::* LISTEN 0 128 :::22 :::* LISTEN 0 128 ::1:631 :::* LISTEN 0 100 ::1:25 :::* LISTEN 0 128 :::46052 :::*
3.測試
[root@localhost ~]# lftp 192.168.0.109
lftp 192.168.0.109:~> ls
drwxr-xr-x 2 0 0 18 Feb 17 06:19 pub
4.編輯基本設置
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
anonymous_enable=NO #關閉匿名用戶登陸
5.創建虛擬用戶名字密碼文件(該文件使用完刪除)
[root@centos7 ~]#vim user.txt #一行用戶一行密碼 dcrfan centos admin centos normal centos
6.在/etc/vsftpd/ 建立數據文件
[root@centos7 ~]#cd /etc/vsftpd/
[root@centos7 vsftpd]#db_load -T -t hash -f /root/user.txt vuser.db #生成數據類文件
[root@centos7 vsftpd]#chmod 600 vuser.db #讓文件更加安全
[root@centos7 vsftpd]#ll vuser.db
-rw------- 1 root root 12288 Feb 17 14:39 vuser.db
7.創建一個虛擬用戶映射到的系統用戶
[root@centos7 vsftpd]#useradd -d /var/ftpshare -s /sbin/nologin vuser [root@centos7 vsftpd]#chmod +rx /var/ftpshare [root@centos7 vsftpd]#chmod -w /var/ftpshare #去掉根共享目錄w權限
8.創建文件夾,並設定權限
[root@centos7 vsftpd]#mkdir /var/ftpshare/upload
[root@centos7 vsftpd]#mkdir /var/ftpshare/download
[root@centos7 vsftpd]#setfacl -m u:vuser:rwx /var/ftpshare/{upload,download} #給用戶vuser賦予目錄權限
9.手動創建pam配置文件,使pam文件使用vuser.db
[root@centos7 vsftpd]#vim /etc/pam.d/vsftpd.db
auth required pam_userdb.so db=/etc/vsftpd/vuser
account required pam_userdb.so db=/etc/vsftpd/vuser
10.在vsftpd配置中加入引用pam配置文件驗證
[root@centos7 ~]#vim /etc/vsftpd/vsftpd.conf
guest_enable=YES #所有系統用戶都映射成guest用戶
guest_username=vuser #映射成用戶名字
pam_service_name=vsftpd.db #指定pam配置文件
user_config_dir=/etc/vsftpd/vuser.d #指定每個用戶的子配置文件位置
11.為不同用戶創建權限控制(文件名字就是虛擬用戶名字)
[root@centos7 vsftpd]#mkdir /etc/vsftpd/vuser.d
vim admin
anon_upload_enable=YES #允許匿名用戶上傳
anon_mkdir_write_enable=YES #允許匿名用戶創建目錄
anon_other_write_enable=YES #匿名可刪除和修改上傳的文件
vim dcrfan
anon_upload_enable=YES
vim normal
anon_max_rate=102400 #限制匿名用戶傳輸速率上限100k
12.測試admin賬號
[root@localhost ~]# lftp -u admin 192.168.0.109
Password:
lftp [email protected]:~> ls
drwxrwxr-x 2 0 0 6 Feb 17 06:53 download
drwxrwxr-x 2 0 0 6 Feb 17 06:53 upload
lftp [email protected]:/> cd download
cd ok, cwd=/download
lftp [email protected]:/download> mkdir test #可以創建目錄
mkdir ok, test‘ created
lftp [email protected]:/download> put ks7.cfg #可以上傳文件
1072 bytes transferred
lftp [email protected]:/download> ls
-rw------- 1 5002 5002 1072 Feb 17 07:40 ks7.cfg
drwx------ 2 5002 5002 6 Feb 17 07:39 test
lftp [email protected]:/download> ls
-rw-r--r-- 1 0 0 0 Feb 17 07:43 hh
-rw------- 1 5002 5002 1072 Feb 17 07:40 ks7.cfg
drwx------ 2 5002 5002 6 Feb 17 07:39 test
lftp [email protected]:/download> get hh #可以下載文件
lftp [email protected]:/download> !ls
anaconda-ks.cfg Documents hh ks6.cfg Music Public Videos
Desktop Downloads initial-setup-ks.cfg ks7.cfg Pictures Templates
13.測試dcrfan用戶
[root@localhost ~]# lftp -u dcrfan 192.168.0.109
Password:
lftp [email protected]:~> ls
drwxrwxr-x 3 0 0 43 Feb 17 07:43 download
drwxrwxr-x 2 0 0 6 Feb 17 06:53 upload
lftp [email protected]:/> cd upload
lftp [email protected]:/upload> mkdir test #創建目錄失敗
mkdir: Access failed: 550 Permission denied. (test)
lftp [email protected]:/upload> put ks6.cfg
1092 bytes transferred
lftp [email protected]:/upload> cd /download/
lftp [email protected]:/download> get bigtest #傳輸速率沒限制
104857600 bytes transferred in 1 second (95.60M/s)
14.測試normal用戶
[root@localhost ~]# lftp -u normal 192.168.0.109
Password:
lftp [email protected]:~> ls
drwxrwxr-x 3 0 0 58 Feb 17 07:58 download
drwxrwxr-x 2 0 0 21 Feb 17 07:49 upload
lftp [email protected]:/> cd download
lftp [email protected]:/download> put ks6.cfg #不可以上傳文件
put: Access failed: 550 Permission denied. (ks6.cfg)
lftp [email protected]:/download> ls
-rw-r--r-- 1 0 0 104857600 Feb 17 07:58 bigtest
-rw-r--r-- 1 0 0 0 Feb 17 07:43 hh
-rw------- 1 5002 5002 1072 Feb 17 07:40 ks7.cfg
drwx------ 2 5002 5002 6 Feb 17 07:39 test
lftp [email protected]:/download> get bigtest #傳輸速率被限制在100k以下
‘bigtest‘ at 6684672 (6%) 99.0K/s eta:18m [Receiving data]
2.iptables四表五鏈
1.Netfilter是集成內核中的防火墻,iptables是防火墻管理工具
iptables由四個表和五個鏈以及一些規則組成
2.四個表分別是filter、nat、mangle、raw
-filter表:過濾規則表,根據預定義的規則過濾符合條件的數據包
-nat表:network address translation 地址轉換規則表 (修改目標地址 源地址)
-mangle:修改數據標記位規則表 (打標簽分類)
-Raw:關閉NAT表上啟用的連接跟蹤機制,加快封包穿越防火墻速度 (使用比較少)
3.五個內置鏈chain INPUT OUTPUT FORWARD PREROUTING POSTROUTING (5個檢查點)
-PREROUTING:數據包進入路由表之前 (一般dnat、REDIRECT端口轉發規則應用)
-INPUT:通過路由表後目的地為本機
-FORWARD:通過路由表後,目的地不為本機 (網絡防火墻filter應用地方)
-OUTPUT:由本機產生,向外轉發
-POSTROUTIONG:發送到網卡接口之前 (一般snat規則應用)
3.iptables基本用法
1.systemctl stop firewalld 或者 service iptables stop 禁用系統默認規則
CentOS 6 service iptables save 將規則覆蓋保存至/etc/sysconfig/iptables文件中
CentOS 7 可用下面方法保存規則
iptables -S > /PATH/TO/SOME_RULES_FILE
iptables-save > /PATH/TO/SOME_RULES_FILE
centos7開機自動重載規則文件中的規則:
/etc/rc.d/rc.local文件添加
iptables-restore < /PATH/FROM/IPTABLES_RULES_FILE
並加執行權限
2.iptables -nvL 查看所有規則 --line-numbers 查看規則的序號 -x 顯示精確數字 -S 顯示命令格式規則
3.基本格式
iptables [-t table] SUBCOMMAND chain [-m matchname [per-match-options]] -j targetname [per-targetoptions]
註意事項:默認表為filter,多條規則 前面優先生效,且chain 必須大寫,iptables -A INPUT -i lo -j ACCEPT 讓自己能訪問自己 通常都要設定
4.基本選項
-Z 統計數據包清零
-F 清理規則
-t 指定表 (默認filter表)
-A chain 追加
-D 刪除記錄 如 -D INPUT 1
-I chain 插入 默認第一條 如-I INPUT 2 放在第二條
-R 修改規則 如 -R INPUT 2
-P chain 動作 設置默認規則 (不推薦使用)
-s 源地址
-d 目標地址
-p 指定協議 可使用數字如0(all) protocol: tcp, udp, icmp, icmpv6, udplite,esp, ah, sctp, mh or all 參看:/etc/protocols
-i 報文流入接口 只應用於INPUT、FORWARD、PREROUTING鏈
-o 報文流出接口 只應用於INPUT、FORWARD、PREROUTING鏈
-j 指定動作 ACCEPT,DROP,REJECT,RETURN, LOG, SNAT, DNAT, REDIRECT, MASQUERADE等
5.定義自定義鏈
-N:new, 自定義一條新的規則鏈
-X:delete,刪除自定義的空的規則鏈
-E:重命名自定義鏈;引用計數不為0的自定義鏈不能夠被重命名,也 不能被刪除
定義順序:
a.先定義chain名字
iptables -N WEB
b.定義一系列規則
iptables -A WEB -p tcp -m multiport --dports 80,443 -j ACCEPT
c.用-j把自定義規則放在系統某個chain中
iptables -I INPUT -s 192.168.30.0/24 -j WEB
刪除要反著一步一步來
iptables -D INPUT 1
iptables -D WEB 1
iptables -X WEB
6.記錄日誌功能
LOG: 非中斷target,本身不拒絕和允許,放在拒絕和允許規則前 並將日誌記錄在/var/log/messages系統日誌中
--log-level level 級別: emerg, alert, crit, error, warning, notice, info or debug
--log-prefix prefix 日誌前綴,用於區別不同的日誌,最多 29個字
如
iptables -I INPUT -s 10.0.1.0/24 -p tcp -m multiport -dports 80,21,22,23 -m state --state NEW -j LOG --logprefix "new connections: "
7.隱式擴展用法:不需要指定模塊名
a. tcp協議的擴展選項
--sport port[:port]:匹配報文源端口,可以為端口範圍 -p tcp --sport 22 範圍 700:800
--dport port[:port]:匹配報文目標端口,可以為範圍 -p tcp --dport 445
--tcp-flags mask comp
#mask 需檢查的標誌位列表,用,分隔 例如 SYN,ACK,FIN,RST
#comp 在mask列表中必須為1的標誌位列表,無指定則必須為 0,用,分隔
--tcp-flags SYN,ACK,FIN,RST SYN
表示要檢查 的標誌位為SYN,ACK,FIN,RST四個,其中SYN必須為1,余下 的必須為0
--syn:用於匹配第一次握手 相當於:--tcp-flags SYN,ACK,FIN,RST SYN
b. udp
--sport port[:port]:匹配報文的 源端口;可以是端口範圍
--dport port[:port]:匹配報 文的目標端口;可以是端口範圍
c.icmp
--icmp-type {type[/code]|typename}
type/code
0 echo-reply icmp應答報文
8 echo-request icmp請求報文
如 -p icmp --icmp-type 8 來拒絕請求報文
8.顯式擴展:必須使用-m選項指明模塊名
a、multiport擴展
以離散方式定義多端口匹配,最多指定15個端口
--sports port[,port|,port:port]... 指定多個源端口
--dports port[,port|,port:port]... 指定多個目標端口
--ports port[,port|,port:port]...多個源或目標端口
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp -m multiport --dports 20:22,80 -j ACCEPT
b、iprange擴展
指明連續的(但一般不是整個網絡)ip地址範圍
--src-range from[-to] 源IP地址範圍
--dst-range from[-to] 目標IP地址範圍
iptables -A INPUT -d 172.16.1.100 -p tcp --dport 80 -m iprange --src-range 172.16.1.5-172.16.1.10 -j DROP
c、mac擴展
指明源MAC地址
適用於:PREROUTING, FORWARD,INPUT chains 只適合進來的包,所以沒有目標地址
--mac-source XX:XX:XX:XX:XX:XX 源MAC
iptables -A INPUT -s 172.16.0.100 -m mac --macsource 00:50:56:12:34:56 -j ACCEPT 並且關系
iptables -A INPUT -s 172.16.0.100 -j REJECT
d、string擴展
對報文中的應用層數據做字符串模式匹配檢測
--algo {bm|kmp}:字符串匹配檢測算法 (指定一個算法)
--from offset 開始偏移 (可以不寫)
--to offset 結束偏移 (可以不寫)
--string pattern:要檢測的字符串模式
--hex-string pattern:要檢測字符串模式,16進制格式
iptables -A OUTPUT -s 172.16.100.10 -p tcp --sport 80 -m string --algo bm --string "google" -j REJECT
一般在FORWARD中設置
e、time擴展
根據將報文到達的時間與指定的時間範圍進行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]] 日期
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]
--timestart hh:mm[:ss] 時間
--timestop hh:mm[:ss]
--monthdays day[,day...] 每個月的幾號
--weekdays day[,day...] 星期幾
--kerneltz:內核時區,CentOS7系統默認為UTC,需要換算
註意: centos6 不支持kerneltz ,--localtz指定本地時區(默認)
iptables -A INPUT -s 172.16.0.0/16 -d 172.16.100.10 -p tcp --dport 80 -m time --timestart 14:30 --timestop 18:30 --weekdays Sat,Sun --kerneltz -j DROP
f、connlimit擴展
根據每客戶端IP做並發連接數數量匹配 可防止CC(Challenge Collapsar挑戰黑洞)***
--connlimit-upto n:連接的數量小於等於n時匹配
--connlimit-above n:連接的數量大於n時匹配
通常分別與默認的拒絕或允許策略配合使用
iptables -A INPUT -d 172.16.100.10 -p tcp --dport 22 -m connlimit --connlimit-above 2 -j REJECT
g、limit擴展
基於收發報文的速率做匹配
--limit rate[/second|/minute|/hour|/day]
--limit-burst number 設定初始值
iptables -I INPUT -p icmp --icmptype 8 -m limit --limit 3/minute --limit-burst 5 -j ACCEPT (限制icmp請求包。前5個不限制。後面每分鐘3個)
iptables -I INPUT 2 -p icmp -j REJECT 不滿足拒絕
h、state擴展
根據”連接追蹤機制“去檢查連接的狀態,較耗資源
NEW:新發出請求;將其識別為第一次發出的請求
ESTABLISHED:NEW狀態之後,連接追蹤信息庫中為其建立的條目失效之前期間內所進行的通信狀態 (第一次後的狀態)
RELATED:新發起的但與已有連接相關聯的連接,如: ftp協議中的數據連接與命令連接之間的關系 (相關的)
INVALID:無效的連接,如flag標記不正確
UNTRACKED:未進行追蹤的連接,如raw表中關閉追蹤
iptables -A INPUT -d 172.16.1.10 -p tcp -m multiport -dports 22,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.16.1.10 -p tcp -m multiport -sports 22,80 -m state --state ESTABLISHED -j ACCEPT
應用
被動模式開放ftp
modprobe nf_conntrack_ftp 加載跟蹤模塊
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT 開放相關端口功能
iptables -A INPUT -p tcp --dport 21 -m state -state NEW -j ACCEPT 開放21端口
9.SNAT實現(局域網訪問外部網絡技術)
作用鏈POSTROUTING,INPUT
讓本地網絡中的主機通過某一特定地址訪問外部網絡,實現地址偽裝
請求報文:修改源IP
iptables -t nat -A POSTROUTING -s LocalNET (被替換源地址) -j SNAT --to-source ExtIP (要替換外網源地址)
如
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.1.6-172.18.1.9
MASQUERADE:動態IP,如撥號網絡
如
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source MASQUERADE
10.DNAT實現(發布給外部網絡訪問的服務)
作用鏈PREROUTING , OUTPUT
把本地網絡中的主機上的某服務開放給外部網絡訪問(發 布服務和端口映射),但隱藏真實IP
請求報文:修改目標IP
iptables -t nat -A PREROUTING -d ExtIP(外網地址) -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT] (內網地址或端口)
如
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 22 -j DNAT --todestination 10.0.1.22
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.100.6 -p tcp --dport 80 -j DNAT --todestination 10.0.1.22:8080
11.實現端口轉發REDIRECT
可用於:PREROUTING OUTPUT 自定義鏈
--to-ports port[-port]
iptables -t nat -A PREROUTING -d 172.16.100.10 -p tcp --dport 80 -j REDIRECT --to-ports 8080
把用戶訪問80端口轉發到8080
12.PNAT: port nat,端口和IP都進行修改 (利用端口號來區分是哪個用戶發出來請求)一般配合SNAT
實現vsftp虛擬用戶和iptables基本用法