Firewall
工作于網(wǎng)絡(luò)(網(wǎng)絡(luò)防火墻)或主機(主機防火墻)的邊緣(通信報文的進出口)氛魁,對于進出本網(wǎng)絡(luò)或主機的報文根據(jù)事先定義的檢查規(guī)則作匹配檢測肥橙,對于能夠被規(guī)則匹配到的報文作出相應(yīng)處理
發(fā)展歷程: ipfw-->ipchains-->iptables
iptables/netfilter
- netfilter: 是kernel代碼
hooks function
iptables: cli女阀,是命令行程序 - rules utility
netfilter有5個鉤子:路由前巴刻,路由后械拍,input輸入隊列耸别,output輸出隊列,forward轉(zhuǎn)發(fā)隊列
netfilter:有5個鉤子函數(shù)
prerouting,input,forward,output,postrouting
報文流向:
流入本機:prerouting --> input ==> 用戶空間進程奸汇;
流出本機:用戶空間進程==> output --> postrouting施符;
轉(zhuǎn)發(fā):prerouting --> forward --> postrouting;
iptables有五個內(nèi)置規(guī)則鏈(名稱需大寫)
PREROUTING
INPUT
FORWARD
OUTPUT
POSTROUTING自定義鏈:要手動添加關(guān)聯(lián)關(guān)系鉤子函數(shù)上才起作用
五個內(nèi)置規(guī)則分別對應(yīng)的iptables在linux系統(tǒng)中作用的五個位置
PREROUTING 對應(yīng) 從網(wǎng)卡進入到內(nèi)核空間中
INPUT 對應(yīng) 從內(nèi)核空間到用戶空間
FORWARD 對應(yīng) 從一個網(wǎng)卡轉(zhuǎn)發(fā)到另一個網(wǎng)卡
OUTPUT 對應(yīng) 從用戶空間到內(nèi)核空間
POSTROUTING 對應(yīng) 從內(nèi)核空間到網(wǎng)卡
iptables自身內(nèi)置的四種功能表
- filter:實現(xiàn)過濾茫蛹,防火墻
- nat:network address translation操刀,相當于mangle中的一部分功能烁挟,(修改ip層地址婴洼,傳輸層地址);主要完成源和目標IP撼嗓、源和目標端口的修改柬采;
- mangle:實現(xiàn)拆解報文,按需修改之后且警,重新封裝
- raw:關(guān)閉在nat表上啟用的連接追蹤機制
表和鏈的對應(yīng)關(guān)系
表<==>鏈
- filter表對應(yīng):INPUT, FORWARD, OUTPUT鏈
過濾功能要在以上3個鉤子上進行粉捻; - mangle表對應(yīng):PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING鏈
- nat表對應(yīng):PREROUTING, OUTPUT, POSTROUTING,INPUT鏈
- raw表對應(yīng):PREROUTING, OUTPUT鏈
都能實現(xiàn)地址轉(zhuǎn)換
同一鏈上的不同的表的規(guī)則的應(yīng)用優(yōu)先級:由高到底
raw>mangle>nat>filter
數(shù)據(jù)包過濾匹配流程
報文到達本機斑芜,到達prerouting鏈肩刃,有三種功能,raw杏头,mangle盈包,nat;--> 路由選擇
如果到內(nèi)部input鏈有兩功能醇王,mangle呢燥,filter
iptables規(guī)則
組成部分:根據(jù)規(guī)則的匹配條件嘗試匹配報文,對匹配成功的報文根據(jù)規(guī)則定義的處理動作作出處理寓娩;
規(guī)則要添加在鏈上叛氨,才生效呼渣;添加在自定義上不會自動生效;
鏈
- 內(nèi)置鏈:每個內(nèi)置鏈對應(yīng)于一個鉤子函數(shù)寞埠;
- 自定義鏈:用于對內(nèi)置鏈進行擴展或補充屁置,可實現(xiàn)更靈活的規(guī)則組織管理機制;
只有鉤子調(diào)用自定義鏈時畸裳,才生效缰犁;
鏈上的規(guī)則次序,即為檢查的次序怖糊;因此帅容,隱含一定的應(yīng)用法則;
(1)同類規(guī)則(訪問同一應(yīng)用)伍伤,匹配范圍小的放上面
(2)不同類的規(guī)則(訪問不同的應(yīng)用)并徘,匹配到報文頻率較大的放在上面;
(3)將那些可由一條規(guī)則描述的多個規(guī)則合并起來扰魂;
(4)設(shè)置默認策略麦乞;
添加規(guī)則的考量點:
(1)要實現(xiàn)何種功能:判斷添加規(guī)則至哪個表上;
(2)確定報文流經(jīng)的位置劝评;判斷添加規(guī)則至哪個鏈上姐直;
功能確定了使用的鉤子就確定了;
盡量定義在最開始處蒋畜;
iptables命令
高度模塊化声畏,由諸多擴展模塊實現(xiàn)其檢查條件或處理動作的定義
/usr/lib64/xtables/
IPV6:libip6t_
IPV4:libipt_,libxt_
在centos7系統(tǒng)上,學習姻成,建議:
systemctl stop firewalld.service
systemctl disable firewalld.service
在centos6系統(tǒng)上插龄,學習建議:
service iptables stop
chkconfig iptables off
iptables格式:iptables [-t table] COMMAND chain [rulenum] [-m machename [per-match-options]] [-j targetname [per-target-options] [options]
iptables [-t table] {-A|-C|-D} chain rule-specification
iptables [-t table] -I chain [rulenum] rule-specification
iptables [-t table] -R chain rulenum rule-specification
iptables [-t table] -D chain rulenum
iptables [-t table] -S [chain [rulenum]]
iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
iptables [-t table] -N chain
iptables [-t table] -X [chain]
iptables [-t table] -P chain target
iptables [-t table] -E old-chain-name new-chain-name
rule-specification = [matches...] [target]
match = -m matchname [per-match-options]
target = -j targetname [per-target-options]
-t tables:指定表,不指定的話科展,默認為filter均牢;
raw, mangle, nat, [filter]
[root@promote ~]# iptables -t nat -L
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
SUBCOMMAND:實現(xiàn)增、刪才睹、改徘跪、查
鏈管理:
-N:新增一條自定義鏈;
-X:delete琅攘,刪除自定義的空鏈垮庐;先清除規(guī)則,才能刪除鏈乎澄;
-P:policy突硝,設(shè)置鏈的默認策略;
①ACCEPT:接受置济;
②DROP:丟棄解恰;不響應(yīng)锋八;
③REJECT:拒絕;
-E:rename护盈,重命名自定義的未被引用的鏈挟纱;(引用計數(shù)為0)
規(guī)則管理:
-A:append,追加腐宋,默認為最后一個紊服;
-I:insert,默認插入胸竞,默認為第一個欺嗤;
-D:delete,刪除卫枝,兩種格式煎饼,指定規(guī)則或指定規(guī)則條數(shù);
(1)rule specification
(2)rule number
-R:replace替換校赤,類似-D吆玖,指明替換哪一條;rule number
-F:flush马篮,清空規(guī)則表沾乘,沖刷規(guī)則,可沖表上的一條鏈浑测,也沖掉一個表上的所有鏈翅阵,也可指明沖掉哪條鏈上的哪條規(guī)則;
-Z:zero尽爆,置0怎顾;給iptables計數(shù)器置0读慎;
iptables的每條規(guī)則漱贱,都有兩個計數(shù)器:
(1)有本規(guī)則匹配到的所有的packets
(2)由本規(guī)則匹配到的所有packets大小之和
-S:列出規(guī)則selected,以iptables-save命令的格式顯示鏈上的規(guī)則夭委;
可重定向保存規(guī)則幅狮;相當于iptables-save命令;
查看:
-L:list株灸,列出規(guī)則崇摄;
-n:numeric,以數(shù)字格式顯示地址和端口慌烧;禁止反解端口號對應(yīng)的服務(wù)名逐抑;
-v:verbose,顯示詳細信息屹蚊;支持-vv厕氨,-vvv
-x:exactly进每,顯示計數(shù)器的精確值而非單位換算后的結(jié)果;
每一條iptables規(guī)則都有兩個計數(shù)器命斧,一個是被本規(guī)則記錄匹配的報文個數(shù)田晚,第二個被本規(guī)則記錄匹配到的所有報文的大小,數(shù)值大時自動顯示換算單位国葬,但結(jié)果不準確贤徒;
--line-numbers:顯示鏈上的規(guī)則的編號;
[root@promote ~]# iptables -L -n --line-numbers
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:53
2 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
3 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp dpt:67
4 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
5 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
6 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
7 INPUT_direct all -- 0.0.0.0/0 0.0.0.0/0
這就是為什么-D刪除規(guī)則條目時汇四,有兩種方式接奈,一是指明規(guī)則編號,二是指明具體規(guī)則通孽;
組合使用:-nvL鲫趁,L要寫在后面;
[root@promote ~]# iptables -nvL
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:53
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:53
0 0 ACCEPT udp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 udp dpt:67
0 0 ACCEPT tcp -- virbr0 * 0.0.0.0/0 0.0.0.0/0 tcp dpt:67
50 3796 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate RELATED,ESTABLISHED
0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
3 429 INPUT_direct all -- * * 0.0.0.0/0 0.0.0.0/0
3 429 INPUT_ZONES_SOURCE all -- * * 0.0.0.0/0 0.0.0.0/0
3 429 INPUT_ZONES all -- * * 0.0.0.0/0 0.0.0.0/0
0 0 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID
3 429 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
常見用法
iptables -nL
查看防火墻設(shè)置利虫;沒指明任何表挨厚,查看filter,在3個鏈上INPUT,FORWARD,OUTPUT糠惫;
iptables -t nat -nL
查看nat表疫剃,可出現(xiàn)在4個鏈上PREROUTING,INPUT,OUTPUT,POSTROUTING;
注意:在centos6系統(tǒng)上,nat表不能在INPUT上硼讽;
iptables -t mangle -nL
查看mangle表巢价,可出現(xiàn)5個鏈;
iptables -t raw -nL
查看raw表固阁,可出現(xiàn)2個鏈壤躲;其中policy ACCEPT叫默認策略;
iptables -E testchain mychain
重命名自定義鏈為mychain备燃;
iptables -X mychain
只能刪除空鏈碉克;
iptables -t filter -P FORWARD DROP
設(shè)定FORWARD默認策略,過濾為丟棄轉(zhuǎn)發(fā),-t filter可省略并齐;
注意:使用遠程連接時漏麦,不能把input改為drop否則無法連接;
iptables -P INPUT DROP
設(shè)置INPUT默認策略;
iptables -P OUTPUT DROP
設(shè)置OUTPUT默認策略;
iptables -nL INPUT
查看指定某個鏈上的規(guī)則况褪;
iptables -nvL
查看詳細信息撕贞,可顯示可易讀的單位;
iptables -nvxL
查看詳細信息测垛,且顯示單位為字節(jié)捏膨;
iptables -nvxL --line-number
顯示規(guī)則編號;
iptables -nvvxL --line-number
顯示更詳細信息食侮;
iptables -nvvvxL --line-number
顯示更多更詳細信息号涯;
iptables -S
顯示添加的規(guī)則命令熬北;
iptables -S INPUT
匹配條件:matches
rpm -ql iptables
查看安裝后生成的文件
其中:
以小寫字母.so結(jié)尾的一般為matches模塊;例如:/usr/lib64/xtables/libxt_addrtype.so
以大寫字母.so結(jié)尾的一般為target模塊诚隙;例如:/usr/lib64/xtables/libipt_REJECT.so
寫每一條規(guī)則時讶隐,怎么處理的叫做target翎蹈,指明匹配條件叫做matches箱季;純小寫字母模塊是用來擴展匹配條件的黎休,純大寫字母的模塊是用來擴展怎么處理的据德;
基本匹配:netfilter自帶的匹配機制
[!] -s, --source address[/mask][,...]:指明原地址(范圍)匹配蛤高;嘆號表示取反废赞;
[!] -d, --destination address[/mask][,...]:目標地址匹配复颈;
[!] -i, --in-interface name:限制報文流入的接口傅瞻,只能用于PREROUTING,INPUT,FORWARD鏈上脉执;用于前半段疼阔;
[!] -o, --out-interface name:限制報文流出的接口,只能用于OUTPUT,FORWARD,POSTROUTING鏈上半夷;用于后半段婆廊;
[!] -p{tcp|udp|icmp}:限制協(xié)議;
用法
此時在本機地址為172.18.11.114巫橄,在遠程主機172.18.11.111不能ping通淘邻,ssh鏈接也無法登錄;
iptables -A INPUT -s 172.18.0.0/16 -j ACCEPT
指定原IP地址可入棧湘换,目標地地址不限制宾舅;
iptables -A OUTPUT -d 172.18.0.0/16 -j ACCEPT
指定目標IP地址可出棧,源地址不限制彩倚,肯定為本機地址筹我;
此時172.18.11.111可ping通本地主機
設(shè)置僅172.18.11.112能連接本機;
iptables -A INPUT -s 172.18.11.112 -d 172.18.11.114 -j ACCEPT
設(shè)置入棧放行帆离;
iptables -A OUTPUT -d 172.18.11.112 -s 172.18.11.114 -j ACCEPT
設(shè)置出棧放行蔬蕊;
此時,只有172.18.11.112能ping同本地主機盯质;
設(shè)置處理除了172.18.11.112不能連接本機袁串,其它主機均可連接概而;
iptables -A INPUT ! -s 172.18.11.112 -d 172.18.11.114 -j ACCEPT
iptables -A OUTPUT ! -d 172.18.11.112 -s 172.18.11.114 -j ACCEPT
此時呼巷,只有172.18.11.112不能連接本地主機;
設(shè)置僅允許172.18網(wǎng)段的tcp連接本機
iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -j ACCEPT
iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -j ACCEPT
此時赎瑰,在172.18.11.111主機不能ping通本機王悍,但可以ssl本機;
注意:ping不通不能說明不能訪問餐曼,每一種協(xié)議都有專用的擴展压储;可擴展的內(nèi)容就是協(xié)議中的部分字段鲜漩;
使用at設(shè)置定時計劃任務(wù)定義2小時后,清空規(guī)則把所有策略改為accept集惋,以防自己設(shè)定規(guī)則后孕似,被禁止登陸;
擴展匹配:經(jīng)由擴展模塊引入的匹配機制刮刑,使用: -m matchname
擴展匹配分為兩類:
- 隱式擴展:可以不使用-m選項專門加載相應(yīng)模塊喉祭;前提是要使用-p選項可匹配何種協(xié)議;
[!] -p {tcp|upd|icmp}:限制協(xié)議雷绢;每個協(xié)議都有專用的擴展條件泛烙; - 顯示擴展:明確指定擴展,使用-m指明擴展模塊翘紊;
隱式擴展:使用-p或--Protocol
[!] -p,--protocol PROTOCOL PROTOCOL;
協(xié)議:tcp蔽氨,udp,icmp帆疟,icmpv6鹉究,esp(有效載荷協(xié)議),ah(驗證頭協(xié)議)踪宠,sctp(流控協(xié)議)坊饶,mh或all
tcp:隱含指明了-m tcp
[!] --source-port,--sport port[:port]:匹配報文中的tcp首部的源端口,可以是端口范圍殴蓬;
: port表示為從0開始到指定的端口匿级;
port :表示為從指定端口開始到最大端口;
[!] --destination-port,--dport port[:port]:匹配報文中的tcp首部的目標端口染厅,可以是端口范圍痘绎;
[!] --tcp-flags mask comp:檢查報文中mask指明的tcp標志位,而要這些標準位comp中必須為1肖粮;例如:
--tcp-flags syn,fin,ack,rst syn 表示檢查tcp第一次握手中的4個標志位孤页,syn必須為1,其它3個必須為0涩馆;
--tcp-flags syn,fin,ack,rst ack,fin 表示檢查tcp四次斷開中行施,請求斷開的報文,4個標志位魂那,ack,fin必須為1蛾号,其它2個必須為0;[!] --syn:用于匹配第一次握手涯雅,相當于“--tcp-flags syn,fin,ack,rst syn”
udp:隱含指明了-m udp
[!] --source-port,--sport port[:port]:匹配報文中的udp首部的源端口鲜结,可以是端口范圍;
[!] --destination-port,--dport port[:port]:匹配報文中的udp首部的目標端口,可以是端口范圍精刷;
icmp:隱含指明了-m icmp
[!] --icmp-type {type[/code]|typename}
type/code:
0/0: echo reply 回顯應(yīng)答
8/0: echo request ping請求
注意:如果要設(shè)置默認DROP的策略拗胜,建議只開放指定主機IP地址ssh服務(wù),以便能遠程登錄怒允;
例如:
yum -y install httpd vsftpd telnet-server samba
開啟以上安裝的服務(wù)
用法
放行本地主機ssh服務(wù)埂软,任意主機可遠程登錄本機
iptables -A INPUT -s 0/0 -d 172.18.11.114 -p tcp --dport 22 -j ACCEPT
入棧規(guī)則,-s 0/0可省略默認為所有地址纫事;
iptables -A OUTPUT -s 172.18.11.114 -d 0/0 -p tcp --sport 22 -j ACCEPT
出棧規(guī)則仰美;
iptables -P INPUT DROP
默認策略設(shè)為禁止訪問;所有服務(wù)禁止訪問本機儿礼;
瀏覽器不能訪問172.18.11.114網(wǎng)頁咖杂;
開放本機80端口
iptables -A INPUT -d 172.18.11.114 -p tcp --dport 80 -j ACCEPT
入棧規(guī)則;
iptables -A OUTPUT -s 172.18.11.114 -p tcp --sport 80 -j ACCEPT
出棧規(guī)則蚊夫;
瀏覽器可訪問172.18.11.114網(wǎng)頁诉字;
DNS服務(wù)器中的udp協(xié)議:
本機為DNS服務(wù)器時,開放給所有主機服務(wù)知纷,此時本機為服務(wù)器端壤圃,入棧的是客戶端請求,目標端口為本機53琅轧,響應(yīng)時出棧為本機53端口伍绳;當解析不了時,還有迭代方式去查詢頂級DNS服務(wù)器等乍桂,此時本機為客戶端冲杀,出棧為本機隨機端口,目標端口為別人的53端口睹酌,入棧時源端口是別人的53权谁,目的端口為本機隨機端口;在這2種場景中憋沿,寫規(guī)則時的入棧和出棧是不同的旺芽;要添加4條規(guī)則;因為有2條入棧辐啄,2條出棧采章;
ping命令中的ICMP協(xié)議:
其中:
00 協(xié)議類型和代碼:表示ping應(yīng)答;
80 協(xié)議類型和代碼:表示ping請求壶辜;
本機被ping時悯舟,別人的請求時,icmp協(xié)議類型士复,入棧為8图谷,出棧是0翩活;
本機ping別人時阱洪,icmp協(xié)議類型便贵,出棧是8,入棧是0冗荸;
允許自己png別人承璃,禁止別人ping自己:
iptables -A OUTPUT -s 172.18.11.114 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT
出棧設(shè)置
iptables -A INPUT -s 0/0 -d 172.18.11.114 -p icmp --icmp-type 0 -j ACCEPT
入棧設(shè)置
開放別人可ping自己:
iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -j ACCEPT
入棧設(shè)置
iptables -A OUTPUT -s 172.18.11.114 -p icmp --icmp-type 0 -j ACCEPT
出棧設(shè)置
顯示擴展
multiport:多端口匹配
以離散方式定義多端口匹配,最多可以指定15個端口蚌本;
[!] --source-ports,--sports-port[,port|,port:port]... 指定多個源端口
[!] --destination-ports,--dports-port[,port|,port:port]... 指定多個目標端口
[!] --ports port[,port|,port:port]...
例如:顯示擴展盔粹,多端口一條規(guī)則指明:開放22和80端口:
iptables -I INPUT -s 0/0 -d 172.18.11.114 -p tcp -m multiport --dports 22,80 -j ACCEPT
iptables -I OUTPUT -d 0/0 -s 172.18.11.114 -p tcp -m multiport --sports 22,80 -j ACCEPT
iprange:指明一段連續(xù)的ip地址范圍作為原地址或目標地址匹配
[!] --src-range from[-to]:原地址范圍;
[!] --dst-range from[-to]:目標地址范圍程癌;
iptables -I INPUT -d 172.16.0.67 -p tcp --dport 23 -m iprange --src-range 172.16.0.60-172.16.0.70 -j ACCEPT
iptables -I ONPUT -s 172.16.0.67 -p tcp --sport 23 -m iprange --dst-range 172.16.0.60-172.16.0.70 -j ACCEPT
string:對報文中的應(yīng)用層數(shù)據(jù)做字符串匹配檢測舷嗡;對內(nèi)核版本要大于2.6.14
--algo {bm|kmp}:算法
(mbboyer-moore,kmp=knuth-pratt-morris)
[!] --string pattern:給定要檢查的字符串模式嵌莉;
[!] --hex-string pattern:給定要檢查的字符串模式进萄,十六進制;
注意:要把匹配嚴格的規(guī)則放在松散規(guī)則之上锐峭;如果target相同中鼠,松散的放上面,如果target不同沿癞,嚴格的規(guī)則放上面援雇;
例如:禁止響應(yīng)頁面內(nèi)容有test字樣
iptables -I OUTPUT -s 172.18.11.114 -d 0/0 -p tcp --sport 80 -m string --algo bm --string "test" -j REJECT
time:根據(jù)收到報文的時間/日期與指定的時間/日期范圍進行匹配
--datestart YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:起始日期時間;
--datestop YYYY[-MM[-DD[Thh[:mm[:ss]]]]]:結(jié)束日期時間椎扬;
--timestart hh:mm[:ss]:起始時間惫搏;
--timestop hh:mm[:ss]:結(jié)束時間;
[!] --monthdays day[,day...]:匹配一個月中的哪些天蚕涤;
[!] --weekdays day[,day...]:匹配一個周中的哪些天晶府;
例如:在工作時間內(nèi)9:00-16:00,放行訪問telnet服務(wù)
iptables -R INPUT 4 -d 172.18.11.114 -p tcp --dport 23 -m iprange --src-range 172.18.11.1-172.18.11.111 -m time --timestart 09:00:00 --timestop 16:00:00 --weekdays 1,2,3,4,5 -j ACCEPT
connlimit:根據(jù)每客戶端做并發(fā)連接數(shù)限制钻趋,即每客戶端最多發(fā)起的連接數(shù)量
--connlimit-upto n:連接數(shù)量小于等于n川陆,則匹配;
--connlimit-abvoe n:連接數(shù)量大于n則匹配蛮位;
例如:限制每臺主機訪問telnet最大并發(fā)數(shù)為2個
iptables -A INPUT -s 0/0 -d 172.18.11.114 -p tcp --dport 23 -m connlimit --connlimit-upto 2 -j ACCEPT
limit:基于令牌桶算法對報文的速率進行匹配
--limit rate[/second|/minute|/hour|/day]
--limit-burst number
限制本機某tcp服務(wù)接受新請求的速率:--syn较沪,-m limit
例如:允許別人ping設(shè)置一分鐘20包,突發(fā)值為3失仁,表示一次ping需要3秒尸曼;
iptables -R INPUT 5 -d 172.18.11.114 -p icmp --icmp-type 8 -m limit --limit 20/minute --limit-burst 3 -j ACCEPT
state:是conntrack的子集,用于實現(xiàn)對報文的狀態(tài)做連接追蹤
[!] --state state
狀態(tài) | 作用 |
---|---|
INVALID | 無法識別的連接 |
ESTABLISHED | 連接追蹤模板當中存在的記錄的連接 |
NEW | 連接追蹤模板當中不存在的連接請求 |
RELATED | 相關(guān)聯(lián)的連接 |
UNTRACKED | 未追蹤的連接 |
模板記錄占滿時萄焦,再有請求會被超時處理控轿;
通常前端負載均衡器通常不要開啟連接追蹤功能冤竹;
已經(jīng)追蹤到的并記錄下來的連接(保存位置):/proc/net/nf_conntrack
例如:查看已追蹤并記錄到的連接信息;
cat /proc/net/nf_conntrack
連接追蹤功能所能夠記錄最大連接數(shù)量:(可調(diào)整)
/proc/sys/net/nf_conntrack_max
調(diào)整內(nèi)核參數(shù)茬射,使用echo重定向鹦蠕,或使用syctemctl命令
例如:設(shè)置記錄最大連接數(shù)為300000
systemctl -w net.nf_conntrack_max=300000
echo 300000 > /proc/net/nf_conntrack_max
conntrack所能追蹤的連接數(shù)量的最大值取決于/proc/sys/net/nf_conntrack_max的設(shè)定,已經(jīng)追蹤到的并記錄下來的路徑位于/proc/net/nf_conntrack文件中在抛,超時的連接將會被刪除钟病;當模板滿載時,后續(xù)的新連接有可能會超時刚梭,解決辦法:
(1)加大nf_conntrack_max的值肠阱;
(2)降低nf_conntrack條目的超時時長;
不同協(xié)議的連接追蹤時長定義在:/proc/sys/net/netfilter/有很多timeout文件中定義朴读;
例如:允許172.18網(wǎng)段訪問屹徘,本機的telnet,ssh衅金,web服務(wù)
iptables -F 清空規(guī)則噪伊,默認均為拒絕訪問
iptables -A INPUT -s 172.18.0.0/16 -d 172.18.11.114 -p tcp -m multiport --dports 22,23,80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d 172.18.0.0/16 -s 172.18.11.114 -p tcp -m multiport --sports 22,23,80 -m state --state ESTABLISHED -j ACCEPT
開放ping請求,讓別人能ping進來
iptables -A INPUT -d 172.18.11.114 -p icmp --icmp-type 8 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 172.18.11.114 -p icmp --icmp-type 0 -m state --state ESTABLISHED -j ACCEPT
越匹配到報文規(guī)則的越要放前面典挑;同類規(guī)則中匹配范圍小的要放前面酥宴;
如何放行被動的ftp服務(wù):
(1)內(nèi)核加載nf_conntrack_ftp模塊;
modprobe nf_conntrack_ftp
(2)放行命令連接
iptables -A INPUT -d 原ip服務(wù)器地址 -p tcp --dport 21 -m state --state NEW,ESTABLIEHED -j ACCEPT
iptables -A OUTPUT -s 原ip服務(wù)器地址 -p tcp --sport 21 -m state --state ESTABLIEHED -j ACCEPT
(3)放行數(shù)據(jù)連接
iptables -A INPUT -d 服務(wù)器原ip地址 -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -s 服務(wù)器原ip地址 -p tcp -m state --state ESTABLISHED -j ACCEPT
處理動作(跳轉(zhuǎn)目標)
-j targetname [per-target-optons]
簡單target:ACCEPT您觉,DROP
拓展target:
REJECT:--reject-with type
target | |
---|---|
RETURN | 返回調(diào)用者拙寡;自定義鏈的最后一條定義 |
REDIRECT | 端口重定向 |
LOG | 日志 |
MARK | 防火墻標記 |
DNAT | 目標地址轉(zhuǎn)換 |
SNAT | 原地址轉(zhuǎn)換 |
MASQERADE | 地址偽裝 |
查看幫助文檔:man iptables-extensions
LOG:開啟內(nèi)核關(guān)于匹配到的報文日志記錄規(guī)則
--log-level level
可用日志級別:emerg, alert, crit, error, warning, notice, info,debug
--log-prefix prefix 日志行前綴琳水,最長29個字母肆糕;
說明對應(yīng)的日志信息,是由誰產(chǎn)生的在孝;
--log-ip-options
記錄在tcp或ip報文首部中有可變長的可選項信息诚啃;
例如:
iptables -I FORWARD 2 -s 10.0.1.0/24 -p tcp -m multiport --dports 80,22,23,21 -m state --state NEW -j LOG --log-prefix "new connctions: "
注意:target為log日志規(guī)則時,應(yīng)添加在accept私沮、drop始赎、reject規(guī)則之前;所以先做日志仔燕,再做其它的規(guī)則造垛;
例如:
iptables -I FORWARD 2 -s 10.0.1.0/24 -p tcp -m multiport --dports 80,22,23,21 -m state --state NEW -j LOG --log-prefix "new connctions: "
iptables -vnL
有訪問80的web服務(wù)時,可查看日志記錄晰搀;
tail /var/log/messages
RETUREN:返回調(diào)用者五辽;隱含的;
例如:
iptables -A web -j RETURN
例如:
iptables -F
iptables -N web 創(chuàng)建自定義鏈
iptables -vnL
iptables -A web -s 10.0.1.0/24 -p tcp --dport 80 -j ACCEPT 添加web鏈規(guī)則外恕,允許本地主機訪問web服務(wù)
iptables -I web 1 -m string --algo kmp --string "old" -j REJECT 插入第1條web鏈杆逗,包含了old字符串的頁面禁止訪問
只要狀態(tài)是ESTABLISHED應(yīng)放行乡翅;
iptables -I web 2 -p tcp -m state --state ESTABLISHED -j ACCEPT 插入web鏈第2條,放行狀態(tài)是ESTABLISHED罪郊;
此時蠕蚜,內(nèi)網(wǎng)用戶訪問web服務(wù):不能訪問
curl httpd://172.18.11.111
是不能訪問的,因為自定義鏈不會直接生效的排龄,只有被調(diào)用才生效波势;
iptables -A FORWARD -p tcp -j web
在forward鏈上調(diào)用web自定義鏈翎朱;
此時橄维,內(nèi)網(wǎng)用戶就能訪問web服務(wù)了;
再放行ssh服務(wù):
iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 22 -m state --state NEW -j ACCEPT 由內(nèi)而外放行請求的報文拴曲,雖然沒有放行響應(yīng)的報文争舞,但是在web自定義鏈上的規(guī)則已經(jīng)放行了; 此時澈灼,內(nèi)網(wǎng)主機訪問ssh:
ssh root@172.18.11.111` 成功訪問竞川;
在web鏈上默認的隱含了返回調(diào)用者;
顯式指明返回調(diào)用者:
iptables -A web -j RETURN
表示web鏈匹配不到就返回調(diào)用者叁熔;
REDIRECT
端口重定向委乌,只能用在nat表上的prerouting,output鏈上荣回,只有在入棧報文請求剛到達時遭贸,才有用,在其它場景都沒有意義心软;能實現(xiàn)指明的端口完成映射壕吹;
--to-ports port 映射的指定端口
例如:
iptables -t nat -A PREROUTING -d 172.18.11.114 -p tcp --dport 80 -j REDIRECT --to-ports 8080
例如:
編輯11.111為web服務(wù):修改端口為8080
vim /etc/httpd/conf/httpd.conf
Listen 8080
systemctl restart httpd.service
在web服務(wù)器上添加規(guī)則:端口映射(地址轉(zhuǎn)換-->端口轉(zhuǎn)換)
iptables -t nat -A PREROUTING -d 172.18.11.114 -p tcp --dport 80 -j REDIRECT --to-ports 80
iptables -t nat -D PREROUTING 1
iptables -t nat -A PREROUTING -d 172.18.11.114 -p tcp --dport 80 -j REDIRECT --to-ports 8080
訪問瀏覽器172.18.11.111可瀏覽web服務(wù)
注意:假設(shè)啟動了2個服務(wù)ngix使用80端口,httpd使用8080删铃,添加以上規(guī)則時耳贬,ngix就沒用了,不能對外提供服務(wù)猎唁;
MASQUERADE
僅用在POSTROUTING鏈上
使用場景:只用于動態(tài)撥號獲取ip地址場景中咒劲,替換(就無需使用)snat;事實上靜態(tài)地址時诫隅,一樣可以使用腐魂;
在ppoe撥號上網(wǎng)時,MASQUERADE會自動獲取外網(wǎng)地址阎肝,并將原地址轉(zhuǎn)換為獲取的外網(wǎng)地址挤渔;因為,masquerade會額外消耗資源风题,如果是靜態(tài)就無需使用判导;
例如:
在網(wǎng)關(guān)防火墻上設(shè)置規(guī)則:
iptables -t filter -F
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j MASQUERADE
iptables -vnL
在內(nèi)網(wǎng)1.22測試訪問web服務(wù)11.111服務(wù)器
curl http://172.18.11.11
在11.111服務(wù)器查看日志:
tail /var/log/httpd/access_log
訪問正常嫉父;
iptables規(guī)則的保存與恢復
保存:iptables-save > /PATH/TO/SOME_RULE_FILE
重載:iptables-restore < /PATH/FROM/SOME_RULE_FILE
-n,--noflush:不清除原有規(guī)則
-t,-test:僅分析生成規(guī)則集,但不提交
規(guī)則的有效期限:
iptables命令添加的規(guī)則眼刃,手動刪除之前绕辖,生效期限為kernel的生命周期;
CentOS6
保存規(guī)則:service iptables save
或:iptables-save > /etc/sysconfig/iptables
iptables-save > /PATH/TO/SOME_RELE_FILE
保存任意位置擂红,但是系統(tǒng)不會自動加載仪际;會把文件中原有規(guī)則覆蓋;
重載規(guī)則:service iptables restart
會自動從/etc/sysconfig/iptables文件中重載規(guī)則昵骤;
配置文件:/etc/sysconfig/iptables-restore
CentOS7
iptables -S > /PATH/TO/SOME_RELE_FILE
iptables-save > /PATH/TO/SOME_RELE_FILE
例如:保存規(guī)則
iptables -S
iptables-save > /etc/sysconfig/iptables.v1
cat /etc/sysconfig/iptables.v1
例如:加載文件預存的規(guī)則
iptables-restore < /etc/sysconfig/iptables.v1
自動生效規(guī)則文件中的規(guī)則:2種方式
(1)把iptables命令放在腳本文件中树碱,讓腳本文件開機自動運行
放在/etc/rc.d/rc.local
例如:/usr/bin/iptables.sh
(2)用規(guī)則文件保存規(guī)則,開機自動重載命令变秦;
在/etc/rc.d/rc.local寫明:
iptables-restore < /PATH/TO/SOME_RELE_FILE
規(guī)則優(yōu)化思路:使用自定義鏈管理特定應(yīng)用的相關(guān)規(guī)則成榜,模塊化管理規(guī)則
(1)優(yōu)先放行雙向狀態(tài)為ESTABLISHED的報文
(2)服務(wù)于不同類別的功能的規(guī)則,匹配到報文可能性更大的放前面
(3)服務(wù)于同一類別的功能的規(guī)則蹦玫,匹配到條件較嚴格的放在前面
(4)設(shè)置默認策略:白名單機制
練習
iptables -N clean_in
創(chuàng)建自定義鏈
iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
丟棄目標地址為全1赎婚,ping包請求;
iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
丟棄172.16網(wǎng)段的主機ping包樱溉;
iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
協(xié)議為tcp挣输,狀態(tài)為new,不是tcp第一次握手都丟棄福贞;
iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
協(xié)議為TCP標志位全部為1都丟棄;
iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
協(xié)議為TCP標志位全部為0都丟棄肚医;
iptables -A clean_in -d 172.16.100.7 -j RETURN
目標地址為172.16.100.7就返回調(diào)用clean_in的鏈上
iptables -A INPUT -d 172.16.100.7 -j clean_in
在input鏈上目標地址為172.16.100.7就調(diào)用clean_in鏈绢馍;
iptables -A INPUT -i lo -j ACCEPT
在input鏈上放行流入本地接口的數(shù)據(jù);
iptables -A OUTPUT -o lo -j ACCEPT
在output鏈上放行流出本地接口的數(shù)據(jù)肠套;
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
在input鏈上舰涌,tcp協(xié)議目標端口為53,113,135,137,139,445,流入eth0接口的數(shù)據(jù)都丟棄你稚;
iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
在input鏈上瓷耙,udp協(xié)議目標端口為53,113,135,137,139,445,流入eth0接口的數(shù)據(jù)都丟棄刁赖;
iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
在input鏈上搁痛,udp協(xié)議目標端口為1026,流入eth0接口的數(shù)據(jù)都丟棄宇弛;
iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
在input鏈上鸡典,udp協(xié)議目標端口為1433,4899,流入eth0接口的數(shù)據(jù)都丟棄枪芒;
iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
在input鏈上彻况,協(xié)議為icmp谁尸,限制為每秒10個;
網(wǎng)絡(luò)防火墻實現(xiàn)
防火墻至少要有2個網(wǎng)卡纽甘,一個為內(nèi)網(wǎng)網(wǎng)卡良蛮,一個接外網(wǎng)網(wǎng)卡
內(nèi)網(wǎng)主機發(fā)報文時,經(jīng)過防火墻內(nèi)網(wǎng)卡時拆除mac封裝悍赢,先到達prerouting鏈决瞳,如果報文目標IP地址不是本機,就不會進入input鏈左权,經(jīng)本機轉(zhuǎn)發(fā)進入到forward鏈后到達postrouting鏈通過外網(wǎng)卡發(fā)送出去皮胡;回應(yīng)的報文進入外網(wǎng)網(wǎng)卡先到達prerouting鏈,經(jīng)由forward鏈后到達postrouting通過內(nèi)網(wǎng)卡發(fā)送給內(nèi)網(wǎng)主機涮总;
注意:prerouting胸囱、posting鏈等祷舀,跟網(wǎng)卡無關(guān)瀑梗,只跟報文出入方向有關(guān);
防火墻當做網(wǎng)絡(luò)防火墻時裳扯,應(yīng)把規(guī)則添加forward鏈上抛丽;
內(nèi)網(wǎng)主機之間通信時,防火墻設(shè)置是不起作用的饰豺;只能靠內(nèi)網(wǎng)的主機防火墻發(fā)揮作用亿鲜;
防火墻當做主機防火墻時,應(yīng)把規(guī)則添加input和output鏈上冤吨;
盡可能控制內(nèi)網(wǎng)主機訪問外網(wǎng)時蒿柳,應(yīng)把規(guī)則添加在forward鏈上,要考慮進漩蟆、出兩個方向的規(guī)則垒探;添加了-s或-d就有了方向性;
一般狀態(tài)是establish的都放行怠李,只是在new在方向上限制圾叼;
如果內(nèi)網(wǎng)服務(wù)器是對外提供服務(wù)的,對new狀態(tài)是限制由外而內(nèi)捺癞,只開放對外開放的協(xié)議和端口夷蚊,而由內(nèi)而外的可不限制端口、協(xié)議的放行出去髓介;
所以一般當服務(wù)器端惕鼓,設(shè)置規(guī)則時,只放行(由外而內(nèi)的)有限服務(wù)的端口和協(xié)議唐础,對客戶端設(shè)置規(guī)則是通常放行所有請求箱歧,除非限制內(nèi)網(wǎng)用戶訪問某些服務(wù)夫否;
搭建網(wǎng)絡(luò)環(huán)境,防火墻連接內(nèi)網(wǎng)叫胁、外網(wǎng)
虛擬機添加網(wǎng)卡后凰慈,識別不到,修改centos7中的網(wǎng)卡名稱為eth0:
添加網(wǎng)卡后驼鹅,無法識別新網(wǎng)卡
centos7中網(wǎng)卡名修改為eth0
cd /etc/sysconfig
vim grub
在最長的那一行添加下面的句子
net.ifnames=0 biosdevname=0
grub2-mkconfig -o /boot/grub2/grub.cfg
重命名原來的網(wǎng)卡名字
cd /etc/sysconfig/network-scripts
mv ifcfg-enoXXXXXXXX ifcfg-eth0
修改ifcfg-eth0里邊的NAME,DEVICE的名字都為eth0
NAME=eth0
DEVICE=eth0
reboot重啟微谓,并查看發(fā)現(xiàn)已經(jīng)成我們想要的eth0
在centos6中,克隆虛擬機后eth0網(wǎng)卡無法識別問題:
解決方法:
修改/etc/udev/rules.d 下的 70-persistent-net.rules 文件输钩,我們會發(fā)現(xiàn)下面兩行:
PCI device 0x1022:0x2000(pcnet32)
SUBSYSTEM=="net",DRIVERS=="?*",ATTRS{address}=="00:0c:29:4c:46:01",NAME="eth0" 這行刪除
Advanced Micro Devices [AMD] 79c970 [PCnet32 LANCE] (rule written by anaconda) SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:ad:06:2a", ATTR{type}=="1", KERNEL=="eth*", NAME="eth1"
這行修改最后的eth1為eth0豺型,然后保存退出,重啟系統(tǒng)就可以了买乃。
或者你覺得上面改的比較麻煩姻氨,你可以將上面帶#的兩行都刪除,然后保存重啟電腦剪验,讓系統(tǒng)全部重新獲取網(wǎng)卡信息肴焊。
網(wǎng)絡(luò)環(huán)境模型搭建完畢
內(nèi)網(wǎng)主機:10.0.1.22/24
防火墻有2塊網(wǎng)卡:
內(nèi)網(wǎng)網(wǎng)卡eth1:10.0.1.1/24
外網(wǎng)網(wǎng)卡eth0:172.18.11.114/16
其它外網(wǎng)主機:172.18.11.111
查看核心轉(zhuǎn)發(fā)功能,為0表示核心轉(zhuǎn)發(fā)是關(guān)閉的
[root@promote ~]# cat /proc/sys/net/ipv4/ip_forward
0
此時功戚,測試從內(nèi)網(wǎng)主機1.22 ping 防火墻外網(wǎng)地址11.114娶眷,且防火墻核心轉(zhuǎn)發(fā)是關(guān)閉,此時仍然能ping通啸臀,因為linux系統(tǒng)中同一主機的網(wǎng)卡之間是互通的届宠,ip地址屬于內(nèi)核不屬于網(wǎng)卡;只要內(nèi)網(wǎng)主機1.22的網(wǎng)關(guān)指向了防火墻的1.1乘粒,那么1.1所在主機的所有地址豌注,1.22可以ping通防火墻上的所有地址;其實這不叫轉(zhuǎn)發(fā)這是默認法則灯萍;如果1.22沒有把網(wǎng)關(guān)指向1.1轧铁,只能ping通1.1,ping不同11.114了竟稳;1.22是通過網(wǎng)關(guān)1.1轉(zhuǎn)發(fā)的属桦;沒有網(wǎng)關(guān)就不能非本地通信;
如果防火墻沒有打開核心轉(zhuǎn)發(fā)他爸,1.22不能ping通外網(wǎng)地址11.111聂宾;
在1.22主機ping11.111
在11.111抓包,只抓icmp的ping包
tcpdump -i eno16777736 icpm
此時ping不通诊笤,而且也抓不到icmp的包系谐;
打開防火墻的核心轉(zhuǎn)發(fā)后,再測試是否能ping通
[root@promote ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@promote ~]# cat /proc/sys/net/ipv4/ip_forward
1
此時在11.111抓到了ping包,但在1.22顯示ping不通纪他;
應(yīng)該在11.111主機上加一條路由:route add -net 10.0.1.0/24 gw 172.18.11.114
此時鄙煤,1.22主機ping通11.111主機;
演示在防火墻上添加iptables規(guī)則
在防火墻關(guān)閉轉(zhuǎn)發(fā):iptables -P FORWARD DROP
此時茶袒,1.22主機ping不通11.111主機梯刚;
若要內(nèi)網(wǎng)主機能ping通外網(wǎng)主機,當反之則不允許薪寓;
iptables -A FORWARD -s 10.0.1.0/24 -d 0/0 -p icmp --icmp-type 8 -j ACCEPT
放png包出去但沒放進返回的包
可在亡资,外網(wǎng)11.111主機抓包
tcpdump -i eno16777736 -nn icmp
有1.22請求11.111,有11.111響應(yīng)1.22向叉;
也可在本地1.22主機锥腻,虛擬機按ctrl+alt+f2再打開一個控制臺嗎,抓包母谎;
tcpdump -i eno16777736 -nn icmp
有1.22請求11.111瘦黑,沒響應(yīng);
也可在防火墻主機的內(nèi)網(wǎng)網(wǎng)卡奇唤、外網(wǎng)網(wǎng)卡上分別抓包幸斥;
tcpdump -i eth0 -nn icmp
收到1.22請求11.111,也收到11.113響應(yīng)1.22
tcpdump -i eth1 -nn icmp
僅收到1.22請求11.111冻记,沒響應(yīng)睡毒;
打開從內(nèi)網(wǎng)主機能ping通外網(wǎng)主機;
在防火墻主機只添加一條放進來外網(wǎng)ping包的規(guī)則冗栗;
iptables -A FORWARD -s 0/0 -d 10.0.1.0/24 -p icmp --icmp-type 0 -j ACCEPT
此時從內(nèi)網(wǎng)主機能ping通外網(wǎng)主機,放開了僅內(nèi)網(wǎng)能ping外網(wǎng)主機的規(guī)則供搀,可抓包驗證隅居;
但仍然不能從外網(wǎng)主機ping通內(nèi)網(wǎng)主機;即11.111ping不通1.22葛虐;
可在防火墻主機外網(wǎng)網(wǎng)卡上抓包胎源,能抓到進來的包;
tcpdump -i eth0 -nn icmp
如果要實現(xiàn)內(nèi)網(wǎng)主機能ping外網(wǎng)主機互通屿脐,則還有添加2條規(guī)則涕蚤,即:
放行從外到內(nèi)的icmp請求類型為8的,從內(nèi)到外icmp響應(yīng)類型為0的即可的诵;
使用基于狀態(tài)追蹤設(shè)定規(guī)則時,如果只允許內(nèi)網(wǎng)ping出去,就可把之前設(shè)定的兩條規(guī)則合并溢豆;
iptables -F
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.0.1.0/24 -p icmp --icmp-type 8 -m state --state NEW -j ACCEPT
此時夯缺,內(nèi)網(wǎng)主機1.22能ping通11.111
當外網(wǎng)主機11.111為web、vsftp服務(wù)器時,要允許內(nèi)網(wǎng)主機訪問外網(wǎng)的服務(wù)器扰她;
在防火墻主機設(shè)置規(guī)則:
iptables -F
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 80 -m state --state NEW -j ACCEPT 僅放行出去的請求
此時內(nèi)網(wǎng)主機能訪問外網(wǎng)web服務(wù)器了
curl httpd://172.18.11.111
iptables -A FORWARD -s 10.0.1.0/24 -p tcp --dport 21 -m state --state NEW -j ACCEP
此時兽掰,放行的是vsftp的命令連接,響應(yīng)通過上面的ESTABLISHED也沒問題徒役,但數(shù)據(jù)連接在被動模式下孽尽,沒有放行只有在related狀態(tài)放行才行;數(shù)據(jù)連接只有第一次請求是related的忧勿,而且要識別related而不是new要先裝載iptables的模塊泻云,即ftp連接追蹤的模塊;
裝載iptables的追蹤ftp的連接追蹤模塊
modprobe nf_conntrack_ftp
在被動模式下狐蜕,服務(wù)器發(fā)請求宠纯,第一次請求為related的,所以是從外網(wǎng)到內(nèi)網(wǎng)的為related层释;
替換第一條規(guī)則:iptables -R FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
此時在內(nèi)網(wǎng)主機測試服務(wù)ftp服務(wù)
lftp 172.18.11.111
能訪問
在centos7系統(tǒng)上保存規(guī)則:
iptables-save > /etc/sysconfig/iptables.v2
重啟后規(guī)則消失婆瓜,要想開機自動運行,添加:
vim /etc/rc.d/rc.local
iptables-restore < /etc/sysconfig/iptables.v2
在centos6系統(tǒng)上保存規(guī)則:service iptables save
要想開機自動運行:chkconfig iptables on
在centos7系統(tǒng)上用的是firewalld服務(wù)贡羔,要手動控制firewalld廉白;
在實際中,防火墻可能不止有2個網(wǎng)卡乖寒,甚至更多猴蹂;
一般來講,本地用戶允許new狀態(tài)的出去訪問互聯(lián)網(wǎng)楣嘁,而本地服務(wù)器向外提供服務(wù)磅轻,則不允許new狀態(tài)出去,除非是DNS服務(wù)器或服務(wù)器使用yum源逐虚;
NAT 防火墻
NAT:Network Address Translation 只有啟用NAT功能必須啟用鏈接追蹤機制contract聋溜;
最初是為了安全隱藏ip地址,后來被用來ipv4地址不夠用時引用了NAT叭爱;
SNAT:source NAT
修改ip報文中的源IP地址撮躁;只能用在POSTROUTING、INPUT鏈上买雾、自定義鏈(但也只能被POSTROUTING把曼、INPUT鏈調(diào)用)上;
使用場景:讓本地網(wǎng)絡(luò)中的主機可使用統(tǒng)一地址與外部通信漓穿,從而實現(xiàn)地址偽裝嗤军;即轉(zhuǎn)換客戶端地址,一般代理本地私網(wǎng)主機到互聯(lián)網(wǎng)器净;
請求:由內(nèi)網(wǎng)主機發(fā)起型雳,修改源IP,如果修改則由管理員定義;
響應(yīng):修改目標IP纠俭,由nat自動根據(jù)會話表中追蹤機制實現(xiàn)相應(yīng)修改沿量;
原地址轉(zhuǎn)換:
本地內(nèi)網(wǎng)用戶訪問外網(wǎng)服務(wù)器時,在本地網(wǎng)關(guān)上進行原地址轉(zhuǎn)換冤荆,把內(nèi)網(wǎng)用戶請求報文中原地址轉(zhuǎn)換為網(wǎng)關(guān)的公網(wǎng)地址與外界通信朴则,外網(wǎng)服務(wù)器響應(yīng)內(nèi)網(wǎng)用戶時,進行目標地址轉(zhuǎn)換钓简,只不過響應(yīng)報文中不需要用戶參與乌妒,網(wǎng)關(guān)根據(jù)追蹤會話表自動完成目標地址轉(zhuǎn)換,轉(zhuǎn)發(fā)給內(nèi)網(wǎng)用戶外邓;
DNAT:destinaton NAT
修改ip報文中的目標IP地址撤蚊;僅用在PREROUTING 和 OUTPUT鏈 上;
使用場景:讓本地網(wǎng)絡(luò)中的服務(wù)器使用統(tǒng)一的地址向外提供服務(wù)损话,但隱藏了自己的真實地址侦啸,還可實現(xiàn)負載均衡;即轉(zhuǎn)換服務(wù)器端地址丧枪,把本地私網(wǎng)主機放在互聯(lián)網(wǎng)上當服務(wù)器光涂;
請求:由外網(wǎng)主機發(fā)起,修改其目標地址拧烦,由管理員定義忘闻;
響應(yīng):修改原地址,但有nat自動根據(jù)會話表中的追蹤機制實現(xiàn)對應(yīng)修改恋博;
目標地址轉(zhuǎn)換:
外網(wǎng)用戶訪問本地內(nèi)網(wǎng)中向外提供服務(wù)的主機時齐佳,本地網(wǎng)關(guān)會進行目標地址轉(zhuǎn)換,把目標地址改為內(nèi)網(wǎng)的服務(wù)器地址交播,內(nèi)網(wǎng)服務(wù)器響應(yīng)外網(wǎng)用戶時重虑,在本地網(wǎng)關(guān)上完成源地址轉(zhuǎn)換,只不過響應(yīng)報文中不需要用戶參與秦士,根據(jù)追蹤會話表自動完成源地址轉(zhuǎn)換;
本地為客戶端使用原地址轉(zhuǎn)換永高;
本地為服務(wù)器使用目標地址轉(zhuǎn)換隧土;
PNAT:port NAT
實現(xiàn)端口轉(zhuǎn)換,而REDIRECT能專門實現(xiàn)端口轉(zhuǎn)換機制命爬,而DNAT完成目標端口轉(zhuǎn)換曹傀,響應(yīng)報文時能自動進行源端口轉(zhuǎn)換;
- SNAT:本地是客戶端饲宛,遠程是服務(wù)器皆愉,在網(wǎng)關(guān)上應(yīng)該發(fā)生在(路由后)POSTROUTING,即離開本機時、INPUT鏈幕庐;
- DNAT:本地是服務(wù)器久锥,遠程是客戶端,在網(wǎng)關(guān)上應(yīng)該發(fā)生在(路由前)PREROUTING鏈异剥,即進入本機時瑟由;
SNAT實現(xiàn)
只能用在postrouting和input鏈上**
--to-source [ipaddr[-paddr]] 指明原地址、源端口(但源端口一般為隨機端口)冤寿,可指定地址范圍歹苦;
--random 隨機分配端口;
但在centos6系統(tǒng)上較老版本內(nèi)核和較老版本的iptables上SNAT不能用在input鏈上督怜;
所以centos6系統(tǒng)上殴瘦,nat表只包含3個鏈:OUTPUT、PREROUTING号杠、POSTROUTING蚪腋;
而centos7系統(tǒng)上,nat表包含4個鏈:INPUT究流、OUTPUT辣吃、PREROUTING、POSTROUTING芬探;
在內(nèi)網(wǎng)1.22主機請求外網(wǎng)web服務(wù)
curl http://172.18.11.111
可訪問外網(wǎng)web訪問
可在外網(wǎng)web主機查看日志
tail /var/log/httpd/message
可看到內(nèi)網(wǎng)請求web時神得,源地址為1.22,目標地址為11.111偷仿;mac地址會不斷變化的哩簿;
為內(nèi)網(wǎng)用戶訪問外網(wǎng)在防火墻設(shè)置SNAT:
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.11.114
如果防火墻有多個外網(wǎng)地址可設(shè)為地址范圍;如下:
iptables -t nat -A POSTROUTING -s 10.0.1.0/24 -j SNAT --to-source 172.18.11.114-172.18.11.117
iptables -t nat -vnL
iptables -vnL
在內(nèi)網(wǎng)1.22上ping外網(wǎng)172.18.11.111
可在172.18.11.111抓包:
tcpdump -i eno16777736 -nn icmp
IP 172.18.11.114 > 172.18.11.111: ICMP echo request
IP 172.18.11.111 > 172.18.11.114: ICMP echo reply
再打開內(nèi)網(wǎng)10.0.1.22的一個控制臺(crtl+alt+f2)抓包:
tcpdump -i eth0 -nn icmp
IP 10.0.1.22 > 172.18.11.111: ICMP echo request
IP 172.18.11.111 > 10.0.1.22: ICMP echo reply
還可在網(wǎng)關(guān)防火墻抓包:
外網(wǎng)網(wǎng)卡抓包:
tcpdump -i eth0 -nn icmp
IP 172.18.11.114 > 172.18.11.111: ICMP echo request
IP 172.18.11.111 > 172.18.11.114: ICMP echo reply
內(nèi)網(wǎng)網(wǎng)卡抓包:
tcpdump -i eth1 -nn icmp
IP 10.0.1.22 > 172.18.11.111: ICMP echo request
IP 172.18.11.111 > 10.0.1.22: ICMP echo reply
還可在內(nèi)網(wǎng)主機測試80端口:
curl http://172.18.11.111
在11.111服務(wù)器上查看日志:
tail /var/log/httpd/access_log
172.18.11.114 - - [28/Apr/2016:19:13:03 +0800] "GET / HTTP/1.1" 200 36 "-" "curl/7.29.0"
要禁止內(nèi)網(wǎng)用戶訪問ssh服務(wù)酝静,22端口:
在網(wǎng)關(guān)防火墻設(shè)置規(guī)則:
iptables -t filter -A FORWARD -s 10.0.1.0/24 -p tcp --dport 22 -j REJECT
此時在內(nèi)網(wǎng)主機連接ssh服務(wù)被拒絕訪問节榜,但其它服務(wù)扔可訪問;
ssh root@172.18.11.111
如果規(guī)則使用drop則不會立即顯示拒絕别智,而會滯留在連接狀態(tài)宗苍;
DNAT實現(xiàn)
僅用于nat表的PREOUTING、OUTPUT鏈上或用在自定義鏈上(但也只能被POSTROUTING薄榛、INPUT鏈調(diào)用)讳窟;
--to-destination [ipaddr[-ipaddr]][:port[-port]] 指明目標地址、目標端口敞恋,也可是范圍丽啡;
目標端口轉(zhuǎn)換時,做端口映射是很常見的:
如果內(nèi)網(wǎng)1.22為向外提供服務(wù)硬猫,外網(wǎng)11.111為客戶端要訪問1.22:
在網(wǎng)關(guān)防火墻設(shè)置規(guī)則:
先確保網(wǎng)關(guān)防火墻沒有監(jiān)聽80端口补箍;但可向外宣稱提供80服務(wù)改执,實際是由內(nèi)網(wǎng)1.22提供服務(wù);
ss -tnl
iptables -t nat -F POSTROUTING 指明清除nat表上的postrouting鏈上的規(guī)則坑雅;
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22
表示只有目標地址11.114辈挂、目標端口為80時,轉(zhuǎn)換目標地址為10.0.1.22目的端口沒改霞丧;
iptables -t nat -vnL
使用外網(wǎng)主機訪問網(wǎng)關(guān)防火墻172.18.11.114:
可在瀏覽器輸入172.18.11.114
顯示成功呢岗;
內(nèi)網(wǎng)主機提供的服務(wù)端口跟網(wǎng)關(guān)防火墻聲稱的提供服務(wù)的端口不一樣時:做端口映射
比如外網(wǎng)用戶訪問的是80,但可以在內(nèi)網(wǎng)服務(wù)主機使用其它端口提供服務(wù)蛹尝;
在1.22主機編輯httpd的配置文件后豫,修改監(jiān)聽端口為8090:
vim /etc/httpd/conf/httpd.conf
Listen 8090按需
在網(wǎng)關(guān)防火墻設(shè)置規(guī)則:
iptables -t nat -F
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 80 -j DNAT --to-destination 10.0.1.22:8090
iptables -t nat -vnL
此時,使用外網(wǎng)主機訪問網(wǎng)關(guān)防火墻11.114:
可在瀏覽器輸入172.18.11.114
顯示成功突那;
在DNAT挫酿,內(nèi)網(wǎng)服務(wù)器看到的原地址沒變?nèi)詾橥饩W(wǎng)主機11.111;
可驗證愕难,在11.111主機:
curl http://172.18.11.114
在內(nèi)網(wǎng)服務(wù)器1.22查看web日志:
tail -1 /var/log/httpd/access_log
tcpdump -i eth0 -nn tcp port 8090
在外網(wǎng)主機11.111上訪問網(wǎng)關(guān)防火墻11.114的ssh服務(wù)早龟,端口還仍然是網(wǎng)關(guān)防火墻自己;
ssh root@172.18.11.114
在防網(wǎng)關(guān)火墻添加規(guī)則:
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 22 -j DNAT --to-destination 10.0.1.22
此時猫缭,在外網(wǎng)主機11.111上訪問網(wǎng)關(guān)防火墻11.114的ssh服務(wù)葱弟,被轉(zhuǎn)給了內(nèi)網(wǎng)10.22主機;
ssh root@172.18.11.114
這樣猜丹,內(nèi)網(wǎng)主機服務(wù)可隨意指定端口芝加,對外發(fā)布服務(wù);
在防網(wǎng)關(guān)火墻添加規(guī)則:
iptables -t nat -A PREROUTING -s 0/0 -d 172.18.11.114 -p tcp --dport 0 -j DNAT --to-destination 10.0.1.22
此時射窒,把目的端口設(shè)為0藏杖,外網(wǎng)11.111再訪問11.114的web服務(wù)或ssh服務(wù)都被拒絕;在特殊場景中不會是此效果脉顿,例如蝌麸,用到負載均衡器的lvs場景時,會把11.114上的所有端口艾疟,統(tǒng)統(tǒng)轉(zhuǎn)到內(nèi)網(wǎng)主機服務(wù)器上来吩;