iptables防火牆詳解(一)


--
防火牆
常見的防火牆 :瑞星 江民 諾頓 卡巴斯基 天網......

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 POSTROUTINGOUTPUT
mangle :用來對數據包標記
PREROUTING INPUT OUTPUT FORWARD POSTROUTING
raw:對原始數據包的處理
PREROUTINGOUTPUT

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.2172.16.25.3

OUTPUTINPUT
客戶端 隨機端口 ---》 服務器 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
-----公司郵件服務器-----
   |  |
   |  |
張三(發信人)李四(收信人)
8888@qq.com 9999@qq.com



網易郵件服務器 ----------騰訊郵件服務器
   |  |
   |  |
張三(發信人)李四(收信人)
zhangsan@126.com 9999@qq.com

# 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

例10dhcp
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,主動和被動在使用時的區別?
沒有防火牆,那么使用起來沒什么區別,只是底層傳輸包的方式不一樣
有防火牆,那么防火牆的規則寫法也不一樣

主動:
serverclient

20 21nm
<-------------
-------------->
---------------------------------------->
<---------------------------------------

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

被動:
serverclient
隨機端口 21nm
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

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2020 ITdaan.com