14 iptables基礎知識

1. iptables介紹

1.1 iptables是什麼

iptables是開源的基於數據包過濾的防火牆工具。web

1.2 iptables企業應用場景

  1. 主機防火牆(filter表的INPUT鏈)
  2. 局域網共享上網(nat表的POSTROUTING鏈)。半個路由器,NAT功能。
  3. 端口及IP映射(nat表的PREROUTING鏈),硬防的NAT功能。
  4. IP一對一映射。

1.3 商用防火牆品牌

- Juniper    思科     華爲     H3C  中興   奇安信
- 天融信     深信服   綠盟科技  啓明星辰  網康  飛塔   金盾

2. iptables工做流程

  1. 防火牆規則從上往下依次匹配
  2. 防火牆規則只要匹配上,就再也不往下進行
  3. 若是都沒匹配上,最後匹配默認規則
  4. 默認規則默認是放行全部

3. iptables四表五鏈

3.1 表與鏈的關係

Filter表 :過濾數據包,放行或拒絕,不會對數據包進行修改shell

  • INPUT
  • FORWARD
  • OUTPUT

NAT表:改寫數據包windows

  • PREROUTING 改寫的是目標端口目標IP
  • OUTPUT
  • POSTROUTING 改寫的是源IP和源端口

本質就是不一樣的表和鏈處於不一樣的位置安全

3.2 數據包格式

  • 源IP
  • 源端口
  • 目標IP
  • 目標端口

4. iptables環境準備

4.1 安裝iptables管理工具

yum install iptables-services -y服務器

4.2 加載防火牆模塊

modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state

4.3 查看已經加載的模塊

lsmod |egrep 'filter|nat|ipt'

4.4 啓動防火牆

# 首先中止firewalld
systemctl stop firewalld
systemctl disable firewalld

# 開啓iptables
systemctl start iptables.service
systemctl enable iptables.service

5. iptables實戰

5.1 禁止200機器訪問本機的22端口

源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

  • -I 在防火牆的第一條上添加規則
  • -P tcp 指定協議是tcp
  • -s 匹配源IP
  • --dport 匹配目標端口
  • -j DROP 執行的操做 DROP(拒絕) ACCEPT(接收)

[驗證]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工具

5.2 徹底禁止某個IP訪問

源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協議

5.3 禁止除了某個IP之外的地址訪問某個端口(只容許某個IP訪問某個端口)

源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端口     能夠訪問

5.4 禁止200這個IP訪問22和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端口   訪問不了

5.5 禁止全部主機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

5.6 放行某個IP能夠ping

iptables -A INPUT ! -s 10.0.0.200 -p icmp --icmp-type 8 -j DROP

5.7 除了10.0.0.200之外,其餘均可以ping

iptables -A INPUT -s 10.0.0.200 -p icmp --icmp-type 8 -j DROP

6. 企業案例

6.1 安全策略

  • 黑名單 ------> 默認大部分人沒問題
  • 白名單 ------> 默認認爲全部人都有問題

6.2 部署一個安全的防火牆

場景:服務器
最小開放哪些端口?對誰開放?
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     能夠訪問

7. 防坑指南

  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. 測試環境測試好以後,再應用到生產服務器

8. 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_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

  • hosts: web
    tasks:
    • 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

相關文章
相關標籤/搜索