注意:服務(wù)器為CentOS 7路媚,并且CentOS 7自帶iptables斟或,但不自帶iptables-services
現(xiàn)在需要用iptables限制一個(gè)mysql服務(wù)只能由指定的ip訪問(wèn)
似乎不難,于是網(wǎng)上查了一波框弛,首先查到了這個(gè)
# 配置IPTABLES
iptables -A INPUT -s 允許訪問(wèn)的ip -p tcp --dport 3306 -j ACCEPT
iptables -A INPUT -p tcp --dport 3306 -j REJECT
執(zhí)行完后使用iptables -L -n命令可以查看當(dāng)前所有的iptables規(guī)則
我們剛才執(zhí)行的命令設(shè)置的是INPUT,所以我們這里只看INPUT【演示截圖中我執(zhí)行了兩句十饥,允許127.0.0.1,禁止其他】結(jié)果如下圖所示
看起來(lái)沒(méi)問(wèn)題對(duì)吧祖乳,但是其實(shí)它就有問(wèn)題了(說(shuō)簡(jiǎn)單點(diǎn)就是逗堵,防火墻沒(méi)有起作用,啥ip都能訪問(wèn)他)
于是我再測(cè)試了一次眷昆,這次我只執(zhí)行禁止所有ip訪問(wèn)的命令蜒秤,一個(gè)ip我都不允許
很遺憾,并沒(méi)有什么卵用亚斋,不管是別的服務(wù)器的登錄mysql或著百度搜出來(lái)的端口掃描作媚,統(tǒng)統(tǒng)都能訪問(wèn)
所以是為什么呢
因?yàn)閙ysql服務(wù)是用docker起的,docker自己會(huì)往系統(tǒng)中注冊(cè)一個(gè)虛擬網(wǎng)卡叫docker0帅刊,訪問(wèn)docker服務(wù)的流量會(huì)直接被轉(zhuǎn)發(fā)到docker0這張網(wǎng)卡上掂骏,所以iptables規(guī)則是獨(dú)有的,剛才設(shè)置的INPUT對(duì)docker服務(wù)是不生效的
未完成需求再次執(zhí)行下圖是docker規(guī)則
iptables -I DOCKER -p tcp --dport 3306 -j DROP
iptables -I DOCKER -s 127.0.0.1 -p tcp --dport 3306 -j ACCEPT
iptables -L -n
就可以看到DOCKER規(guī)則中新增了兩條厚掷,一條是禁止所有訪問(wèn),一條是允許127.0.0.1訪問(wèn)
這時(shí)再測(cè)試就如我們所愿了
如果細(xì)心的話應(yīng)該會(huì)發(fā)現(xiàn)這次執(zhí)行的命令是先禁止级解,后允許冒黑,而上面第一個(gè)代碼塊中的命令順序是先允許后禁止,這兩個(gè)順序其實(shí)都是對(duì)的勤哗,
因?yàn)榈谝粋€(gè)代碼塊中是iptables -A抡爹,-A的意思是加在最后,而iptables的匹配順序是從上到下芒划,所以用-A往最后追加的話冬竟,那就是【先寫先匹配】
而第二個(gè)代碼塊中的寫法是iptables -I欧穴,-I的意思是加在最前,也就是上面截圖中的效果泵殴,可以看到我加的這兩條涮帘,明顯是在規(guī)則鏈的最前面,那用-I往前追加的話笑诅,就是【先寫后匹配】了
到這里调缨,通過(guò)iptables限制3306端口只允許指定ip訪問(wèn),已經(jīng)實(shí)現(xiàn)了.
補(bǔ)充:
上面進(jìn)行的設(shè)置系統(tǒng)重啟后就會(huì)消失吆你,可以保存iptables的配置文件:
保存配置:
1)iptables-save > /etc/sysconfig/iptables
2)用iptables-service保存【這個(gè)做法需要安裝iptables-services弦叶,實(shí)際效果和上面那句一樣】
? ? ? service iptables save
還原配置:
1)iptables-restore < /etc/sysconfig/iptables
2)手動(dòng)重啟iptables【這個(gè)做法需要安裝iptables-services】
? ? ?systemctl restart iptables
出現(xiàn)的現(xiàn)象:包含docker規(guī)則鏈的iptables防火墻是無(wú)法完成開(kāi)機(jī)生效的,開(kāi)機(jī)生效的只能是系統(tǒng)自帶的INPOUT妇多、FORWORD伤哺、OUTPUT、PREROUTING規(guī)則者祖。
這是原因: 服務(wù)器重啟后立莉,iptables服務(wù)先啟動(dòng),啟動(dòng)后會(huì)去加載備份的配置文件咸包,但是此時(shí)桃序,docker服務(wù)還未啟動(dòng),DOCKER規(guī)則鏈還未創(chuàng)建烂瘫,所以雖然iptables有加載我們備份的配置媒熊,但他沒(méi)法加載DPOCKER規(guī)則鏈上的內(nèi)容,從而導(dǎo)致DOCKER規(guī)則鏈上的規(guī)則沒(méi)有成功加載坟比。而docker啟動(dòng)后芦鳍,DOCKER規(guī)則鏈就存在了,這時(shí)不管是手動(dòng)讓iptables加載配置文件還是直接重啟iptables葛账,之前備份的DOCKER規(guī)則就都能成功加載了柠衅。
################################################################################################
1)iptables常用命令小計(jì):
?#列出所有iptables規(guī)則? ? ??
iptables -L -n? ? ? ?
#列出所有iptables規(guī)則,并顯示編號(hào)【有編號(hào)才好刪】
iptables -L -n --line-number
#備份iptables防火墻規(guī)則到指定的文件中
iptables-save > 文件絕對(duì)路徑將當(dāng)前iptables規(guī)則保存到指定文件中
#從指定文件還原iptables防火墻規(guī)則
iptables-restore < 文件絕對(duì)路徑從指定文件中加載iptables規(guī)則
2)iptables防火墻添加小計(jì):
#禁用192.168.116.1~192.168.116.20 經(jīng)過(guò)網(wǎng)卡eno1的目的 IP為192.168.116.116的IP段 的 22-29 端口
iptables -I INPUT -m iprange --src-range 192.168.116.1-192.168.116.20 -p tcp -i eno1 -d 192.168.116.116 --dport 22:29? -j DROP
#刪除規(guī)則:
先查詢:iptables -L -n --line-number
在刪除:iptables -D INPUT? ?2
其中INPUT 指的是鏈籍琳,2指的是編號(hào)