1. 程式人生 > >防火墻iptables詳解(一)

防火墻iptables詳解(一)

主從dns服務器 進行 所有 out show mountd 讀取 ppp 概念

--
防火墻
常見的防火墻 :瑞星 江民 諾頓 卡巴斯基 天網......
iptables firewalld http://www.netfilter.org/ netfilter / iptables --iptables 的全名 2.4版本內核後都集成有這個組件 # yum install iptables\* # rpm -qa |grep iptables iptables-services-1.4.21-17.el7.x86_64 iptables-utils-1.4.21-17.el7.x86_64 iptables-devel-1.4.21-17.el7.x86_64 iptables-1.4.21-17.el7.x86_64 # systemctl start iptables.service # systemctl status iptables.service
iptables 基本概念 四張表: 表裏有鏈 (chain ) filter: 用來進行包過濾: INPUT OUTPUT FORWARD nat: 用來網絡地址轉換: network address translation ,允許一個內網地址塊,通過NAT轉換成公網IP,實現對公網的訪問,解決IP地址不足 PREROUTING INPUT POSTROUTING OUTPUT mangle :用來對數據包標記 PREROUTING INPUT OUTPUT FORWARD POSTROUTING raw:對原始數據包的處理 PREROUTING OUTPUT Incoming / \ Outgoing -->[Routing ]--->|FORWARD|-------> [Decision] \_____/ ^ | | | ____ ___ / / \ |OUTPUT| |INPUT| \____/ \___/ ^ | | ----> Local Process ----
iptables -A 增加一條規則,後接鏈名,默認是加到規則的最後面 -D 刪除 -L 列出規則 -n 以數值顯示 -I 在最前面插入規則 -v 顯示統計數據,與-L一起用,看到的信息更多    -F 清空規則 -z 清空計數器 -x 清空自定義鏈 -t 後接表名 -P policy,默認策略 -p protocol,後接協議名 --dport 目標端口 --sport 源端口 -d destination,目標地址 -s source,源地址 -i 接網卡接口, 進入的網卡接口 -o 接網卡接口, 出去的網卡接口 -j 後接動作 動作的分類: ACCEPT 接收數據包 DROP 丟棄數據包 REJECT 拒絕數據包,和DROP的區別就是REJECT會返回錯誤信息,DROP不會 MASQUEREAD IP地址偽裝,使用NAT轉換成外網IP,可以PPP拔號(外網IP不固定情況) SNAT 源地址轉換,它與MASQUEREAD的區別是SNAT是接一個固定IP DNAT 目標地址轉換 LOG 記錄日誌 例1,列規則 iptables -L --默認看的就是filter表 iptables -L -t filter iptables -L -t nat iptables -L -t mangle iptables -L -t raw # iptables -t filter -F # iptables -t nat -F # iptables -t mangle -F --這三張表有些默認的規則,我們把規則都清掉 例2,控制ping 172.16.25.0/24網段ping本機,會被拒絕(客戶端會收到拒絕信息) # iptables -t filter -A INPUT -p icmp -s 172.16.25.0/24 -j REJECT # iptables -t filter -D INPUT -p icmp -s 172.16.25.0/24 -j REJECT --刪除上一條規則 # iptables -t filter -A INPUT -p icmp -s 172.16.25.0/24 -j DROP # iptables -t filter -D INPUT -p icmp -s 172.16.25.0/24 -j DROP # iptables -t filter -A OUTPUT -p icmp -d 172.16.25.0/24 -j REJECT # iptables -t filter -D OUTPUT -p icmp -d 172.16.25.0/24 -j REJECT # iptables -t filter -A OUTPUT -p icmp -d 172.16.25.0/24 -j DROP # iptables -t filter -D OUTPUT -p icmp -d 172.16.25.0/24 -j DROP --上面四種方法都可以控制拒絕172.16.25.0/24網段ping本機 # iptables -t filter -A INPUT -p icmp -j REJECT --如果不寫-s或-d,默認代表所有人 擴展 我想實現所有人都ping不通我,但是172.16.25.X(X你自定義)這個IP能ping通我 --提示:iptables的匹配規則:讀取的順序是從上往下一條一條匹配,匹配一條就不繼續往下匹配,都沒有匹配,則最後匹配默認策略 # iptables -t filter -A INPUT -p icmp -j REJECT # iptables -t filter -A INPUT -p icmp -s 172.16.25.X -j ACCEPT --此寫法錯誤的 # iptables -t filter -A INPUT -p icmp -j REJECT # iptables -t filter -I INPUT -p icmp -s 172.16.25.X -j ACCEPT --正確寫法,把第二條加到第一條前面 # iptables -t filter -I INPUT 2 -p icmp -s 172.16.25.X -j ACCEPT --鏈後面接數字2,表示插入到原來第二條的上面,成為新的第2條 刪除的方法: 方法一: # iptables -t filter -D INPUT -s 172.16.25.X -p icmp -j ACCEPT --加的時候怎麽寫,刪除時就要怎麽寫 A 參數換成 D就可以 方法二; # iptables -L -n --line # iptables -D INPUT 2 --在規則比較多或者不好寫規則的情況下,可以先用--line或者--line-number列出行號,再用行號刪除 方法三: # iptables -F --直接清空filter表的所有規則 iptables -X iptables -Z --清除計數器,自定義鏈 修改操作: # iptables -t filter -R INPUT 3 -p icmp -s 172.16.25.248 -j ACCEPT --把filter表INPUT鏈第三行,修改成上面的命令的內容 例3,規則的保存與還原 # iptables-save > /etc/sysconfig/iptables --將當前規則保存到這個文件,文件可以自定義 # iptables-restore < /etc/sysconfig/iptables --把保存的規則還原回去 --/etc/sysconfig/iptables文件為默認保存文件,重啟iptables服務會默認把此文件裏的規則還原。當然也可以手工保存到另一個文件,就需要iptables-restore手工還原了。 如果要永久保留此規則,則先iptables-save > /etc/sysconfig/iptables保存,再# systemctl enable iptables.service做成開機自動啟動就可以了 如果你想做成開機自動空規則(沒有任何iptables策略),你可以把/etc/sysconfig/iptables保存為空規則,然後systemctl enable iptables.service  例4,每個鏈的默認策略的修改 # iptables -P INPUT DROP --INPUT鍵默認策略改為DROP,改回來把DROP換成ACCEPT就行了 # iptables -P OUTPUT DROP --OUTPUT鍵默認策略改為DROP 例5,實現允許ssh過來(代表本機為服務器身份),ssh出去(代表本機為客戶端身份),別的任何訪問都拒絕 (要求,INPUT和OUTPUT雙鏈默認策略都為DROP)
172.16.25.2 172.16.25.3 OUTPUT INPUT 客戶端 隨機端口 ---》 服務器 22    (1024-65535)  客戶端 隨機端口 《--- 服務器 22 INPUT OUTPUT 服務器 iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -A INPUT -p tcp --dport 22 -s 172.16.25.2 -j ACCEPT iptables -A OUTPUT -p tcp --sport 22 -d 172.16.25.2 -j ACCEPT 客戶端 iptables -F iptables -P INPUT DROP iptables -P OUTPUT DROP iptables -A OUTPUT -p tcp --dport 22 -d 172.16.25.3 -j ACCEPT iptables -A INPUT -p tcp --sport 22  -s 172.16.25.3 -j ACCEPT 例6, 把上面的例子基礎上再加http服務(tcp的80端口),怎麽做? 答案:和上面做法一樣,把22換成80就ok了 http tcp 80 https tcp 443 例7, 在上面的基礎上再加上允許別人訪問本臺服務器的DNS 只需要做udp的53端口就可以了,不用寫tcp 53(因為tcp 53主要是用於主從DNS服務器同步的) 一些特殊的寫法 連續端口或多端口寫法 iptables -A INPUT -p tcp --dport 1:1000 -j ACCEPT iptables -A INPUT -p tcp -m multiport --dport 25,110 -j ACCEPT 硬件地址 iptables -A INPUT -m mac --mac-source 00:23:CD:95:DA:0B -p all --dport 80 -j ACCEPT 例8 samba 139 445 例9, 郵件服務器 smtp 25 pop3 110 imap 143 smtps 465 pop3s 995 imaps 993 ----- 公司郵件服務器-----    |   |    |   | 張三(發信人) 李四(收信人) [email protected] [email protected] 網易郵件服務器 ----------騰訊郵件服務器    |   |    |   | 張三(發信人) 李四(收信人) [email protected] [email protected] # iptables -P INPUT DROP # iptables -P OUTPUT DROP # iptables -A INPUT -p tcp -m multiport --dport 25,110,143 -s 172.16.25.0/24 -j ACCEPT # iptables -A OUTPUT -p tcp -m multiport --sport 25,110,143 -d 172.16.25.0/24 -j ACCEPT 例10 dhcp iptables 對dhcp端口控制無效 應用層 表示層 會話層 傳輸層 網絡層 數據鏈路層 物理層 例11 nfs --因為nfs用到rpc調用,端口不固定,所以需要把端口給固定起來.nis服務也會用到rpc調用,也需要做端口綁定 vim /etc/sysconfig/nfs --在此文件裏加上下面四句 LOCKD_TCPPORT=3000 LOCKD_UDPPORT=3000 MOUNTD_PORT=3001 STATD_PORT=3002 /etc/init.d/nfs restart /etc/init.d/rpcbind restart --這裏先把默認策略改成ACCEPT,再啟動就可以啟動起來,然後再把默認策略改回成DROP,再繼續做下面的實驗 netstat -ntl |grep 300 去查看,看到rpc.的守護進程的端口為自己綁定的端口 iptables -A INPUT -p tcp --dport 3000:3002 -j ACCEPT iptables -A OUTPUT -p tcp --sport 3000:3002 -j ACCEPT iptables -A INPUT -p udp --dport 3000:3002 -j ACCEPT iptables -A OUTPUT -p udp --sport 3000:3002 -j ACCEPT 還要加上2049(nfs)和111(rpcbind)的端口的規則 iptables -A INPUT -p tcp --dport 2049 -j ACCEPT iptables -A OUTPUT -p tcp --sport 2049 -j ACCEPT iptables -A INPUT -p udp --dport 2049 -j ACCEPT iptables -A OUTPUT -p udp --sport 2049 -j ACCEPT iptables -A INPUT -p tcp --dport 111 -j ACCEPT iptables -A OUTPUT -p tcp --sport 111 -j ACCEPT iptables -A INPUT -p udp --dport 111 -j ACCEPT iptables -A OUTPUT -p udp --sport 111 -j ACCEPT --現在就可以用另一臺機showmount -e 查看並進行掛載了 --練習:把上面的3000,3001,3002,2049,111合起來來做 # iptables -A INPUT -p tcp -m multiport --dport 111,2049,3000,3001,3002 -j ACCEPT # iptables -A INPUT -p udp -m multiport --dport 111,2049,3000,3001,3002 -j ACCEPT # iptables -A OUTPUT -p tcp -m multiport --sport 111,2049,3000,3001,3002 -j ACCEPT # iptables -A OUTPUT -p udp -m multiport --sport 111,2049,3000,3001,3002 -j ACCEPT 例12: yum 視你做的yum類型而定 file ftp http 例13 mysql 3306 例14 rsync 873 還加一個22 例15 vnc 5900 例16: telent 23 例17: tftp 69 例18: rsyslog遠程日誌  tcp/udp 514
練習: ftp實現雙鏈拒絕的情況下,客戶端通過主動和被動都能訪問進來 服務器端準備: # yum install vsftpd -y # vim /etc/vsftpd/vsftpd.conf --直接在配置文件最後加上這兩句就可以 pasv_min_port=3000 pasv_max_port=3005 # systemctl restart vsftpd # iptables -P INPUT DROP # iptables -P OUTPUT DROP 客戶端測試方法: 1,命令連接測試,能成功連接上就表示命令端口連接沒問題 # ftp 172.16.25.3(服務器的ip) 2,數據傳輸測試,用上面的命令登錄成功後,在客戶端使用passive指令轉換你的主動和被動模式, (服務器端不用轉換,因為服務器端默認就是主動和被動都支持的) 然後使用ls指令能看到裏面的pub子目錄就表示數據傳輸OK了(因為默認是登錄到服務器的/var/ftp/目錄,裏面有一個pub子目錄) ftp有主動和被動的連接兩種 1,為什麽有主動和被動兩種連接方式呢? 因為這是一種比較古老的設計方式,它是假設客戶端用戶有防火墻並且還不會配置防火墻的情況下,才設計出兩種模式。 防火墻默認只會拒絕進來的包,而不會拒絕出去或出去回來的包。 2,一般用主動好還是被動好? 用被動比較常見,(原因參考問題一) 3,主動和被動在使用時的區別? 沒有防火墻,那麽使用起來沒什麽區別,只是底層傳輸包的方式不一樣 有防火墻,那麽防火墻的規則寫法也不一樣 主動: server client 20 21 n m <------------- --------------> ----------------------------------------> <--------------------------------------- iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT iptables -A OUTPUT -p tcp --sport 20 -j ACCEPT iptables -A INPUT -p tcp --dport 20 -j ACCEPT 被動: server client 隨機端口 21 n m 3000-3005 <--------------- ----------------> <-------------------------------------------- ---------------------------------------------> iptables -A INPUT -p tcp --dport 21 -j ACCEPT iptables -A OUTPUT -p tcp --sport 21 -j ACCEPT iptables -A INPUT -p tcp --dport 3000:3005 -j ACCEPT iptables -A OUTPUT -p tcp --sport 3000:3005 -j ACCEPT ==================================================================================================== rhel7和centos7的新防火墻軟件 firewalld  (但仍然可以使用iptables) 官網地址 http://www.firewalld.org/ # yum install firewalld firewall-config # systemctl restart firewalld --啟動服務 # systemctl status firewalld --確認狀態 # systemctl enable firewalld --設為開機自動啟動(可選) 概念一: Zone 簡單來說就是防火墻方案,就是一套規則集,你可以切換使用哪一個zone # firewall-cmd --get-zones --查看現在有哪些zone work drop internal external trusted home dmz public block drop:拒絕所有外部連接請求。 block:拒絕所有外部連接(with an icmp-host-prohibited message for IPv4 and icmp6-adm-prohibited for IPv6),允許內部發起的連接 public:適用公共環境,拒絕所有外部連接請求,但指定外部連接可以進入 external:特別適用路由器啟用了偽裝功能的外部網。拒絕所有外部連接請求,只能接收經過選擇的連接。 dmz:用於您的非軍事區內的電腦,此區域內可公開訪問,可以有限地進入您的內部網絡,僅僅接收經過選擇的連接。(受限制的公共連接可以進入) work:適用於工作網絡環境,概念和workgoup一樣,也是指定的外部連接允許用於工作區。 home:類似家庭組,用於家庭網絡。您可以基本信任網絡內的其他計算機不會危害您的計算機。僅僅接收經過選擇的連接 internal:用於內部網絡。您可以基本上信任網絡內的其他計算機不會威脅您的計算機。僅僅接受經過選擇的連接 trusted:可接受所有的網絡連接。(最不安全) # firewall-cmd --get-default-zone  --查看當前使用的zone public # firewall-cmd --set-default-zone=work # firewall-cmd --set-default-zone=public --修改當前使用的zone # firewall-cmd --list-all  --查看當前使用的zone的規則集 # firewall-cmd --zone=work --list-all --指定查看work這個zone的規則集 概念二: 網卡接口 # firewall-cmd --zone=public --add-interface=eth0 --指定網卡加入到哪個zone # firewall-cmd --get-zone-of-interface=eth0 --查看網卡加入到哪個zone 概念三: port,service 分別表示端口和服務 # firewall-cmd --add-port=80/tcp  --允許tcp的80端口進來的通迅(類似iptables的INPUT) # firewall-cmd --remove-port=80/tcp --刪除上面的規則 # firewall-cmd --add-service=http --允許http服務進來的通迅(不用管它是什麽端口,只記住服務就好了) # firewall-cmd --remove-service=http # firewall-cmd --add-service=ftp --允許ftp服務進來的通迅(無論主動還是被動都可以,這樣就把iptables的寫法簡單化了) # firewall-cmd --remove-service=ftp 概念四: rich-rule復雜規則 # firewall-cmd --add-rich-rule="rule family="ipv4" source address=172.16.25.1 service name="ssh" accept" 下面兩條合起來實現允許所有人訪問我的http,但drop掉172.16.25.1的訪問我的http的包 # firewall-cmd --add-service=http # firewall-cmd --add-rich-rule="rule family="ipv4" source address=172.16.25.1 service name="http" drop" 概念五: 關於立即生效與永久生效的討論 上面加端口或加服務規則,是立即生效,但重啟不生效(可以使用firewall-cmd --reload來裝載保存的規則) # firewall-cmd --permanent --add-service=ftp  --加了一個--permanent參數後,立即不生效,需要reload後才能生效 實際寫規則時,建議直接寫(不加--permanent參數),所有規則寫完,測試完成後,再使用# firewall-cmd --runtime-to-permanent全部轉成permanent規則 概念六: panic模式 # firewall-cmd --panic-on # firewall-cmd --panic-off 概念七: 圖形配置 # firewall-config

防火墻iptables詳解(一)