第一章:防火墻介紹
1.常見防火墻選用
硬件防火墻
開源軟件:iptables(默認規則改為INPUT DROP)
云服務器:安全組(阿里云 白名單,默認是拒絕的)
2.iptables使用 執行過程
3.iptables 4表5鏈
4.準備iptables環境
5.iptables功能之一防火墻
封IP 封端口
準許某個ip訪問 網段訪問
6.iptables功能之內網服務器上外網(共享上網)
7.iptables功能之 端口轉發
第二章:常見防火墻選用
- 公司網站入口使用的硬件 防火墻 、三次路由帶有防火墻功能
- itpables訪問量小 C5 C6自帶,CentOS 7為Firewalld
SELinux
第三章: 相關名詞與單詞
名詞 | 含義 | 對比 |
---|---|---|
容器 | 存放內容/存放東西 | |
Netfilter/iptables | 是表的容器 | 國家 |
表(table) | 表是用來存放鏈的容器 | 省 |
鏈(chain) | 鏈 存放規則的容器 | 市 |
規則(policy) | 準許/拒絕訪問 | 區/縣 |
第四章:防火墻執行過程
1. 防火墻是層層過濾的,實際是按照配置**規則**的順序**從上到下**,**從前到后**進行過濾的。
2. 如果**匹配**上規則,即明確表示是阻止(DROP)還是通過(ACCEPT)數據包就**不再向下匹配新的規則。**
3. 如果規則中沒有明確表明是阻止還是通過的,也就是沒有匹配規則,向下進行匹配,直到匹配**默認規則**得到明確的阻止還是通過。
4. 防火墻的默認規則是所有規則執行完才執行的。
image
第五章:四表五鏈
5.1 四表及作用
表 | 功能 |
---|---|
Filter | 過濾,默認的表,防火墻功能 |
NAT | 實現NAT轉化:1.共享上網 2.端口轉發 |
mangle | |
raw |
5.2 四表中的5鏈
image
####五鏈:
PREROUTING
FORWARD
INPUT
OUPUT
POSTROUTING
image
image
5.3 filter表和nat表
image
5.3.1 filter表
filter表 | 企業工作場景:主機防火墻 |
---|---|
INPUT | 就是過濾進入主機的數據包 |
FORWARD | 負責轉發流經主機的數據包 |
OUTPUT | 就是處理從主機發出去的數據包 |
5.3.2 nat表
nat表 | |
---|---|
PREROUTING | 處理用戶請求中的目的地址 目的端口 端口轉發 ip映射 |
POSTROUTING | 處理離開服務器的請求 源端口 源ip :共享上網 |
OUTPUT | 和主機放出去的數據包有關,改變主機發出數據包的目的地址 |
補充:
filter表:
??INPUT 作用:用于發送到本地套接字的數據包。
?FORWARD 作用:對于正在通過該框路由的數據包
?OUTPUT 作用:用于本地生成的數據包。
nat表:
?PREROUTING 作用:因為他們一進來就改變了包
?OUTPUT 作用:用于在路由之前更改本地劃分的數據包。
?POSTROUTING 作用:改變包,因為它們即將離開
第六章:防火墻之filter表
6.1環境準備
[root@m01 ~]# rpm -qa iptables-services
iptables-1.4.21-28.el7.x86_64
[root@m01 ~]# rpm -ql iptables-services
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables #iptables 配置文件
/usr/lib/systemd/system/ip6tables.service
/usr/lib/systemd/system/iptables.service #iptables服務管理配置
啟動防火墻
[root@m01 ~]# systemctl stop firewalld #CentOS7關閉firewalld [root@m01 ~]# systemctl restart iptables [root@m01 ~]# systemctl enable iptables
手動加載內核模塊
[root@m01 ~]# modprobe ip_tables
[root@m01 ~]# modprobe iptable_filter
[root@m01 ~]# modprobe iptable_nat
[root@m01 ~]# modprobe ip_conntrack
[root@m01 ~]# modprobe ip_conntrack_ftp
[root@m01 ~]# modprobe ip_nat_ftp
[root@m01 ~]# modprobe ipt_state
檢查防火墻內核模塊是否加載成功:
[root@m01 ~]# lsmod |egrep 'nat|ipt|filter' nf_nat_ftp 12770 0 nf_conntrack_ftp 18638 1 nf_nat_ftp ipt_REJECT 12541 2 nf_reject_ipv4 13373 1 ipt_REJECT ipt_MASQUERADE 12678 1 nf_nat_masquerade_ipv4 13412 1 ipt_MASQUERADE iptable_filter 12810 1 xt_nat 12681 2 iptable_nat 12875 1 nf_nat_ipv4 14115 1 iptable_nat nf_nat 26787 4 nf_nat_ftp,nf_nat_ipv4,xt_nat,nf_nat_masquerade_ipv4 nf_conntrack 133095 8 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_nat_masquerade_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4 ip_tables 27126 2 iptable_filter,iptable_nat libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
6.2 配置規則-禁止訪問22端口
[root@m01 ~]# iptables -F #清除規則 [root@m01 ~]# iptables -X [root@m01 ~]# iptables -Z [root@m01 ~]# iptables -nL #查看規則 Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination [root@m01 ~]# #添加一條規則,禁止22端口訪問 [root@m01 ~]# iptables -t filter -A INPUT -p tcp --dport 22 -j DROP [root@m01 ~]# Type `help' to learn how to use Xshell prompt. [d:\~]$ #斷開了~跑下機房
刪除規則,重新連接m01
[root@m01 ~]# iptables -nL --line-number #查看防火墻規則 [root@m01 ~]# iptables -t filter -D INPUT 1 #刪除第1條規則 [root@m01 ~]# iptables -nL --line-number #再次查看
image
重新連接 22端口就可以用了
Type `help' to learn how to use Xshell prompt.
[d:\~]$
Connecting to 10.0.0.61:22...
Connection established.
To escape to local shell, press 'Ctrl+Alt+]'.
Last login: Tue Jul 2 17:04:55 2019
[root@m01 ~]#
配置防火墻規則注意事項:
去機房重啟系統或者登陸服務器刪除剛才的禁止規則。
讓機房人員重啟服務器或者讓機房人員拿用戶密碼登錄進去
通過服務器的遠程管理卡管理(推薦)
先寫一個定時任務,每5分鐘就停止防火墻**5. 測試環境測試好,寫成腳本,批量執行
6.3 filter表其他規則配置
6.3.1 只讓10.0.0.0/24網段進行訪問連接
只要是10.0.0.0/24 局域網的用戶 訪問m01 都ACCEPT
此例子主要限制:網段或ip地址
[root@m01 ~]# iptables -A INPUT -p tcp ! -s 10.0.0.0/24 -j DROP #"!" 嘆號表示取反
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- !10.0.0.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
image
去另一臺服務器上測試一下是否成功:
[root@db01 ~]# ssh 10.0.0.61 #連接10.0.0.61,可以連接 root@10.0.0.61's password: Last login: Tue Jul 2 17:41:01 2019 from 10.0.0.51 [root@m01 ~]# logout #退出 Connection to 10.0.0.61 closed. [root@db01 ~]# ssh 172.16.1.61 #連接172.16.1.61,不可以連接 ....等到死
image
6.3.2準許或禁止端口
多個端口:表示范圍 1-1024范圍
[root@m01 ~]# iptables -I INPUT -p tcp ! --dport 1:1024 -j DROP
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:!1:1024
2 DROP tcp -- !10.0.0.0/24 0.0.0.0/0
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
多個端口 不連續 80,443,52113,22
[root@m01 ~]# iptables -I INPUT -p tcp -m multiport ! --dport 80,443,22 -j DROP
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
num target prot opt source destination
1 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports !80,443,22
Chain FORWARD (policy ACCEPT)
num target prot opt source destination
Chain OUTPUT (policy ACCEPT)
num target prot opt source destination
6.4 iptables命令及參數
iptables | |
---|---|
-t | 指定表 filter(默認) nat |
-A | append 把規則追加到末尾 |
-I (大寫字母i ) | insert 把規則插入到規則的第1條 (添加拒絕類規則的時候) |
-p | protocal 指定協議:tcp /udp/icmp |
--dport | destination port 目標端口 |
--sport | source port 源端口 |
-d | dest ip address 目標ip地址 |
-s | source ip address 源ip地址 |
-j | jump 方法 DROP (拒絕)、 ACCEPT(準許) 、REJECT(拒絕) |
iptables查看 刪除 | ||
---|---|---|
-F | 清除鏈中所有規則 | |
-X | 清空自定義鏈的規則 | |
-Z | 清空計數器 | |
-n | 不要把端口解析服務名字 | |
-L | 顯示表中的規則 | |
--line-number | 給每個鏈中的規則加上行號 | |
-D | 刪除規則 根據規則的號碼進行刪除 |
第七章: nc命令
##### nc用法:
**nc -l 指定監聽端口**
**nc/telnet 連接**
[root@m01 ~]# nc -l 888 #m01服務器上
晚上好
[root@db01 ~]# nc 10.0.0.61 888 #db01服務器上
晚上好
第八章: 準許或禁止ping
現在是可以ping通的
[root@m01 ~]# ping 10.0.0.61
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.064 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.038 ms
^C
--- 10.0.0.61 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.038/0.051/0.064/0.013 ms
[root@m01 ~]# ping 172.16.1.61
PING 172.16.1.61 (172.16.1.61) 56(84) bytes of data.
64 bytes from 172.16.1.61: icmp_seq=1 ttl=64 time=0.079 ms
64 bytes from 172.16.1.61: icmp_seq=2 ttl=64 time=0.039 ms
^C
--- 172.16.1.61 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.039/0.059/0.079/0.020 ms
[root@m01 ~]#
添加icmp,禁止ping
[root@m01 ~]# iptables -I INPUT -p icmp --icmp-type any -j DROP #禁止ping
[root@m01 ~]#
[root@m01 ~]# ping 10.0.0.61 #ping不通了
PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
^C
--- 10.0.0.61 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 1999ms
[root@m01 ~]# ping 172.16.1.61 #ping不通了
PING 172.16.1.61 (172.16.1.61) 56(84) bytes of data.
^C
--- 172.16.1.61 ping statistics ---
3 packets transmitted, 0 received, 100% packet loss, time 2001ms
[root@m01 ~]# ping 127.0.0.1 #ping不通了
PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
^C
--- 127.0.0.1 ping statistics ---
2 packets transmitted, 0 received, 100% packet loss, time 1003ms
第九章:限制訪問頻率
image
iptables -I INPUT -s 10.0.1.0/24 -p icmp --icmp-type 8 -m limit --limit 6/min --limit-burst 5 -j ACCEPT
第十章:永久保存規則
[root@m01 ~]# cat /etc/sysconfig/iptables #防火墻的默認規則
# sample configuration for iptables service
# you can edit this manually or use system-config-firewall
# please do not ask us to add additional ports/services to this default configuration
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
COMMIT
[root@m01 ~]# iptables-save #當前的防火墻規則
# Generated by iptables-save v1.4.21 on Wed Jul 3 09:28:21 2019
*filter
:INPUT ACCEPT [93:6196]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [69:7412]
-A INPUT -s 10.0.1.0/24 -p icmp -m icmp --icmp-type 8 -m limit --limit 6/min -j ACCEPT
-A INPUT -p icmp -m icmp --icmp-type any -j DROP
COMMIT
# Completed on Wed Jul 3 09:28:21 2019
# Generated by iptables-save v1.4.21 on Wed Jul 3 09:28:21 2019
*nat
:PREROUTING ACCEPT [39:2360]
:INPUT ACCEPT [2:104]
:OUTPUT ACCEPT [44:3050]
:POSTROUTING ACCEPT [44:3050]
-A POSTROUTING -s 10.8.0.0/24 ! -d 10.8.0.0/24 -j SNAT --to-source 10.0.0.61
-A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.61
COMMIT
# Completed on Wed Jul 3 09:28:21 2019
[root@m01 ~]# iptables-save >/etc/sysconfig/iptables
[root@m01 ~]#
[root@m01 ~]# iptables-restore < /etc/sysconfig/iptables
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target prot opt source destination
ACCEPT icmp -- 10.0.0.0/24 0.0.0.0/0 icmptype 8 limit: avg 6/min burst 5
ACCEPT icmp -- 10.0.1.0/24 0.0.0.0/0 icmptype 8 limit: avg 6/min burst 5
DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 255
Chain FORWARD (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
[root@m01 ~]# systemctl restart iptables.service
注意事項:
- iptables-save >/etc/sysconfig/iptables
- iptables 是關閉狀態 stop/disable
- 關閉時不要使用iptables -nL查看狀態 ,一查看就打開了
- 查看防火墻狀態:systemctl is-active iptables
第11章: 生產環境防火墻配置
1.逛公園:防火墻默認的規則 默認規則都是允許(Chain INPUT (policy ACCEPT))
2.電影院:默認規則是拒絕DROP 憑票進入
image
image
image
允許SSH登錄端口進入
[root@m01 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
允許機回環Io接口數據流量流出與流入
[root@m01 ~]# iptables -A OUTPUT -o lo -j ACCEPT
[root@m01 ~]# iptables -A INPUT -i lo -j ACCEPT
-i input 與 INPUT鏈一起使用
-o output 與 OUTPUT 鏈一起使用
準許icmp協議通過
[root@m01 ~]# iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
準許用戶使用的端口通過 80,443
#先把信任網段刪掉再進行測試
[root@m01 ~]# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
[root@m01 ~]# iptables -A INPUT -p tcp --dport 443 -j ACCEPT
#倆臺虛擬機上測試
[root@m01 ~]# nc -l 80
你好
[root@db01 ~]# telnet 10.0.0.61 80
Trying 10.0.0.61...
Connected to 10.0.0.61.
Escape character is '^]'.
你好
允許用戶與服務器建立連接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
開啟信任的IP網段
[root@m01 ~]# iptables -A INPUT -s 10.0.0.0/24 -p all -j ACCEPT
[root@m01 ~]# iptables -A INPUT -s 172.16.1.0/24 -p all -j ACCEPT
修改默認規則
[root@m01 ~]# iptables -P INPUT DROP
[root@m01 ~]# iptables -P FORWARD DROP
[root@m01 ~]# iptables -P OUTPUT ACCEPT
查看設置的規則
[root@m01 ~]# iptables -nL
Chain INPUT (policy DROP)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:443
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
ACCEPT all -- 172.16.1.0/24 0.0.0.0/0
Chain FORWARD (policy DROP)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
第十二章:NAT 表
nat表 | |
---|---|
PREROUTING | 處理用戶請求中的目的地址 目的端口 端口轉發 ip映射 |
POSTROUTING | 處理離開服務器的請求 源端口 源ip :**共享上網 |
OUTPUT | 和主機放出去的數據包有關,改變主機發出數據包的目的地址 |
保存好之前的規則刪除
[root@m01 ~]# iptables-save >/root/iptables.rule [root@m01 ~]# ll iptables.rule -rw-r--r-- 1 root root 969 Jul 3 10:33 iptables.rule
跑機房修改默認規則:
image
PREROUTING
image
[root@m01 ~]# #iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 8080 -j DNAT --to-destination 10.0.0.51:22
[root@m01 ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:8080 to:10.0.0.51:22
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
SNAT all -- 10.8.0.0/24 !10.8.0.0/24 to:10.0.0.61
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61
[root@m01 ~]# iptables -nL -t nat #查看nat表
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:9000 to:10.0.0.51:22
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
SNAT all -- 10.8.0.0/24 !10.8.0.0/24 to:10.0.0.61
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61
[root@m01 ~]# cat /proc/sys/net/ipv4/ip_forward #查看防火墻是否打開
1
[root@m01 ~]# lsmod |egrep 'nat|ipt|filter' #檢查
iptable_filter 12810 1
xt_nat 12681 3
iptable_nat 12875 1
nf_nat_ipv4 14115 1 iptable_nat
nf_nat 26787 2 nf_nat_ipv4,xt_nat
nf_conntrack 133095 3 nf_nat,nf_nat_ipv4,nf_conntrack_ipv4
ip_tables 27126 2 iptable_filter,iptable_nat
ipt_REJECT 12541 0
nf_reject_ipv4 13373 1 ipt_REJECT
libcrc32c 12644 3 xfs,nf_nat,nf_conntrack
#現在連接應該是不通,此刻需要添加一條內核優化
[root@m01 ~]# #第一種方法:
[root@m01 ~]# echo 1 > /proc/sys/net/ipv4/ip_forward
[root@m01 ~]# cat /proc/sys/net/ipv4/ip_forward
1
[root@m01 ~]# #第二種方法:
[root@m01 ~]# echo 'net.ipv4.ip_forward=1' >> /etc/sysctl.conf
#讓其生效
[root@m01 ~]# sysctl -p
POSTROUTING
image
#添加NAT共享上網命令
[root@m01 ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -o eth0 -j SNAT --to-source 10.0.0.61
[root@m01 ~]# iptables -t nat -nL
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
SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61
去db01上關閉網卡eth0
#關閉eth0網卡
[root@db01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=no #把eth0網卡關閉
IPADDR=10.0.0.51
PREFIX=24
GATEWAY=10.0.0.254
DNS1=10.0.0.254
或者
[root@db01 ~]# ifdown eth0 #暫時將eth0網卡關閉
#可以利用m01進行ssh遠程連接db01的內網地址
[root@m01 ~]# ssh 172.16.1.51
Last login: Wed Jul 3 11:12:04 2019 from 10.0.0.1
[root@db01 ~]#
#修改eth1網卡網關
[root@db01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=static
IPADDR=172.16.1.51
PREFIX=24
NAME=eth1
DEVICE=eth1
ONBOOT=yes
GATEWAY=172.16.1.61 #修改網關為m01的內網地址
DNS1=223.5.5.5 #DNS按原理來說會自動分配,如果不通的話就加入此條DNS解析即可
[root@db01 ~]# systemctl restart network #重啟網卡
[root@db01 ~]#
[root@db01 ~]# ping baidu.com #可以上網了
PING baidu.com (220.181.38.148) 56(84) bytes of data.
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=1 ttl=127 time=7.74 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=127 time=11.8 ms
^C
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 7.249/9.136/11.833/1.812 ms
[root@db01 ~]#
image