iptables防火墙

防火墙

3.1 防火墙种类及使用说明

  • 硬件: 整个企业入口
    • 三层路由: H3C 华为 Cisco(思科)
    • 深信服
    • Juniper
  • 软件: 开源软件 网站内部 封ip 封ip
    • iptables 写入到Linux内核中 以后服务docker
    • firewalld C7
  • 云防火墙
    • 阿里云:安全组

3.2 必须熟悉的名词

  • 容器: 瓶子 罐子 存放东西
  • 表(table): 存放的容器
  • 链(chain): 存放规则的容器
  • 规则(policy): 准许或拒绝规则
Netfilter 表(tables) 链(chains) 规则(Policy)
一栋楼 楼里的房子 房子里的柜子 柜子里衣服,摆放规则

3.3 iptables 执行过程※※※※※

image
image
image
image
image

3.4 表与链※※※※※

3.4.1 简介

  • iptables 是 4表5链
  • 4表: filter 表 nat表 raw表 mangle表
  • 5链: INPUT OUTPUT FORWARD PREROUTING POSTROUTING

3.4.2 每个表说明

1) filter表

  • 防火墙: 屏蔽或准许 端口 ip
filter表 强调:主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包) filter表示iptables默认使用的表,这个表定义了三个链(chains) 企业工作场景:主机防火墙
INPUT 负责过滤所有目标地址是本机地址的数据包 通俗来说:就是过滤进入主机的数据包
FORWARD 负责转发流经主机的数据包。起转发的作用,和NAT关系很大,后面会详细介绍 LVS NAT模式,net.ipv4.ip_forward=0
OUTPUT 处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包

2) nat表

  • 实现nat功能
    • 实现共享上网(内网服务器上外网)
    • 端口映射和ip映射
nat 负责网络地址转换的,即来源与目的IP地址和port的转换。 应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务相关。 工作场景: 1. 用于企业路由(zebra)或网关(iptables),共享上网POSTROUTING) 2. 做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(PREROUTING) 3. WEB,单个端口的映射,直接映射80端口(PREROUTING) 这个表定义了3个链,nat功能相当于网络的acl控制。和网络交换机acl类似。
OUTPUT 和主机放出去的数据包有关,改变主机发出数据包的目的地址。
PREROUTING 在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等
就是收信时,根据规则重写收件人的地址。
例如:把公网IP:xxx.xxx.xxx.xxx映射到局域网的xx.xx.xx.xx服务器上。
如果是web服务,可以报80转换为局域网的服务器9000端口上
10.0.0.61 8080(目标端口) ----nat---à 10.0.0.7 22
POSTROUTING 在数据包离开防火墙时进行路由判断之后执行的规则,作用改变数据包的源地址,源端口等。
写好发件人的地址,要让家人回信时能够有地址可回。
例如。默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址。
生产应用:局域网共享上网

3.5环境准备及命令

iptables启动或关闭的命令

m01 	10.0.0.61  	172.16.1.61
web01  	10.0.0.7 	172.16.1.7
1.停止firewalld服务
[root@m01 ~]# systemctl stop firewalld 
[root@m01 ~]# systemctl disable   firewalld

2.查看内核版本
[root@oldboy-m01 ~]# uname -r 
3.10.0-862.el7.x86_64

3.安装iptables服务
[root@oldboy-m01 ~]# yum install -y  iptables-services 

4.查看iptables的配置文件
[root@m01 ~]# rpm -ql   iptables-services 
/etc/sysconfig/ip6tables
/etc/sysconfig/iptables                          #防火墙的配置文件    
/usr/lib/systemd/system/ip6tables.service 
/usr/lib/systemd/system/iptables.service         #防火墙服务配置文件(命令)

5.将防火墙相关模块 加载到内核中
#临时
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state	
#永久 
cat >>/etc/rc.local<<EOF
modprobe ip_tables
modprobe iptable_filter
modprobe iptable_nat
modprobe ip_conntrack
modprobe ip_conntrack_ftp
modprobe ip_nat_ftp
modprobe ipt_state	
EOF

6.显示内核模块信息,验证是否添加成功
[root@m01 ~]# lsmod |egrep 'filter|nat|ipt'
nf_nat_ftp             12770  0 
nf_conntrack_ftp       18638  1 nf_nat_ftp
iptable_nat            12875  0 
nf_nat_ipv4            14115  1 iptable_nat
nf_nat                 26787  2 nf_nat_ftp,nf_nat_ipv4
nf_conntrack          133053  6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
iptable_filter         12810  0 
ip_tables              27126  2 iptable_filter,iptable_nat
libcrc32c              12644  3 xfs,nf_nat,nf_conntrack

7.启动iptables服务
[root@m01 ~]# systemctl start iptables.service 
[root@m01 ~]# systemctl enable iptables.service 
Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.

8.查看当前iptables的默认规则
[root@m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            state NEW tcp dpt:22
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         
REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination     

image-20200212105352301

3.5.2 iptables命令参数

参数 含义
-L 显示表中的所有规则
-n 不要把端口 或ip反向解析为 名字
-t 指定表 不指定默认是filter表
-A append 追加 加入准许类规则 使用-A
-D delete 删除 -D INPUT 1
-I insert 拒绝类规则放在所有规则最上面 拒绝类 -I
line-numbers 显示行号
参数 含义
-p 协议 protocal tcp/udp/icmp/all
--dport 目标端口 dest destination 指定端口 加上协议 -p tcp
--sport 源端口 source 源
-s --source 源ip
-d --destination 目标ip
-m 指定模块 multiport
-i input 输入的时候 从哪个网卡进来
-o ouput 输出的时候 从哪个网卡出去
参数 含义
-j 满足条件后的动作 : DROP/ACCEPT/REJECT
DROP REJECT拒绝
DROP把数据丢掉 不会返回信息给用户
REJECT 拒绝 返回拒绝信息
DNAT 目标地址转换
参数 含义
-F flush 清除所有规则,不会处理默认的规则
-X 删除用户自定义的链
-Z 链的计数器清零(数据包计数器与数据包字节计数器)

3.6 配置filter表规则※※※※※

  • 正式配置之前 先备份, 清空规则
[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      

3.6.1 禁止访问22端口

iptables -t filter -I INPUT -p tcp   --dport 22  -j DROP
#        指定表     指定链    指定协议   指定端口      指定操作

删除 规则 -D

image

删除规则
查看序号
[root@m01 ~]# iptables -nL --line
Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination         
1    DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80

根据序号删除规则
[root@m01 ~]# iptables -D INPUT 1
第二种删除方式:
添加
[root@m01 ~]# iptables -t filter -I INPUT -p tcp --dport 80 -j DROP
删除
[root@m01 ~]# iptables -t filter -D INPUT -p tcp --dport 80 -j DROP

3.6.2 封ip 屏蔽某个ip

[root@oldboy-m01 ~]# iptables -I INPUT  -s 10.0.0.7   -j DROP 
[root@oldboy-m01 ~]# iptables -I INPUT  -s 172.16.1.7   -j DROP 
[root@oldboy-m01 ~]# 
[root@oldboy-m01 ~]# iptables -nL   
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       all  --  172.16.1.7           0.0.0.0/0           
DROP       all  --  10.0.0.7             0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination       

3.6.3 禁止网段连入(禁止10.0.0.0/24网段访问 8888端口)

nc ncat netcat

nc -l

-l 使用监听模式,管控传入的资料

-v 显示指令执行过程。

-k 接受多个连接请求

telnet

iptables -I INPUT  -s 10.0.0.0/24  -p tcp  --dport 8888  -j DROP 
[root@web01 ~]# ssh 10.0.0.61 hostname 
^C
[root@web01 ~]# ssh 172.16.1.61 hostname 
root@172.16.1.61's password: 
m01

image

3.6.4 只允许指定网段连入(允许10.0.0.0网段)

实现阿里云白名单功能 :默认是拒绝 开放端口 网段

allow 10.0.0.0/24;

deny all;

#方法1: 利用 !  进行排除 
#只准许 10.0.0.0/24 访问  言外之意   除了 10.0.0.0/24  都拒绝 
iptables -I INPUT ! -s 10.0.0.0/24  -j DROP

image

#方法2:  修改链默认规则  修改为拒绝  添加准许
先配置好规则 准许规则
修改默认规则
[root@oldboy-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@oldboy-m01 ~]# iptables -A  INPUT   -s 10.0.0.0/24   -j  ACCEPT 
[root@oldboy-m01 ~]# iptables -nL
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@oldboy-m01 ~]# iptables -P INPUT DROP 
[root@oldboy-m01 ~]# iptables -nL
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  10.0.0.0/24          0.0.0.0/0           

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

#测试完成后 修改回去 

iptables  -P  INPUT  ACCEPT

image

3.6.4 指定多个端口

[root@oldboy-m01 ~]# iptables -I  INPUT  -p tcp --dport 8888   -j DROP 
[root@oldboy-m01 ~]# iptables -I  INPUT  -p tcp --dport 9999   -j DROP 
[root@oldboy-m01 ~]# iptables -nL 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:9999
DROP       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8888

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination  


#补充:
#
[root@m01 ~]# iptables -I INPUT  -p tcp -m multiport ! --dport 80,443  -j DROP
#如果是 连续的端口  可以不加上-m multiport   1:1024 
[root@m01 ~]# iptables -I INPUT  -p tcp  --dport 1024:65535  -j DROP 

3.6.5 匹配ICMP类型(禁ping)

  • ICMP(Internet Control Message Protocol)Internet控制报文协议 ping
  • 整个网站核心

通过防火墙规则 控制是否可以ping

[root@m01 ~]# iptables -I INPUT  -p icmp --icmp-type 8  -j DROP 
[root@m01 ~]# iptables -nL 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       icmp --  0.0.0.0/0            0.0.0.0/0            icmptype 8

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination        

通过内核参数 控制 禁止被ping

[root@m01 ~]# cat  /etc/sysctl.conf 
#/proc/sys/net/ipv4/icmp_echo_ignore_all

net.ipv4.icmp_echo_ignore_all = 1
[root@m01 ~]# sysctl -p 
net.ipv4.icmp_echo_ignore_all = 1

[root@oldboy-m01 ~]# echo  1  >/proc/sys/net/ipv4/icmp_echo_ignore_all 
[root@oldboy-m01 ~]# #net.ipv4.icmp_echo_ignore_all=1 写入到 /etc/sysctl.conf
[root@oldboy-m01 ~]# #sysctl -p 
[root@oldboy-m01 ~]# echo  0 >/proc/sys/net/ipv4/icmp_echo_ignore_all 

3.6.6 匹配网络状态(TCP/IP连接状态)

-m state --state

NEW:已经或将启动新的连接

ESTABLISHED:已建立的连接

RELATED:正在启动的新连接

INVALID:非法或无法识别的

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

3.6.7 限制并发及速率

-m limit 限制模块

-m limit --limit 10/minute     #每分钟只能有10个数据包 每6秒生成

-m limit --limit n/{second/minute/hour}:

解释:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时

-m limit --limit 10/minute   --limit-burst 5  每6秒释放工牌 给别人使用 

#10个数据包   
前5个  1个1个工牌   从第6个开始 每6秒 才能释放1个工牌 

--limit-burst [n]

解释:在同一时间内允许通过的请求”n”为数字,不指定默认为5

  • 测试 演示
#ping  icmp 协议  进行测试
iptables -F 
iptables -I INPUT  -p icmp  -m limit --limit 10/minute    --limit-burst 5   -j ACCEPT 
iptables -A INPUT  -p tcp  --dport 22 -j  ACCEPT 
iptables -P INPUT DROP 

image

  • web01 进行ping测试
ping  10.0.0.61 

[root@web01 ~]# 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.240 ms
64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.376 ms
64 bytes from 10.0.0.61: icmp_seq=3 ttl=64 time=0.474 ms
64 bytes from 10.0.0.61: icmp_seq=4 ttl=64 time=0.693 ms
64 bytes from 10.0.0.61: icmp_seq=5 ttl=64 time=2.43 ms
64 bytes from 10.0.0.61: icmp_seq=7 ttl=64 time=0.351 ms    #7与1比 就是间隔6秒
64 bytes from 10.0.0.61: icmp_seq=13 ttl=64 time=0.869 ms   #7 13  间隔6秒  
64 bytes from 10.0.0.61: icmp_seq=19 ttl=64 time=0.482 ms
64 bytes from 10.0.0.61: icmp_seq=25 ttl=64 time=0.378 ms
64 bytes from 10.0.0.61: icmp_seq=31 ttl=64 time=0.329 ms
64 bytes from 10.0.0.61: icmp_seq=37 ttl=64 time=0.857 ms
64 bytes from 10.0.0.61: icmp_seq=43 ttl=64 time=0.314 ms
64 bytes from 10.0.0.61: icmp_seq=49 ttl=64 time=0.360 ms
64 bytes from 10.0.0.61: icmp_seq=55 ttl=64 time=0.349 ms
64 bytes from 10.0.0.61: icmp_seq=61 ttl=64 time=0.552 ms
64 bytes from 10.0.0.61: icmp_seq=67 ttl=64 time=0.283 ms
64 bytes from 10.0.0.61: icmp_seq=73 ttl=64 time=0.407 ms
64 bytes from 10.0.0.61: icmp_seq=79 ttl=64 time=0.297 ms
64 bytes from 10.0.0.61: icmp_seq=85 ttl=64 time=0.428 ms
64 bytes from 10.0.0.61: icmp_seq=91 ttl=64 time=0.390 ms
64 bytes from 10.0.0.61: icmp_seq=97 ttl=64 time=0.691 ms
64 bytes from 10.0.0.61: icmp_seq=103 ttl=64 time=0.537 ms
64 bytes from 10.0.0.61: icmp_seq=109 ttl=64 time=0.546 ms
64 bytes from 10.0.0.61: icmp_seq=115 ttl=64 time=0.382 ms
64 bytes from 10.0.0.61: icmp_seq=121 ttl=64 time=0.337 ms




3.6.8 防火墙规则的保存与恢复

  • iptables-save 默认输出到屏幕
  • iptables-restore 加上文件
  • 写入到/etc/sysconfig/iptables
[root@oldboy-m01 ~]# iptables-save   >/etc/sysconfig/iptables
[root@oldboy-m01 ~]# cat /etc/sysconfig/iptables
# Generated by iptables-save v1.4.21 on Wed Feb 12 15:31:43 2020
*filter
:INPUT DROP [92:7008]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [127:14360]
-A INPUT -p icmp -m limit --limit 10/min -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT
COMMIT
# Completed on Wed Feb 12 15:31:43 2020
# Generated by iptables-save v1.4.21 on Wed Feb 12 15:31:43 2020
*nat
:PREROUTING ACCEPT [559:51047]
:INPUT ACCEPT [60:6814]
:OUTPUT ACCEPT [6801:408868]
:POSTROUTING ACCEPT [6801:408868]
COMMIT
# Completed on Wed Feb 12 15:31:43 2020
[root@oldboy-m01 ~]# iptables -nL 
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/min burst 5
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@oldboy-m01 ~]# iptables -D 1 
iptables: Bad rule (does a matching rule exist in that chain?).
[root@oldboy-m01 ~]# 
[root@oldboy-m01 ~]# iptables -D INPUT 1 
[root@oldboy-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     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         
[root@oldboy-m01 ~]# iptables-restore  </etc/sysconfig/iptables 
[root@oldboy-m01 ~]# iptables -nL 
Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     icmp --  0.0.0.0/0            0.0.0.0/0            limit: avg 10/min burst 5
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 80,443

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination    

补充:
systemctl  restart  iptables    #读取 /etc/sysconfig/iptables内容



3.6.9 filter表小结

  • 封ip 端口 网段
  • 禁止ping
  • 限制速度和并发
  • iptables filter表 功能 可以在 云服务器使用

3.7 实际生产用法

  • iptables配置方式

    • 逛公园模式: 默认规则是 ACCEPT
    • 看电影模式: 默认规则是 DROP
  • 默认是拒绝 去电影院

  1. ssh可以连接进来
[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 ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT  
[root@m01 ~]# iptables -nL 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination      
    1. 设置允许本机lo****通讯规则

    # 允许本机回环lo接口数据流量流出与流入

    iptables -A INPUT -i lo -j ACCEPT
    iptables -A OUTPUT -o lo -j ACCEPT
    
  1. 配置默认规则及 放行 80 443端口

     
[root@m01 ~]# iptables -P INPUT DROP 
[root@m01 ~]# iptables -P FORWARD DROP 
[root@m01 ~]# iptables -P OUTPUT ACCEPT 

[root@m01 ~]# iptables -A INPUT  -m multiport -p tcp  --dport 443,80   -j 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     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 443,80

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           
[root@m01 ~]# iptables -A INPUT  -s 10.0.0.0/24  -j ACCEPT 
[root@m01 ~]# iptables -A INPUT  -s 172.16.1.0/24  -j ACCEPT 
#此处还可以添加 vpn网段 比如说 10.7.1.0/24

[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     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 443,80
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           
[root@m01 ~]# iptables-save 
# Generated by iptables-save v1.4.21 on Wed Jul 24 23:42:00 2019
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [24:3008]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 443,80 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -s 172.16.1.0/24 -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
COMMIT
# Completed on Wed Jul 24 23:42:00 2019
  • 汇总
[root@oldboy-m01 ~]# iptables-save  
# Generated by iptables-save v1.4.21 on Wed Feb 12 15:51:48 2020
*filter
:INPUT DROP [0:0]
:FORWARD DROP [0:0]
:OUTPUT ACCEPT [1:60]
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -s zabbix服务端IP -m tcp --dport 10050 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m multiport --dports 443,80 -j ACCEPT
-A INPUT -s 10.0.0.0/24 -j ACCEPT
-A INPUT -s 172.16.1.0/24 -j ACCEPT
-A INPUT -s 10.7.1.0/24 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A OUTPUT -o lo -j ACCEPT
-A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
COMMIT
# Completed on Wed Feb 12 15:51:48 2020
# Generated by iptables-save v1.4.21 on Wed Feb 12 15:51:48 2020
*nat
:PREROUTING ACCEPT [2:458]
:INPUT ACCEPT [0:0]
:OUTPUT ACCEPT [417:25020]
:POSTROUTING ACCEPT [417:25020]
COMMIT
# Completed on Wed Feb 12 15:51:48 2020

3.8 nat

  • 共享上网
  • 端口转发/端口映射
  • ip映射
[root@m01 ~]# iptables -P INPUT ACCEPT
[root@m01 ~]# iptables -P FORWARD ACCEPT 
[root@m01 ~]# iptables -nL 
Chain INPUT (policy ACCEPT)
target     prot opt source               destination         
DROP       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:22
ACCEPT     all  --  0.0.0.0/0            0.0.0.0/0           
ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            multiport dports 443,80
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 ACCEPT)
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           
[root@m01 ~]# iptables -F
[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  

3.8.1 实现共享上网※※※※※

image

1. 防火墙配置(有公网IP的那台)

[root@m01 ~]# iptables -t nat -A POSTROUTING  -s 172.16.1.0/24   -j SNAT  --to-source 10.0.0.61 
[root@m01 ~]# echo 'net.ipv4.ip_forward = 1'  >> /etc/sysctl.conf 
[root@m01 ~]# sysctl -p
net.ipv4.icmp_echo_ignore_all = 0
net.ipv4.ip_forward = 1

注意事项:
公网ip不固定:
iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE

2. web配置

[root@web01 ~]# cat  /etc/sysconfig/network-scripts/ifcfg-eth0
TYPE=Ethernet
BOOTPROTO=none
NAME=eth0
DEVICE=eth0
ONBOOT=no				#配置不开机启用
IPADDR=10.0.0.7
PREFIX=24
GATEWAY=10.0.0.254
DNS1=223.5.5.5

[root@web01 ~]# cat  /etc/sysconfig/network-scripts/ifcfg-eth1
TYPE=Ethernet
IPADDR=172.16.1.7
PREFIX=24
NAME=eth1
DEVICE=eth1
ONBOOT=yes
GATEWAY=172.16.1.61		#网关配置为有公网的那台的第二块网卡的ip
DNS1=223.5.5.5
[root@web01 ~]# systemctl restart network 
[root@m01 ~]# ssh 172.16.1.7 
Last login: Wed Jul 24 23:06:58 2019 from 10.0.0.1
[root@web01 ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host 
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
    link/ether 00:0c:29:b2:e3:7e brd ff:ff:ff:ff:ff:ff
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:b2:e3:88 brd ff:ff:ff:ff:ff:ff
    inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:feb2:e388/64 scope link 
       valid_lft forever preferred_lft forever
[root@web01 ~]# 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=8.90 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=2 ttl=127 time=7.52 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=3 ttl=127 time=9.28 ms
64 bytes from 220.181.38.148 (220.181.38.148): icmp_seq=4 ttl=127 time=9.36 ms
^C
--- baidu.com ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3006ms
rtt min/avg/max/mdev = 7.528/8.769/9.364/0.746 ms
[root@web01 ~]# ping 1.2.4.8
PING 1.2.4.8 (1.2.4.8) 56(84) bytes of data.
64 bytes from 1.2.4.8: icmp_seq=1 ttl=127 time=76.4 ms
64 bytes from 1.2.4.8: icmp_seq=2 ttl=127 time=76.8 ms
^C
--- 1.2.4.8 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 76.440/76.637/76.834/0.197 ms

3. 完成后 在web01 发出 ip r和ping 外网ip的结果

[root@web01 ~]# ip r 
default via 172.16.1.61 dev eth1 
169.254.0.0/16 dev eth1 scope link metric 1003 
172.16.1.0/24 dev eth1 proto kernel scope link src 172.16.1.7 
[root@web01 ~]# route -n 
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.1.61     0.0.0.0         UG    0      0        0 eth1
169.254.0.0     0.0.0.0         255.255.0.0     U     1003   0        0 eth1
172.16.1.0      0.0.0.0         255.255.255.0   U     0      0        0 eth1
[root@web01 ~]# ping baidu.com 
PING baidu.com (39.156.69.79) 56(84) bytes of data.
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=1 ttl=127 time=21.7 ms
64 bytes from 39.156.69.79 (39.156.69.79): icmp_seq=2 ttl=127 time=32.6 ms
^C
--- baidu.com ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1002ms
rtt min/avg/max/mdev = 21.781/27.214/32.647/5.433 ms 

3.8.2 实现端口转发※※※※※

image

image

[root@m01 ~]# iptables -t nat -A PREROUTING    -d 10.0.0.61 -p tcp --dport 9000  -j DNAT --to-destination 172.16.1.7: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:9000 to:172.16.1.7: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  --  172.16.1.0/24        0.0.0.0/0            to:10.0.0.61

测试与检查

本地shell中

[d:\~]$ ssh root@10.0.0.61 9000

3.8.3 实现ip映射

 ip a add   10.0.0.62/24 dev eth0  label eth0:0

[root@m01 ~]# iptables -t nat -A PREROUTING  -d 10.0.0.62  -j DNAT  --to-destination 172.16.1.7 
[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:9000 to:172.16.1.7:22
DNAT       all  --  0.0.0.0/0            10.0.0.62            to:172.16.1.7

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

3.8.4 nat表总结

  • 实现共享上网
  • 端口转发
  • nat功能在 云服务器无法使用 替代品叫: NAT网关
posted @ 2025-05-21 13:15  丁志岩  阅读(64)  评论(0)    收藏  举报