一俊扭、詳述iptables五鏈
1.簡(jiǎn)介
iptables是Linux系統(tǒng)上的防火墻,是一個(gè)包過濾型的防火墻,能夠根據(jù)事先定義好的檢查規(guī)則對(duì)進(jìn)出本機(jī)或者本地網(wǎng)絡(luò)的報(bào)文進(jìn)行匹配檢查隘谣,并對(duì)于能夠被規(guī)則匹配的報(bào)文作出相應(yīng)的處理動(dòng)作。
Linux系統(tǒng)上的防火墻是由iptables/nethilter組成抒蚜,其中iptables是規(guī)則的制定工具,netfilter在內(nèi)核協(xié)議框架中定義了5個(gè)卡點(diǎn)位置耘戚,并在這5個(gè)位置通過鉤子函數(shù)對(duì)進(jìn)出的數(shù)據(jù)包進(jìn)行過濾嗡髓,從而達(dá)到防火墻的功能。iptables工具工作在用戶控件收津,他可以制定一些規(guī)則然后送到內(nèi)核空間饿这,然后結(jié)合netfilter的鉤子函數(shù)及處理方法對(duì)數(shù)據(jù)包進(jìn)行放行或者拒絕處理。
五鏈:
netfilter五個(gè)鉤子對(duì)應(yīng)的圖解如下:- prerouting: 流入的數(shù)據(jù)包進(jìn)入路由表之前
- input:通過 路由表判斷后目的是本機(jī)撞秋,然后進(jìn)入本機(jī)內(nèi)部資源
- forward:通過路由表判斷后目的地不是本機(jī)长捧,然后通過路由轉(zhuǎn)發(fā)到其他地方
- output:由本機(jī)產(chǎn)生的書記向外部轉(zhuǎn)發(fā)
- postrouting:傳出的數(shù)據(jù)包到達(dá)網(wǎng)卡出口之前
報(bào)文流向:
流入本機(jī):prerouting --> input ==> 用戶空間進(jìn)程;
流出本機(jī):用戶空間進(jìn)程==> output --> postrouting吻贿;
轉(zhuǎn)發(fā):prerouting --> forward --> postrouting串结;
四表:
當(dāng)這些內(nèi)置鏈中擁有著大量的規(guī)則,其中肯定包含著不同類型的規(guī)則舅列,如過濾Ip或端口的規(guī)則肌割、修改報(bào)文的規(guī)則等等,而iptables把這些具有相同功能的規(guī)則作為表而管理存放帐要。不同的規(guī)則鏈中所能包含的規(guī)則類型是不一樣的把敞,有些鏈可能可以有地址轉(zhuǎn)換規(guī)則,有些鏈卻不能設(shè)置榨惠。那么就iptables自身內(nèi)置的四種功能表其所包含的規(guī)則能被哪些鏈所使用奋早,其分類如下:
filter:過濾表,能被INPUT冒冬、FORWARD伸蚯、OUTPUT這三個(gè)規(guī)則鏈?zhǔn)褂谩?br> nat:網(wǎng)絡(luò)地址轉(zhuǎn)換表,能被PREROUTING简烤、OUT剂邮、POSTROUTING(centos7中還包含著INPUT)使用。
mangle:報(bào)文修改表横侦,能被PREROUTING,INPUT,FORWARD,OUTPUT,POSTROUTING使用挥萌。
raw:一般是為了不再讓iptables對(duì)數(shù)據(jù)包進(jìn)行跟蹤,提高性能枉侧,能被PREROUTING,OUTPUT使用引瀑。
除此之外規(guī)則鏈中的規(guī)則是鏈?zhǔn)浇Y(jié)構(gòu),按理來說執(zhí)行的時(shí)候是有一定的順序的榨馁,但是不同的規(guī)則屬于不同的表憨栽,那么表之間的優(yōu)先順序是怎么區(qū)分的呢?其實(shí)當(dāng)一個(gè)規(guī)則鏈當(dāng)中包含了四個(gè)表filter,nat屑柔,mangle屡萤,raw時(shí),那么當(dāng)要執(zhí)行這個(gè)規(guī)則鏈中的規(guī)則時(shí)掸宛,其執(zhí)行的順序是raw>mangle>nat>filter的死陆,也就意味著同一個(gè)規(guī)則鏈中,表的優(yōu)先級(jí)為:raw>mangle>nat>filter唧瘾。
二措译、舉例實(shí)現(xiàn)iptables多端口匹配、連接追蹤饰序、字符串匹配领虹、時(shí)間匹配、并發(fā)連接限制菌羽、速率匹配掠械、報(bào)文狀態(tài)匹配等應(yīng)用
對(duì)于iptables的規(guī)則來說,其基本的功能就是根據(jù)匹配條件來嘗試匹配報(bào)文注祖,一旦匹配成功,就按照規(guī)則定義的處理動(dòng)作來處理報(bào)文均唉,其命令的使用語法為:
iptables [-t table] COMMAND [chain] [PARAMETERS] [-m matchname [per-match-options]] [-j targetname [per-target-options]]
下面分析其各個(gè)字段:
- -t table:raw, mangle, nat, filter(默認(rèn))
- COMMAND:
鏈管理:(PREROUTING是晨,INPUT,F(xiàn)ORWARD舔箭,OUTPUT罩缴,POSTROUTING)
-N:new, 自定義一條新的規(guī)則鏈(默認(rèn)鏈通過引用來生效自定義鏈)
-X: delete,刪除自定義的規(guī)則空鏈,非空自定義鏈和內(nèi)置鏈無法刪除
-P:Policy层扶,設(shè)置默認(rèn)策略箫章;無法匹配是做出的處理機(jī)制,對(duì)filter表中的鏈而言,
其默認(rèn)策略有:
ACCEPT:接受
DROP:丟棄
REJECT:拒絕
-E:重命名自定義鏈;引用計(jì)數(shù)不為0的自定義鏈不能夠被重命名镜会,也不能被刪除
-F:flush檬寂,清空指定的規(guī)則鏈,忽略鏈名時(shí),清空表中所有的鏈
-Z:zero,置零,將計(jì)數(shù)器置零
iptables的每條規(guī)則都有兩個(gè)計(jì)數(shù)器:
(1) 匹配到的報(bào)文的個(gè)數(shù)
(2) 匹配到的所有報(bào)文的大小之和
規(guī)則管理:
-A:append戳表,追加
-I:insert, 插入桶至,要指明位置,省略時(shí)表示第一條
-D:delete匾旭,刪除镣屹;(1) 指明規(guī)則序號(hào) (2) 指明規(guī)則本身
-R:replace,替換指定鏈上的指定規(guī)則
查看:
-L:list, 列出指定鏈上的所有規(guī)則
-n:numberic价涝,以數(shù)字格式顯示地址和端口號(hào)
-v:verbose女蜈,詳細(xì)信息;-vv, -vvv: 更詳細(xì)的消息
-x:exactly,顯示計(jì)數(shù)器結(jié)果的精確值伪窖;--line-numbers:顯示規(guī)則的序號(hào)
- chain:PREROUTING逸寓,INPUT,F(xiàn)ORWARD惰许,OUTPUT席覆,POSTROUTING
- 匹配條件:
一、基本匹配條件:無需加載任何模塊汹买,由iptables/netfilter自行提供.
[!] -s, --source address[/mask][,...]:檢查報(bào)文中的源IP地址是否符合此處指定的地址或范圍
[!] -d, --destination address[/mask][,...]:檢查報(bào)文中的目標(biāo)IP地址是否符合此處指定的地址或范圍
[!] -p, --protocol protocol,檢查報(bào)文中的相關(guān)協(xié)議
protocol: tcp, udp, udplite, icmp, icmpv6,esp, ah, sctp, mh or "all"{tcp|udp|icmp}
[!] -i, --in-interface name:數(shù)據(jù)報(bào)文流入的接口佩伤;只能應(yīng)用于數(shù)據(jù)報(bào)文流入的環(huán)節(jié),只能應(yīng)用于PREROUTING晦毙,INPUT和FORWARD鏈
[!] -o, --out-interface name:數(shù)據(jù)報(bào)文流出的接口生巡;只能應(yīng)用于數(shù)據(jù)報(bào)文流出的環(huán)節(jié),只能應(yīng)用于FORWARD见妒、OUTPUT和POSTROUTING鏈
二孤荣、擴(kuò)展匹配條件: 需要加載擴(kuò)展模塊,方可生效
1.隱式擴(kuò)展:不需要手動(dòng)加載擴(kuò)展模塊须揣;因?yàn)樗鼈兪菍?duì)協(xié)議的擴(kuò)展盐股,所以,只使用-p指明了協(xié)議耻卡,就表示已經(jīng)指明了要擴(kuò)展的模塊,對(duì)應(yīng)的擴(kuò)展模塊如下:
(1)tcp:
[!] --source-port, --sport port[:port]:匹配報(bào)文的源端口疯汁;可以是端口范圍
[!] --destination-port,--dport port[:port]:匹配報(bào)文的目標(biāo)端口;可以是端口范圍
[!] --tcp-flags mask comp
mask is the flags which we should examine, written as a comma-separated list卵酪,例如 SYN,ACK,FIN,RST
comp is a comma-separated list of flags which must be set幌蚊,例如SYN
例如:“--tcp-flags SYN,ACK,FIN,RST SYN”表示,要檢查的標(biāo)志位為SYN,ACK,FIN,RST四個(gè)溃卡,其中SYN必須為1溢豆,余下的必須為0
[!] --syn:用于匹配第一次握手,相當(dāng)于”--tcp-flags SYN,ACK,FIN,RST SYN“瘸羡;
(2)udp
[!] --source-port, --sport port[:port]:匹配報(bào)文的源端口漩仙;可以是端口范圍
[!] --destination-port,--dport port[:port]:匹配報(bào)文的目標(biāo)端口;可以是端口范圍
(3)icmp
[!] --icmp-type {type[/code]|typename}
echo-request:8
echo-reply:0
2.顯式擴(kuò)展:必須要手動(dòng)加載擴(kuò)展模塊最铁, [-m matchname [per-match-options]]
(1)multiport擴(kuò)展:以離散方式定義多端口匹配讯赏;最多指定15個(gè)端口
[!] --source-ports,--sports port[,port|,port:port]...:指定多個(gè)源端口
[!] --destination-ports,--dports port[,port|,port:port]...:指定多個(gè)目標(biāo)端口
[!] --ports port[,port|,port:port]...:指明多個(gè)端口
(2) iprange擴(kuò)展:指明連續(xù)的ip地址范圍(但一般不覆蓋整個(gè)網(wǎng)絡(luò))
[!] --src-range from[-to]:源IP地址
[!] --dst-range from[-to]:目標(biāo)IP地址
(3)string擴(kuò)展:對(duì)報(bào)文中的應(yīng)用層數(shù)據(jù)做字符串模式匹配檢測(cè)
[!] --algo {bm|kmp}:字符串匹配檢測(cè)算法,bm|kmp是兩種字符串檢測(cè)算法
[!] --string pattern:要檢測(cè)的字符串模式
[!] --hex-string pattern:以16進(jìn)制格式檢測(cè)的字符串模式,
(4)time擴(kuò)展:根據(jù)將報(bào)文到達(dá)的時(shí)間與指定的時(shí)間范圍進(jìn)行匹配
[!] --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:使用內(nèi)核上的時(shí)區(qū)冷尉,而非默認(rèn)的UTC
(5)connlimit擴(kuò)展:根據(jù)每客戶端IP做并發(fā)連接數(shù)數(shù)量匹配
[!]--connlimit-upto n:匹配連接的數(shù)量小于等于n的
[!]--connlimit-above n:匹配連接的數(shù)量大于n的
(6)limit擴(kuò)展:基于收發(fā)報(bào)文的速率做匹配
[!] --limit rate[/second|/minute|/hour|/day] 速率
[!] --limit-burst number 限制連接的數(shù)量
(7)state擴(kuò)展:根據(jù)”連接追蹤機(jī)制“去檢查連接的狀態(tài)
[!] --state state
conntrack機(jī)制:追蹤本機(jī)上的請(qǐng)求和響應(yīng)之間的關(guān)系漱挎;狀態(tài)有如下幾種:
NEW:新發(fā)出請(qǐng)求,連接追蹤模板中不存在此連接的相關(guān)信息而將其識(shí)別為第一次發(fā)出的請(qǐng)求
ESTABLISHED:NEW狀態(tài)之后,連接追蹤模板中為其建立的條目失效之前期間內(nèi)所進(jìn)行的通信狀態(tài)
RELATED:相關(guān)聯(lián)的連接雀哨;如ftp協(xié)議中的數(shù)據(jù)連接與命令連接之間的關(guān)系
INVALID:無效的連接
UNTRACKED:未進(jìn)行追蹤的連接
- 處理動(dòng)作:-j targetname [per-target-options]
ACCEPT:接受
DROP:丟棄,不返回?cái)?shù)據(jù)
REJECT:拒絕,返回相應(yīng)數(shù)據(jù)
RETURN:返回調(diào)用鏈
REDIRECT:端口重定向
LOG:記錄日志
MARK:做防火墻標(biāo)記
DNAT:目標(biāo)地址轉(zhuǎn)換
SNAT:源地址轉(zhuǎn)換
MASQUERADE:地址偽裝
...
自定義鏈名:調(diào)用自定義鏈作為處理動(dòng)作
例子:
##查看iptable配置
[root@wujunjie ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 39 packets, 2602 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 23 packets, 2171 bytes)
pkts bytes target prot opt in out source destination
##多端口匹配
[root@wujunjie ~]# iptables -I INPUT 1 -d 192.168.32.128 -p tcp -m multiport --dports 21,22,80,8080,443 -j ACCEPT
[root@wujunjie ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
6 428 ACCEPT tcp -- * * 0.0.0.0/0 192.168.32.128 multiport dports 21,22,80,8080,443
#在INPUT鏈中第一條位置插入一條規(guī)則:
目標(biāo)地址為192.168.32.128的協(xié)議為tcp磕谅;并且目標(biāo)端口號(hào)分別為:21,22,80,8080,443選擇接受
##連接追蹤
[root@wujunjie ~]# iptables -A INPUT -d 192.168.32.128 -p tcp -m multiport --dports 21,22,80 -m state --state INVALID -j REJECT
[root@wujunjie ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 6 packets, 428 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 192.168.32.128 multiport dports 21,22,80 state INVALID reject-with icmp-port-unreachable
#在INPUT鏈中新增一條規(guī)則:
目標(biāo)IP為192.168.32.128,tcp協(xié)議,端口為21,22,80
連接狀態(tài)為無效的連接時(shí)選擇拒絕.
##字符串匹配
[root@wujunjie ~]# iptables -A OUTPUT -s 192.168.32.128 -d 192.168.32.0/16 -p tcp --sport 80 -m string --algo bm --string "sex" -j REJECT
[root@wujunjie ~]# iptables -L -nv
Chain OUTPUT (policy ACCEPT 4 packets, 464 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 192.168.32.128 192.168.32.0/24 tcp spt:80 STRING match "sex" ALGO name bm TO 65535 reject-with icmp-port-unreachable
#在OUTPUT鏈中新增一條規(guī)則:
來源IP為192.168.32.128,目標(biāo)IP為192.168.32.0/24網(wǎng)段.tcp協(xié)議,80端口
匹配的字符串包含"sex"則選擇拒絕
##時(shí)間匹配
[root@wujunjie ~]# iptables -A INPUT -s 192.168.32.0/24 -d 192.168.32.128 -p tcp --dport 80 -m time --timestart 00:30 --timestop 12:30 --weekdays Mon,Sun -j DROP
[root@wujunjie ~]# iptables -L -nv
[root@wujunjie ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 DROP tcp -- * * 192.168.32.0/24 192.168.32.128 tcp dpt:80 TIME from 00:30:00 to 12:30:00 on Mon,Sun UTC
#在INPUT鏈中新增一條規(guī)則:
來源IP為192.168.32.0/24網(wǎng)段,目標(biāo)IP為192.168.32.128,tcp協(xié)議80端口
星期一和星期日的00:30-12:30時(shí)間段內(nèi)選擇丟棄
##并發(fā)連接限制
[root@wujunjie ~]# iptables -A INPUT -d 192.168.32.128 -p tcp --dport 21 -m connlimit --connlimit-above 2 -j REJECT
[root@wujunjie ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 192.168.32.128 tcp dpt:21 #conn src/32 > 2 reject-with icmp-port-unreachable
#在INPUT新增一條規(guī)則:
目標(biāo)IP為192.168.32.128,tcp協(xié)議,端口21
并發(fā)連接數(shù)大于2時(shí)選擇拒絕
##速率匹配
[root@wujunjie ~]# iptables -I INPUT -d 192.168.32.128 -p icmp --icmp-type 8 -m limit --limit 5/minute --limit-burst 3 -j ACCEPT
[root@wujunjie ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT icmp -- * * 0.0.0.0/0 192.168.32.128 icmptype 8 limit: avg 5/min burst 3
#在INPUT鏈插入一條規(guī)則:
目標(biāo)IP為192.168.32.128 ICMP協(xié)議,類型是8,
鏈接速率5/min,最大連接數(shù)(在5/min速率下的連接數(shù))為3,選擇接受
##報(bào)文狀態(tài)匹配
[root@wujunjie ~]# iptables -I INPUT -p tcp -m tcp --dport 22 --tcp-flags SYN,ACK,FIN,RST,URG,PSH SYN -j REJECT
[root@wujunjie ~]# iptables -L -nv
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 flags:0x3F/0x02 reject-with icmp-port-unreachable
# -m tcp使用tcp擴(kuò)展模塊,
--tcp-flags:要匹配的報(bào)文
SYN,ACK,FIN,RST,URG,PSH:報(bào)文狀態(tài)的列表,可以寫成ALL.
SYN :列表中的SYN標(biāo)志必須為1其余的必須全部為0
三私爷、舉例實(shí)現(xiàn)iptables之SNAT源地址修改及DNAT目標(biāo)地址修改和PNAT端口修改等應(yīng)用
SNAT:源地址轉(zhuǎn)換,代理內(nèi)部客戶端訪問外部網(wǎng)絡(luò)
修改ip報(bào)文中的源IP地址;只能用在POSTROUTING膊夹、INPUT鏈上衬浑、自定義鏈(但也只能被POSTROUTING、INPUT鏈調(diào)用)上放刨;
- 使用場(chǎng)景:
讓本地網(wǎng)絡(luò)中的主機(jī)可使用統(tǒng)一地址與外部通信工秩,從而實(shí)現(xiàn)地址偽裝;即轉(zhuǎn)換客戶端地址进统,一般代理本地私網(wǎng)主機(jī)到互聯(lián)網(wǎng)助币;
請(qǐng)求:由內(nèi)網(wǎng)主機(jī)發(fā)起,修改源IP螟碎,如果修改則由管理員定義眉菱;
響應(yīng):修改目標(biāo)IP,由nat自動(dòng)根據(jù)會(huì)話表中追蹤機(jī)制實(shí)現(xiàn)相應(yīng)修改掉分; - 原地址轉(zhuǎn)換:
本地內(nèi)網(wǎng)用戶訪問外網(wǎng)服務(wù)器時(shí)俭缓,在本地網(wǎng)關(guān)上進(jìn)行原地址轉(zhuǎn)換,把內(nèi)網(wǎng)用戶請(qǐng)求報(bào)文中原地址轉(zhuǎn)換為網(wǎng)關(guān)的公網(wǎng)地址與外界通信酥郭,外網(wǎng)服務(wù)器響應(yīng)內(nèi)網(wǎng)用戶時(shí)华坦,進(jìn)行目標(biāo)地址轉(zhuǎn)換,只不過響應(yīng)報(bào)文中不需要用戶參與不从,網(wǎng)關(guān)根據(jù)追蹤會(huì)話表自動(dòng)完成目標(biāo)地址轉(zhuǎn)換季春,轉(zhuǎn)發(fā)給內(nèi)網(wǎng)用戶;
DNAT:目標(biāo)地址轉(zhuǎn)換消返,將內(nèi)部服務(wù)器發(fā)布至外部網(wǎng)絡(luò)
修改ip報(bào)文中的目標(biāo)IP地址;僅用在PREROUTING和OUTPUT鏈上耘拇;
- 使用場(chǎng)景:讓本地網(wǎng)絡(luò)中的服務(wù)器使用統(tǒng)一的地址向外提供服務(wù)撵颊,但隱藏了自己的真實(shí)地址,還可實(shí)現(xiàn)負(fù)載均衡惫叛;即轉(zhuǎn)換服務(wù)器端地址倡勇,把本地私網(wǎng)主機(jī)放在互聯(lián)網(wǎng)上當(dāng)服務(wù)器;
請(qǐng)求:由外網(wǎng)主機(jī)發(fā)起嘉涌,修改其目標(biāo)地址妻熊,由管理員定義;
響應(yīng):修改原地址仑最,但有nat自動(dòng)根據(jù)會(huì)話表中的追蹤機(jī)制實(shí)現(xiàn)對(duì)應(yīng)修改扔役; - 目標(biāo)地址轉(zhuǎn)換:
外網(wǎng)用戶訪問本地內(nèi)網(wǎng)中向外提供服務(wù)的主機(jī)時(shí),本地網(wǎng)關(guān)會(huì)進(jìn)行目標(biāo)地址轉(zhuǎn)換警医,把目標(biāo)地址改為內(nèi)網(wǎng)的服務(wù)器地址亿胸,內(nèi)網(wǎng)服務(wù)器響應(yīng)外網(wǎng)用戶時(shí)坯钦,在本地網(wǎng)關(guān)上完成源地址轉(zhuǎn)換,只不過響應(yīng)報(bào)文中不需要用戶參與侈玄,根據(jù)追蹤會(huì)話表自動(dòng)完成源地址轉(zhuǎn)換婉刀;
PNAT:端口地址轉(zhuǎn)換
實(shí)現(xiàn)端口轉(zhuǎn)換,而REDIRECT能專門實(shí)現(xiàn)端口轉(zhuǎn)換機(jī)制序仙,而DNAT完成目標(biāo)端口轉(zhuǎn)換突颊,響應(yīng)報(bào)文時(shí)能自動(dòng)進(jìn)行源端口轉(zhuǎn)換;
實(shí)驗(yàn):按下圖配置網(wǎng)關(guān)主機(jī)實(shí)現(xiàn)客戶端訪問服務(wù)器,演示網(wǎng)絡(luò)防火墻功能
實(shí)驗(yàn)結(jié)構(gòu)圖
1.按上圖配置好三臺(tái)虛擬機(jī)潘悼,并按圖中ip配置好律秃,開啟網(wǎng)關(guān)主機(jī)的核心轉(zhuǎn)發(fā)功能
[root@www ~]# sysctl -w net.ipv4.ip_forward=1
net.ipv4.ip_forward = 1
##客戶端添加默認(rèn)路由,網(wǎng)關(guān)指向192.168.0.128
[root@wujunjie6 ~]# route add default gw 192.168.0.128
[root@wujunjie6 ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
192.168.0.0 * 255.255.255.0 U 1 0 0 eth0
default 192.168.0.128 0.0.0.0 UG 0 0 0 eth0
##服務(wù)端添加路由挥等,去往192.168.0.0/24網(wǎng)段的網(wǎng)關(guān)指向192.168.32.132
[root@wujunjie ~]# route add -net 192.168.0.0/24 gw 192.168.32.132
[root@wujunjie ~]# route
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
default gateway 0.0.0.0 UG 100 0 0 ens33
192.168.0.0 192.168.32.132 255.255.255.0 UG 0 0 0 ens33
192.168.32.0 0.0.0.0 255.255.255.0 U 100 0 0 ens33
##測(cè)試客戶端可以訪問服務(wù)端web服務(wù)
[root@wujunjie6 ~]# curl 192.168.32.128
1231312
2.實(shí)現(xiàn)SNAT
#NAT主機(jī)清空防火墻
[root@www ~]# iptables -F
#客戶端隱藏ip地址訪問服務(wù)端(SNAT)友绝,在NAT主機(jī)添加以下規(guī)則
[root@www ~]# iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -j SNAT --to-source 192.168.32.132
#測(cè)試客戶端訪問服務(wù)端
[root@wujunjie6 ~]# curl 192.168.32.128
1231312
#在NAT主機(jī)抓包分析看出客戶端ip被隱藏,轉(zhuǎn)換成192.168.32.132
[root@www ~]# tcpdump -i ens33 -nn tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes
15:16:12.084982 IP 192.168.32.132.35944 > 192.168.32.128.80: Flags [S], seq 1164040495, win 14600, options [mss 1460,sackOK,TS val 3334227 ecr 0,nop,wscale 6], length 0
15:16:12.085625 IP 192.168.32.128.80 > 192.168.32.132.35944: Flags [S.], seq 1545332595, ack 1164040496, win 28960, options [mss 1460,sackOK,TS val 3491777 ecr 3334227,nop,wscale 7], length 0
15:16:12.086207 IP 192.168.32.132.35944 > 192.168.32.128.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 3334228 ecr 3491777], length 0
#在服務(wù)端抓包分析肝劲,顯示原地址為192.168.32.132
[root@wujunjie ~]# tcpdump -i ens33 -nn tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes
15:17:12.161234 IP 192.168.32.132.35946 > 192.168.32.128.80: Flags [S], seq 2466142336, win 14600, options [mss 1460,sackOK,TS val 3373289 ecr 0,nop,wscale 6], length 0
15:17:12.161360 IP 192.168.32.128.80 > 192.168.32.132.35946: Flags [S.], seq 3318338433, ack 2466142337, win 28960, options [mss 1460,sackOK,TS val 3530840 ecr 3373289,nop,wscale 7], length 0
15:17:12.163915 IP 192.168.32.132.35946 > 192.168.32.128.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 3373292 ecr 3530840], length 0
3.實(shí)現(xiàn)DNAT
#在nat主機(jī)上清空nat表上所有規(guī)則
[root@www ~]# iptables -t nat -F
#使用DNAT目標(biāo)地址轉(zhuǎn)換實(shí)現(xiàn)服務(wù)端地址隱藏迁客,在nat主機(jī)添加以下規(guī)則
[root@www ~]# iptables -t nat -A PREROUTING -d 192.168.0.128 -p tcp --dport 80 -j DNAT --to-destination 192.168.32.128
#檢查NAT主機(jī)未開放80端口
[root@www ~]# ss -tnl
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 127.0.0.1:6010 *:*
LISTEN 0 128 127.0.0.1:6011 *:*
LISTEN 0 128 :::111 :::*
LISTEN 0 128 :::22 :::*
LISTEN 0 128 ::1:631 :::*
LISTEN 0 100 ::1:25 :::*
LISTEN 0 128 ::1:6010 :::*
LISTEN 0 128 ::1:6011 :::*
#測(cè)試客戶端訪問服務(wù)端
[root@wujunjie6 ~]# curl 192.168.0.128
1231312
##在NAT主機(jī)抓包分析看出目的ip轉(zhuǎn)換成192.168.32.128
[root@www ~]# tcpdump -i ens33 -nn tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes
16:46:40.017036 IP 192.168.0.129.52202 > 192.168.32.128.80: Flags [S], seq 545915071, win 14600, options [mss 1460,sackOK,TS val 8747652 ecr 0,nop,wscale 6], length 0
16:46:40.017522 IP 192.168.32.128.80 > 192.168.0.129.52202: Flags [S.], seq 3578174836, ack 545915072, win 28960, options [mss 1460,sackOK,TS val 8905188 ecr 8747652,nop,wscale 7], length 0
16:46:40.018382 IP 192.168.0.129.52202 > 192.168.32.128.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 8747653 ecr 8905188], length 0
16:46:40.018577 IP 192.168.0.129.52202 > 192.168.32.128.80: Flags [P.], seq 1:175, ack 1, win 229, options [nop,nop,TS val 8747654 ecr 8905188], length 174
16:46:40.019309 IP 192.168.32.128.80 > 192.168.0.129.52202: Flags [.], ack 175, win 235, options [nop,nop,TS val 8905189 ecr 8747654], length 0
#在客戶端抓包分析,顯示響應(yīng)地址來自192.168.0.128辞槐,而非192.168.32.128掷漱,隱藏了服務(wù)端地址
[root@wujunjie6 ~]# tcpdump -i eth0 -nn tcp port 80
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on eth0, link-type EN10MB (Ethernet), capture size 65535 bytes
16:51:30.171203 IP 192.168.0.129.52204 > 192.168.0.128.80: Flags [S], seq 390783522, win 14600, options [mss 1460,sackOK,TS val 9029300 ecr 0,nop,wscale 6], length 0
16:51:30.174714 IP 192.168.0.128.80 > 192.168.0.129.52204: Flags [S.], seq 157251816, ack 390783523, win 28960, options [mss 1460,sackOK,TS val 9186835 ecr 9029300,nop,wscale 7], length 0
16:51:30.174767 IP 192.168.0.129.52204 > 192.168.0.128.80: Flags [.], ack 1, win 229, options [nop,nop,TS val 9029304 ecr 9186835], length 0
4.實(shí)現(xiàn)PNAT
#將服務(wù)器端口監(jiān)聽8080端口確保客戶端通過端口轉(zhuǎn)換能被訪問
[root@wujunjie ~]# vim /etc/httpd/conf/httpd.conf
Listen 8080
[root@wujunjie ~]# systemctl restart httpd
#修改NAT主機(jī)第一條PREROUTING規(guī)則
[root@www ~]# iptables -t nat -R PREROUTING 1 -d 192.168.0.128 -p tcp --dport 80 -j DNAT --to-destination 192.168.32.128:8080
#客戶端仍然訪問192.168.0.128的80端口榄檬,結(jié)果仍可以服務(wù)端
[root@wujunjie6 ~]# curl 192.168.0.128
1231312
#在NAT主機(jī)抓包分析卜范,看出目標(biāo)地址端口被轉(zhuǎn)換成192.168.32.128:8080
[root@www ~]# tcpdump -i ens33 -nn tcp port 8080
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens33, link-type EN10MB (Ethernet), capture size 65535 bytes
08:43:07.345164 IP 192.168.0.129.56696 > 192.168.32.128.8080: Flags [S], seq 2887035108, win 14600, options [mss 1460,sackOK,TS val 996761 ecr 0,nop,wscale 6], length 0
08:43:07.345521 IP 192.168.32.128.8080 > 192.168.0.129.56696: Flags [S.], seq 3239447526, ack 2887035109, win 28960, options [mss 1460,sackOK,TS val 997210 ecr 996761,nop,wscale 7], length 0
08:43:07.346180 IP 192.168.0.129.56696 > 192.168.32.128.8080: Flags [.], ack 1, win 229, options [nop,nop,TS val 996762 ecr 997210], length 0
四、簡(jiǎn)述sudo安全切換工具鹿榜,及詳細(xì)講解visudoer
1.簡(jiǎn)介
sudo命令Linux系統(tǒng)管理指令海雪,是允許系統(tǒng)管理員讓普通用戶執(zhí)行一些或全部的root命令的一個(gè)工具。sudo命令提供了豐富的日志舱殿,詳細(xì)記錄了每個(gè)用戶干了什么奥裸,并且使用時(shí)間戳來對(duì)用戶通過了sudo執(zhí)行認(rèn)證的有效期進(jìn)行限制。sudo命令相關(guān)信息存放在/etc/sudoers文件中沪袭,執(zhí)行sudo命令的用戶需提前將自己用戶名及可執(zhí)行命令等相關(guān)信息添加到該文件當(dāng)中湾宙。sudo命令的執(zhí)行無需知道超級(jí)管理員密碼,因此部分系統(tǒng)甚至利用sudo來使得一般用戶取代root作為管理賬號(hào)使用冈绊。
2.sudo命令
sudo [options] COMMAND
-u username:以指定用戶的身份運(yùn)行命令侠鳄;
-l:列出用戶能以sudo方式執(zhí)行的所有命令;
-k:清除(密碼)此前緩存用戶成功認(rèn)證的結(jié)果死宣;
3.visudo命令
sudo命令的配置文件為/etc/sudoers文件伟恶,里面記錄了sudo用戶的權(quán)限信息即分組信息。/etc/sudoers文件只能通過visudo命令進(jìn)行編輯修改十电,為的是防止有多個(gè)用戶同時(shí)修改此文件知押,并且進(jìn)行相應(yīng)的語法檢查叹螟。默認(rèn)情況下,visudoers是不會(huì)保存有語法錯(cuò)誤的配置文件台盯,但它會(huì)提示相應(yīng)的錯(cuò)誤罢绽,并詢問如何處理。
- 授權(quán)文件有兩類內(nèi)容:
(1)別名的定義静盅,即為變量良价;
(2)授權(quán)項(xiàng),可使用別名進(jìn)行授權(quán)蒿叠,要先定義別名明垢; - 授權(quán)項(xiàng)(每一行一個(gè)授權(quán)項(xiàng))格式:
who where=(runas) commands
#誰 通過哪些主機(jī)=(以誰的身份) 運(yùn)行什么命令
who:用戶
username:?jiǎn)蝹€(gè)用戶;
#uid:?jiǎn)蝹€(gè)用戶的ID號(hào)市咽;
%groupname:組內(nèi)的所有用戶痊银;
%#gid:組內(nèi)的所有用戶;
user_alias:用戶別名施绎;
where:主機(jī)地址
ip或hostname:?jiǎn)蝹€(gè)主機(jī)溯革;
NetAddr:網(wǎng)絡(luò)地址;支持多種表示格式谷醉;
host_alias:主機(jī)別名致稀;
whom(ranas):以指定用戶身份運(yùn)行
username:?jiǎn)蝹€(gè)用戶;
#uid:?jiǎn)蝹€(gè)用戶的ID號(hào)俱尼;
runas_alias:以指定用戶身份運(yùn)行抖单;
commands:命令
command:?jiǎn)蝹€(gè)命令;
directory:指定目錄內(nèi)的所有應(yīng)用程序遇八;
sudoedit:特殊權(quán)限矛绘,可編輯sudoers文件,可用于向其它用戶授予sudo權(quán)限刃永;
示例:
fedora ALL=(root) /usr/sbin/useradd, /usr/sbin/usermod
#fedora:定義的用戶
#ALL=(root):指定用戶蔑歌,不寫表示所有用戶;
#/usr/sbin/useradd, /usr/sbin/usermod 可運(yùn)行的命令揽碘;
- 定義別名的方法:
ALIAS_TYPE NAME=item1,item2,...
ALIAS_TYPE:4種,注意書寫格式大小寫
User_Alias:授權(quán)用戶別名類型
Host_Alias:主機(jī)別名類型
Runas_Alias:作為哪些用戶執(zhí)行的別名類型
Cmnd_Alias:命令別名類型
示例:
User_Alias NETADMIN=jeck,magedu
#用NETADMIN來表示jeck,magedu這些用戶
Cmnd_Alias NETCMND=ip, ifconfig, route
#用NETCMND這個(gè)別名去代表ip, ifconfig, route
NETADMIN localhost=(root) NETCMND
#這個(gè)NETADMIN用戶別名里的用戶在本地主機(jī)中可以root的身份執(zhí)行NETCMND這個(gè)命令別名里面的命令
4.綜合示例
[root@wujunjie ~]# visudo
##添加以下命令
Cmnd_Alias ADMINCOMMANDS1=/usr/bin/passwd,!/usr/bin/passwd root
#定義命令別名組2
Cmnd_Alias ADMINCOMMANDS2=/usr/sbin/shutdown,/usr/sbin/reboot
#定義用戶別名組
User_Alias ADMINUSERS=wujunjie
#定義sudo命令授權(quán)規(guī)則
ADMINUSERS ALL=(root) NOPASSWD:ADMINCOMMANDS1,PASSWD:ADMINCOMMANDS2
##驗(yàn)證
[wujunjie@wujunjie ~]$ sudo -l #列出用戶能以sudo方式執(zhí)行的所有命令园匹;
Matching Defaults entries for wujunjie on this host: #匹配此主機(jī)上 wujunjie的默認(rèn)條目:
!visiblepw, always_set_home, env_reset, env_keep="COLORS DISPLAY HOSTNAME HISTSIZE KDEDIR LS_COLORS", env_keep+="MAIL PS1 PS2
QTDIR USERNAME LANG LC_ADDRESS LC_CTYPE", env_keep+="LC_COLLATE LC_IDENTIFICATION LC_MEASUREMENT LC_MESSAGES",
env_keep+="LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER LC_TELEPHONE", env_keep+="LC_TIME LC_ALL LANGUAGE LINGUAS _XKB_CHARSET
XAUTHORITY", secure_path=/sbin\:/bin\:/usr/sbin\:/usr/bin
User wujunjie may run the following commands on this host: #用戶 wujunjie 可以在該主機(jī)上運(yùn)行以下命令:
(root) NOPASSWD: /usr/bin/passwd, !/usr/bin/passwd root, (root) PASSWD: /usr/sbin/shutdown, /usr/sbin/reboot
[root@wujunjie ~]# su - wujunjie
Last login: Fri Nov 2 09:00:39 CST 2018 on pts/0
[wujunjie@wujunjie ~]$ sudo passwd root
Sorry, user wujunjie is not allowed to execute '/bin/passwd root' as root on wujunjie.
#提示無法以wujunjie用戶無法以root用戶的身份執(zhí)行/bin/passwd root
[wujunjie@wujunjie ~]$ sudo passwd www
Changing password for user www.
New password:
BAD PASSWORD: The password is shorter than 8 characters
Retype new password:
passwd: all authentication tokens updated successfully.
#更改www密碼用戶成功
[wujunjie@wujunjie ~]$ sudo shutdown -r now
[sudo] password for wujunjie:
#以root身份重啟提示需要密碼