iptables

第一章:防火墙介绍

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 ~]# 

配置防火墙规则注意事项:
  1. 去机房重启系统或者登陆服务器删除刚才的禁止规则。

  2. 让机房人员重启服务器或者让机房人员拿用户密码登录进去

  3. 通过服务器的远程管理卡管理(推荐)

  4. 先写一个定时任务,每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,可以连接
[email protected]'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

你可能感兴趣的:(iptables)