一基礎(chǔ)
步驟一:關(guān)閉firewalld锋恬,啟動(dòng)iptables服務(wù)
1)關(guān)閉firewalld服務(wù)器
[root@proxy ~]# systemctl stop firewalld.service
[root@proxy ~]# systemctl disable firewalld.service
2)安裝iptables-services并啟動(dòng)服務(wù)
[root@proxy ~]# yum -y install iptables-services #裝包配置可永久保存
[root@proxy ~]# systemctl start iptables.service
步驟二:熟悉iptables框架
1)iptables的4個(gè)表(區(qū)分大小寫(xiě))
iptables默認(rèn)有4個(gè)表搭盾,nat表(地址轉(zhuǎn)換表)角骤、filter表(數(shù)據(jù)過(guò)濾表)正卧、raw表(狀態(tài)跟蹤表)叹坦、mangle表(包標(biāo)記表)检碗。
2)iptables的5個(gè)鏈(區(qū)分大小寫(xiě))
INPUT鏈(入站規(guī)則)
OUTPUT鏈(出站規(guī)則)
FORWARD鏈(轉(zhuǎn)發(fā)規(guī)則)
PREROUTING鏈(路由前規(guī)則)
POSTROUTING鏈(路由后規(guī)則)
步驟三:iptables命令的基本使用方法
1)iptabels語(yǔ)法格式
[root@proxy ~]# iptables ?[-t表名] ?選項(xiàng) ?[鏈名] ?[條件] ?[-j 目標(biāo)操作]
[root@proxy ~]# iptables ?-t ?filter ?-I ?INPUT -p ?icmp ?-j ?REJECT
[root@proxy ~]# iptables -t filter -I ?INPUT ??-p ?icmp ?-j ?ACCEPT
[root@proxy ~]# iptables ?-I ?INPUT ?-p ?icmp ?-j ?REJECT
//注意事項(xiàng)與規(guī)律:
//可以不指定表,默認(rèn)為filter表
//可以不指定鏈金拒,默認(rèn)為對(duì)應(yīng)表的所有鏈
//如果沒(méi)有找到匹配條件兽肤,則執(zhí)行防火墻默認(rèn)規(guī)則
//選項(xiàng)/鏈名/目標(biāo)操作用大寫(xiě)字母,其余都小寫(xiě)
##########################################################
//目標(biāo)操作:
// ACCEPT:允許通過(guò)/放行
// DROP:直接丟棄殖蚕,不給出任何回應(yīng)
// REJECT:拒絕通過(guò),必要時(shí)會(huì)給出提示
// LOG:記錄日志沉迹,然后傳給下一條規(guī)則
iptables命令的常用選項(xiàng)如表-1所示睦疫。
2)iptables命令的使用案例
創(chuàng)建規(guī)則的案例:
[root@proxy ~]# iptables ?-t ?filter ?-A ?INPUT ?-p tcp ?-j ?ACCEPT
//追加規(guī)則至filter表中的INPUT鏈的末尾,允許任何人使用TCP協(xié)議訪問(wèn)本機(jī)
[root@proxy ~]# iptables ?-I ?INPUT ?-p ?udp ?-j ?ACCEPT
//插入規(guī)則至filter表中的INPUT鏈的開(kāi)頭鞭呕,允許任何人使用UDP協(xié)議訪問(wèn)本機(jī)
[root@proxy ~]# iptables ?-I ?INPUT 2 ?-p ?icmp ?-j ?ACCEPT
//插入規(guī)則至filter表中的INPUT鏈的第2行蛤育,允許任何人使用ICMP協(xié)議訪問(wèn)本機(jī)
查看iptables防火墻規(guī)則:
[root@proxy ~]# iptables ?-nL ?INPUT ???????????????????//僅查看INPUT鏈的規(guī)則
target ????prot opt source ??????????????destination
ACCEPT ????udp ?-- ?0.0.0.0/0 ???????????0.0.0.0/0
ACCEPT ????icmp -- ?0.0.0.0/0 ???????????0.0.0.0/0
ACCEPT ????tcp ?-- ?0.0.0.0/0 ???????????0.0.0.0/0
[root@proxy ~]# iptables ?-L ?INPUT ?--line-numbers ???????//查看規(guī)則,顯示行號(hào)
num ?target ????prot opt source ????????destination
1 ???ACCEPT ????udp ??-- ?anywhere ????anywhere
2 ???ACCEPT ????icmp -- ??anywhere ????anywhere
3 ???ACCEPT ????tcp ?-- ??anywhere ????anywhere
刪除規(guī)則葫松,清空所有規(guī)則:
[root@proxy ~]# iptables ?-D ?INPUT ?3
//刪除filter表中INPUT鏈的第3條規(guī)則
[root@proxy ~]# iptables ?-nL ?INPUT ???????????????//查看規(guī)則瓦糕,確認(rèn)是否刪除
[root@proxy ~]# iptables ?-F
//清空f(shuō)ilter表中所有鏈的防火墻規(guī)則
[root@proxy ~]# iptables ?-t ?nat ?-F
//清空nat表中所有鏈的防火墻規(guī)則
[root@proxy ~]# iptables ?-t ?mangle ?-F
//清空mangle表中所有鏈的防火墻規(guī)則
[root@proxy ~]# iptables ?-t ?raw ?-F
//清空raw表中所有鏈的防火墻規(guī)則
設(shè)置防火墻默認(rèn)規(guī)則:
[root@proxy ~]# iptables ?-t ?filter ?-P ?INPUT ?DROP
[root@proxy ~]# iptables ?-nL
Chain INPUT (policy DROP)
… …
二filter過(guò)濾和轉(zhuǎn)發(fā)控制
步驟一:iptables防火墻規(guī)則的條件
iptables防火墻可以根據(jù)很多很靈活的規(guī)則進(jìn)行過(guò)濾行為,具體常用的過(guò)濾條件如表-2所示腋么。
1)主機(jī)型防火墻案例
[root@proxy ~]# iptables -I INPUT -p tcp --dport 80 -j REJECT
[root@proxy ~]# iptables -I INPUT -s 192.168.2.100 -j REJECT
[root@proxy ~]# iptables -I INPUT -d 192.168.2.5 -p tcp --dport 80 -j REJECT
[root@proxy ~]# iptables -I INPUT -i eth0 -p tcp --dport 80 -j REJECT
[root@proxy ~]# iptables ?-A ?INPUT ?-s 192.168.4.100 ?-j ?DROP
//丟棄192.168.4.100發(fā)給本機(jī)的所有數(shù)據(jù)包
[root@proxy ~]# iptables ?-A ?INPUT -s ?192.168.2.0/24 ?-j ?DROP
//丟棄192.168.2.0/24網(wǎng)絡(luò)中所有主機(jī)發(fā)送給本機(jī)的所有數(shù)據(jù)包
[root@proxy ~]# iptables -A ?INPUT -s ?114.212.33.12 ?-p tcp --dport 22 -j ?REJECT
//拒絕114.212.33.12使用tcp協(xié)議遠(yuǎn)程連接本機(jī)ssh(22端口)
步驟二:開(kāi)啟Linux的路由轉(zhuǎn)發(fā)功能
1)Linux內(nèi)核默認(rèn)支持軟路由功能咕娄,通過(guò)修改內(nèi)核參數(shù)即可開(kāi)啟或關(guān)閉路由轉(zhuǎn)發(fā)功能。
[root@proxy ~]# echo 0 > /proc/sys/net/ipv4/ip_forward ???????????//關(guān)閉路由轉(zhuǎn)發(fā)
[root@proxy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward ???????????//開(kāi)啟路由轉(zhuǎn)發(fā)
//注意以上操作僅當(dāng)前有效珊擂,計(jì)算機(jī)重啟后無(wú)效
[root@proxy ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
//修改/etc/sysctl.conf配置文件圣勒,可以實(shí)現(xiàn)永久有效規(guī)則
步驟三:網(wǎng)絡(luò)型防火墻案例
1)網(wǎng)絡(luò)型防火墻案例
部署如表-3所示的網(wǎng)絡(luò)拓?fù)浞驯洌欢ㄒ裵roxy主機(jī)的路由轉(zhuǎn)發(fā)功能打開(kāi)。
添加網(wǎng)關(guān)的命令
[root@client ~]# nmcli connection modify eth0 ipv4.gateway 192.168.4.5
[root@client ~]# nmcli connection up eth0
[root@web1 ~]# nmcli connection modify eth1 ipv4.gateway 192.168.2.5
[root@web1 ~]# nmcli connection up eth1
確認(rèn)不同網(wǎng)絡(luò)的聯(lián)通性
[root@client ~]# ping 192.168.2.100
[root@web1 ~]# ping 192.168.4.100
在web1主機(jī)上啟動(dòng)http服務(wù)
[root@web1 ~]# yum -y install httpd
[root@web1 ~]# echo "test page" > /var/www/html/index.html
[root@web1 ~]# systemctl restart httpd
沒(méi)有防火墻的情況下client訪問(wèn)web服務(wù)
[root@client ~]# curl http://192.168.2.100 ???????????????????//成功
設(shè)置proxy主機(jī)的防火墻規(guī)則圣贸,保護(hù)防火墻后面的Web服務(wù)器
[root@proxy ~]# iptables -I FORWARD -s 192.168.4.100 -p tcp --dport 80 -j DROP
設(shè)置完防火墻規(guī)則后挚歧,再次使用client客戶端訪問(wèn)測(cè)試效果
[root@client ~]# curl http://192.168.2.100 ???????????????????//失敗
步驟四:禁ping的相關(guān)策略
1)默認(rèn)直接禁ping的問(wèn)題?
[root@proxy ~]# iptables -I INPUT -p icmp -j DROP
//設(shè)置完上面的規(guī)則后吁峻,其他主機(jī)確實(shí)無(wú)法ping本機(jī)滑负,但本機(jī)也無(wú)法ping其他主機(jī)
//當(dāng)本機(jī)ping其他主機(jī),其他主機(jī)回應(yīng)也是使用icmp用含,對(duì)方的回應(yīng)被丟棄
2)禁止其他主機(jī)ping本機(jī)矮慕,允許本機(jī)ping其他主機(jī)
[root@proxy ~]# iptables ?-A ?INPUT ?-p icmp ?\
> --icmp-type echo-request ?-j ?DROP
//僅禁止入站的ping請(qǐng)求,不拒絕入站的ping回應(yīng)包
注意:關(guān)于ICMP的類型耕餐,可以參考help幫助凡傅,參考命令如下:
[root@proxy ~]# iptables -p icmp --help
三防火墻擴(kuò)展規(guī)則
iptables在基本過(guò)濾條件的基礎(chǔ)上還擴(kuò)展了很多其他條件,在使用時(shí)需要使用-m參數(shù)來(lái)啟動(dòng)這些擴(kuò)展功能肠缔,語(yǔ)法如下:
iptables選項(xiàng) 鏈名稱 -m 擴(kuò)展模塊 --具體擴(kuò)展條件 -j 動(dòng)作
-m ?multiport --dports ?20:22,25,80,110,143,16501:16800-m time
-m mac ?--mac-source ?52:54:00:00:00:0b
-m mutiport --dports ?20:22,25,80,110,143,16501:16800
步驟一:根據(jù)MAC地址過(guò)濾
1)根據(jù)IP過(guò)濾的規(guī)則夏跷,當(dāng)對(duì)方修改IP后,防火墻會(huì)失效
[root@proxy ~]# iptables -F
[root@proxy ~]# iptables -I INPUT -s 192.168.4.100 -p tcp --dport 22 -j DROP
//設(shè)置規(guī)則禁止192.168.4.100使用ssh遠(yuǎn)程本機(jī)
但是明未,當(dāng)client主機(jī)修改IP地址后槽华,該規(guī)則就會(huì)失效,注意因?yàn)樾薷牧薎P趟妥,對(duì)client主機(jī)的遠(yuǎn)程連接會(huì)斷開(kāi)猫态,需要使用virt-manager開(kāi)啟虛擬機(jī)操作:
[root@client ~]# ifconfig eth0 ?192.168.4.101
[root@client ~]# ssh 192.168.4.5 ???????????????????//依然成功
根據(jù)MAC地址過(guò)濾,可以防止這種情況的發(fā)生
[root@client ~]# ip link show eth0 ???????????????????//查看client的MAC地址
eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP mode DEFAULT qlen 1000
link/ether 52:54:00:00:00:0b brd ff:ff:ff:ff:ff:ff
[root@proxy ~]# iptables ?-A ?INPUT ?-p tcp --dport 22\
> -m ??mac --mac-source ?52:54:00:00:00:0b ?-j ?DROP
//拒絕52:54:00:00:00:0b這臺(tái)主機(jī)遠(yuǎn)程本機(jī)
步驟二:基于多端口設(shè)置過(guò)濾規(guī)則
1)一次需要過(guò)濾或放行很多端口時(shí)會(huì)比較方便
[root@proxy ~]# iptables ?-A ?INPUT ?-p tcp ??\
> -m ?multiport --dports ?20:22,25,80,110,143,16501:16800 ?-j ?ACCEPT
//一次性開(kāi)啟20,21,22,25,80,110,143,16501到16800所有的端口
提示披摄,多端口還可以限制多個(gè)源端口亲雪,但因?yàn)樵炊丝诓还潭ǎ话悴粫?huì)使用疚膊,限制多個(gè)源端口的參數(shù)是--sports.
步驟三:根據(jù)IP地址范圍設(shè)置規(guī)則
1)允許從 192.168.4.10-192.168.4.20 登錄
[root@proxy ~]# iptables ?-A ?INPUT ?-p tcp ?--dport ?22 ?\
> -m ?iprange ?--src-range ?192.168.4.10-192.168.4.20 ??-j ?ACCEPT
注意义辕,這里也可以限制多個(gè)目標(biāo)IP的范圍,參數(shù)是--dst-range,用法與--src-range一致寓盗。
2)禁止從 192.168.4.0/24 網(wǎng)段其他的主機(jī)登錄
[root@proxy ~]# iptables -A INPUT -p tcp --dport 22 ?-s 192.168.4.0/24 ?-j ?DROP
四配置SNAT實(shí)現(xiàn)共享上網(wǎng)
步驟一:搭建內(nèi)外網(wǎng)案例環(huán)境
這里灌砖,我們?cè)O(shè)定192.168.2.0/24網(wǎng)絡(luò)為外部網(wǎng)絡(luò),192.168.4.0/24為內(nèi)部網(wǎng)絡(luò)傀蚌。
現(xiàn)在基显,在外部網(wǎng)絡(luò)中有一臺(tái)web服務(wù)器192.168.2.100,因?yàn)樵O(shè)置了網(wǎng)關(guān)善炫,client已經(jīng)可以訪問(wèn)此web服務(wù)器了撩幽。但,如果查看web1的日志就會(huì)發(fā)現(xiàn)箩艺,日志里記錄的是192.168.4.100在訪問(wèn)網(wǎng)頁(yè)摸航。
我們需要實(shí)現(xiàn)的效果是制跟,client可以訪問(wèn)web服務(wù)器,但要偽裝為192.168.2.5后再訪問(wèn)web服務(wù)器(模擬所有位于公司內(nèi)部的電腦都使用的是私有IP酱虎,希望訪問(wèn)外網(wǎng)雨膨,就需要偽裝為公司的外網(wǎng)IP后才可以)。
步驟二:設(shè)置防火墻規(guī)則读串,實(shí)現(xiàn)IP地址的偽裝(SNAT源地址轉(zhuǎn)換)
1)確保proxy主機(jī)開(kāi)啟了路由轉(zhuǎn)發(fā)功能
[root@proxy ~]# echo 1 > /proc/sys/net/ipv4/ip_forward ???????????//開(kāi)啟路由轉(zhuǎn)發(fā)
2)設(shè)置防火墻規(guī)則聊记,實(shí)現(xiàn)SNAT地址轉(zhuǎn)換
[root@proxy ~]# iptables ?-t ?nat ?-A POSTROUTING \
> -s ?192.168.4.0/24 -p tcp --dport 80 ?-j SNAT ?--to-source 192.168.2.5
3)登陸web主機(jī)查看日志
[root@proxy ~]# tail ?/var/log/httpd/access_log
.. ..
192.168.2.5 - - [12/Aug/2018:17:57:10 +0800] "GET / HTTP/1.1" 200 27 "-" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)"
通過(guò)日志會(huì)發(fā)現(xiàn),客戶端是先偽裝為了192.168.2.5之后再訪問(wèn)的web服務(wù)器恢暖!
4)擴(kuò)展知識(shí)排监,對(duì)于proxy外網(wǎng)IP不固定的情況可以執(zhí)行下面的地址偽裝,動(dòng)態(tài)偽裝IP杰捂。
[root@proxy ~]# iptables ?-t ?nat ?-A POSTROUTING \
> -s ?192.168.4.0/24 -p tcp --dport 80 -j MASQUERADE
最后舆床,所有iptables規(guī)則都是臨時(shí)規(guī)則,如果需要永久保留規(guī)則需要執(zhí)行如下命令:
[root@proxy ~]# service ?iptables save
結(jié)束語(yǔ):
更多精彩內(nèi)容持續(xù)更新中嫁佳,關(guān)注我微信公眾號(hào)挨队,有你更精彩。