iptables是開源的基於數據包過濾的防火牆工具。web
- Juniper 思科 華爲 H3C 中興 奇安信 - 天融信 深信服 綠盟科技 啓明星辰 網康 飛塔 金盾
Filter表 :過濾數據包,放行或拒絕,不會對數據包進行修改shell
NAT表:改寫數據包windows
本質就是不一樣的表和鏈處於不一樣的位置安全
yum install iptables-services -y服務器
modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state
lsmod |egrep 'filter|nat|ipt'
# 首先中止firewalld systemctl stop firewalld systemctl disable firewalld # 開啓iptables systemctl start iptables.service systemctl enable iptables.service
源IP: 10.0.0.200 源端口: xxx 目標IP: 10.0.0.100 目標端口: 22 執行的動做:禁止 執行命令: iptables -I INPUT -p tcp -s 10.0.0.200 --dport 22 -j DROP
[參數解釋]ssh
[驗證]curl
第二臺機器操做: ping 10.0.0.100 能夠通 curl 10.0.0.100 能夠訪問 ssh 10.0.0.100 不能訪問
[思考]tcp
iptables -I INPUT -p tcp -s 10.0.0.200 --dport 22 -j ACCEPT
工具
源IP: 10.0.0.200 源端口: xxx 目標IP: 10.0.0.100 目標端口: xxx 執行的動做:禁止 執行命令: iptables -I INPUT -p tcp -s 10.0.0.200 -j DROP
[驗證]測試
第二臺機器操做: ping 10.0.0.100 能夠通 curl 10.0.0.100 不能訪問 ssh 10.0.0.100 不能訪問
[思考]
爲何能夠ping通? 由於ping命令是ICMP協議
源IP: 除了10.0.0.200 源端口: xxx 目標IP: 10.0.0.100 目標端口: 80 執行的動做:禁止 操做命令: iptables -I INPUT -p tcp ! -s 10.0.0.200 --dport 80 -j DROP
[中文解釋]
若是訪問的端口是80而且他的IP地址不是200那麼拒絕掉
是and條件只有所有知足才執行動做
10.0.0.1 ---> 22端口 能夠訪問 10.0.0.1 ---> 80端口 訪問不了 10.0.0.200 ---> 22端口 能夠訪問 10.0.0.200 ---> 80端口 能夠訪問
源IP: 10.0.0.200 目標端口: 22,80 執行的動做:禁止 操做命令: iptables -I INPUT -p tcp -s 10.0.0.200 -m multiport --dport 22,80 -j DROP
[測試]
10.0.0.1 ---> 22端口 能夠訪問 10.0.0.1 ---> 80端口 能夠訪問 10.0.0.200 ---> 22端口 訪問不了 10.0.0.200 ---> 80端口 訪問不了
iptables -I INPUT -i lo -j ACCEPT iptables -A INPUT -p icmp --icmp-type 8 -j DROP #等同於 iptables -I INPUT ! -i lo -p ICMP --icmp-type 8 -j DROP
iptables -A INPUT ! -s 10.0.0.200 -p icmp --icmp-type 8 -j DROP
iptables -A INPUT -s 10.0.0.200 -p icmp --icmp-type 8 -j DROP
場景:服務器 最小開放哪些端口?對誰開放? 80 :不限制 443 :不限制 22 :只對windows這個電腦開放10.0.0.1 ping:禁止外面的人ping
[配置命令]
[測試]
10.0.0.1 ---> 22端口 不通 10.0.0.1 ---> 80端口 能夠訪問 10.0.0.1 ---> ping 不通 10.0.0.200 ---> 22端口 能夠訪問 10.0.0.200 ---> 80端口 能夠訪問 10.0.0.1 ---> ping 能夠訪問
*/5 * * * * iptables -P INPUT ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
iptables -P INPUT DROP
# 1.查看防火牆規則 iptables -nL # 2.插入規則 iptables -I iptables -A # 3.清除規則 iptables -F iptables -X iptables -Z # 4.刪除某條規則 iptables -nL --line-numbers iptables -D INPUT 3 # 5.修改默認防火牆規則 iptables -P INPUT DROP # 6.備份恢復 iptables-save > iptables_20201209 iptables-restore < iptables_20201209 iptables-save > /etc/sysconfig/iptables
=======================================================================================================================================
1.禁止某個IP訪問
數據包分析: db02訪問db01的22端口
源端口: 22
源IP: 10.0.0.52
目標端口:22
目標IP:10.0.0.51
規則命令1:
iptables -I INPUT -s 10.0.0.52 -j DROP
規則解釋:
-I INPUT #在INPUT鏈第一條插入
-s 10.0.0.52 #匹配的數據包源地址
-j DROP #匹配後執行的動做 ACCEPT DROP
規則命令2:
iptables -I INPUT -p tcp -s 10.0.0.52 -j DROP
規則解釋:
-p tcp #匹配tcp協議
2.禁止某個IP訪問個人某個端口
規則命令1:
iptables -I INPUT -s 10.0.0.52 -p tcp --dport 22 -j DROP
規則解釋:
--dport 22 #匹配訪問目標端口是22的數據包
規則命令2:
iptables -I INPUT -s 10.0.0.52 -p tcp -m state --state NEW --dport 22 -j DROP
iptables -I INPUT -s 10.0.0.52 -p tcp -m state --state ESTABLISHED --dport 22 -j DROP
規則解釋:
-m state --state ESTABLISHED #匹配TCP協議的鏈接狀態
3.禁止除了某個IP之外的地址訪問某個端口(只容許某個IP訪問某個端口)
應用場景:只容許跳板機的內網IP登錄SSH
iptables -I INPUT ! -s 10.0.0.52 -p tcp --dport 22 -j DROP
規則解釋:
! -s 10.0.0.52 #匹配除了52之外全部的IP地址
4.禁止某個IP訪問22和80端口
iptables -I INPUT -s 10.0.0.52 -p tcp -m multiport --dport 22,80 -j DROP
規則解釋:
-m multiport #匹配多個端口
--dport 22,80
5.禁止某個IP訪問22-100之間的全部端口
iptables -I INPUT -s 10.0.0.52 -p tcp --dport 22:100 -j DROP
規則解釋:
--dport 22:100 #匹配22到100之間全部的端口
6.禁止全部主機ping(不包含本身)
iptables -I INPUT -i lo -j ACCEPT
iptables -A INPUT -p icmp --icmp-type 8 -j DROP
等同於
iptables -I INPUT ! -i lo -p ICMP --icmp-type 8 -j DROP
命令解釋:
-i lo #匹配哪一個網卡的流量
7.放行某個IP能夠ping
iptables -A INPUT ! -s 10.0.0.52 -p icmp --icmp-type 8 -j DROP
8.除了某個IP之外,其餘均可以ping
iptables -A INPUT -s 10.0.0.52 -p icmp --icmp-type 8 -j DROP
第6章 企業案例
1.安全策略
黑名單 默認大部分人沒問題
白名單 默認認爲全部人都有問題
2.部署一個安全的防火牆
場景:lb服務器
最小開放哪些端口?對誰開放?
80 :不限制
443 :不限制
22 :只對跳板機開放
10051 :對內
224.0.0.18 :對內
最佳實踐:
按照服務訪問的頻次,頻次最高的服務規則放在上面
443 :不限制
80 :不限制
224.0.0.18 :對內
10051 :對內
22 :只對跳板機開放
操做命令:
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 443,80 -j ACCEPT
iptables -A INPUT -p tcp -s 172.16.1.61 --dport 10051 -j ACCEPT
iptables -A INPUT -p tcp -s 172.16.1.61 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
iptables -A OUTPUT -o eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
iptables -P INPUT DROP
實驗環境:
iptables -F
iptables -X
iptables -Z
iptables -A INPUT -p tcp -m multiport --dport 8080,80 -j ACCEPT
iptables -A INPUT -p tcp -s 172.16.1.53 --dport 9090 -j ACCEPT
iptables -A INPUT -p tcp -s 172.16.1.53 --dport 22 -j ACCEPT
iptables -A INPUT -i eth0 -d 224.0.0.0/8 -p vrrp -j ACCEPT
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
3.局域網共享上網
應用場景:
db02沒有外網IP,只能經過db01才能上網
內網機器的IP包:
源端口 :
目標端口 :443
源IP :172.16.1.52
目標IP :100.1.1.1
網關: 172.16.1.51
改造的IP包:
源端口 :
目標端口 :443
源IP :10.0.0.51
目標IP :100.1.1.1
防火牆配置命令:
echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
sysctl -p
iptables -F
iptables -X
iptables -Z
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.51
內網機器eth1配置:
[root@db02 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
BOOTPROTO=none
DEFROUTE=yes
IPV4_FAILURE_FATAL=no
NAME=eth1
UUID=0f9c0547-954c-4c9c-bf72-43810e653189
DEVICE=eth1
ONBOOT=yes
IPADDR=172.16.1.52
PREFIX=24
GATEWAY=172.16.1.51
DNS1=10.0.0.2
驗證訪問:
ssh 172.16.1.52
ip a
ping www.baidu.com
curl -I www.baidu.com
4.端口映射-來自深圳脫產3期-雷大神&濤哥解決方案
iptables -t nat -A PREROUTING -d 10.0.0.51 -p tcp -m tcp --dport 9000 -j DNAT --to-destination 172.16.1.52:22
iptables -t nat -A POSTROUTING -p tcp -m tcp -d 172.16.1.52 --dport 22 -j SNAT --to-source 172.16.1.51
5.IP映射
ip a add 10.0.0.55/24 dev eth0 label eth0:0
iptables -t nat -A PREROUTING -d 10.0.0.52 -j DNAT --to-destination 172.16.1.51
第7章 保存與恢復
iptables-save 打印出當前生效的配置
iptables-save > 20200319_iptables
iptables-restore < 20200319_iptables
iptables-save > /etc/sysconfig/iptables
第8章 iptables防坑指南
1.若是默認規則爲DROP,而後不當心使用了-F,那麼會致使沒有IP能夠鏈接進入了,物理服務器只能去機房了
2.若是服務是高可用的,而且iptables沒有寫入配置文件,那麼直接重啓服務器便可還原
3.爲了不把本身關在外面,測試防火牆的時候,提早寫一條crontab,內容是定時恢復默認規則
*/5 * * * * iptables -P INPUT ACCEPT
4.或者不修改默認規則,本身在最後添加一條禁止全部的規則,這樣當iptables -F的時候就會清空了,不會把本身關在外面
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited
等價於
iptables -P INPUT DROP
5.測試環境測試好以後,再應用到生產服務器
第9章 ansible管理iptables
name: iptables flush nat
iptables:
table: nat
chain: '{{ item }}'
flush: yes
with_items: [ 'INPUT', 'OUTPUT', 'PREROUTING', 'POSTROUTING' ]
become: yes
name: Insert a rule on line 5
iptables:
chain: INPUT
protocol: tcp
source: 10.0.0.52
destination_port: '22'
ctstate: ESTABLISHED
jump: ACCEPT
action: insert
name: Forward port 80 to 8600
iptables:
table: nat
chain: PREROUTING
in_interface: eth0
protocol: tcp
match: tcp
destination_port: '9000'
jump: DNAT
to_destination: '172.16.1.52:22'
become: yes
name: save
shell: "iptables-save > /etc/sysconfig/iptables"
第x章 iptables命令總結
1.查看防火牆規則
iptables -nL
2.插入規則
iptables -I
iptables -A
3.清除規則
iptables -F
iptables -X
iptables -Z
4.刪除某條規則
iptables -nL --line-numbers
iptables -D INPUT 3
5.修改默認防火牆規則
iptables -P INPUT DROP
6.備份恢復 iptables-save iptables-restore