iptables命令详解与实验他来了(配置SNAT,SNATD)步骤较多仔细品

一:iptables安装

1.1:关闭firewalld防火墙

[root@localhost ~]# systemctl stop firewalld.service
//centos 7默认使用firewalld防火墙,要是使用iptables必须先关闭firewalld防火墙
[root@localhost ~]# systemctl disable firewalld.servic:e

1.2:安装iptables防火墙

[root@localhost ~]# yum y install iptables iptables-services

1.3:设置iptables开机启动

[root@localhost ~]# systemctl start iptables.service
[root@localhost ~]# systemctl enable iptables.service

1.4:iptables语法格式与常用参数

  • iptables语法格式
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
如果不指定表名,则会默认指定filter表

[root@localhost ~]# iptables -t filter -l INPUT -p icmp -j REJECT
-p :协议     阻止ping测试
REJECT:拒绝  或者用DROP
filter:默认表 -t可以不写  其他三个表就要写

注意事项

不指定表名时,默认指filter表

不指定链名时,默认指表内的所有链

除非设置链的默认策略,否则必须指定匹配条件
选项、链名、控制类型使用大写字母,其余均为小写

  • iptables命令使用总结
所有链名必须大写
INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING
所有表名必须小写
filter/nat/mangle
所有动作必须大写
ACCEPT/DROP/SNAT/DNAT/MASQUERADE
所有匹配必须小写
-s/-d/-m <module_name>/-p

1.5:防火墙开启禁止ICMP 阻止ping

//两台主机 IP分别为20.0.0.41 另一台20.0.0.42
通过第一台设备ping第二台
[root@localhost ~]# ping 20.0.0.42
PING 20.0.0.42 (20.0.0.42) 56(84) bytes of data.
64 bytes from 20.0.0.42: icmp_seq=1 ttl=64 time=0.416 ms
64 bytes from 20.0.0.42: icmp_seq=2 ttl=64 time=0.233 ms
64 bytes from 20.0.0.42: icmp_seq=3 ttl=64 time=0.187 ms
//是可以ping通的
[root@localhost ~]# iptables -L -t filter   第二台查看filter信息
[root@localhost ~]# iptables -t filter -F    //清空filter表
[root@localhost ~]# iptables -t filter -I INPUT -p icmp -j REJECT
//切换20.0.0.41进行ping测试
[root@localhost ~]# ping 20.0.0.42
PING 20.0.0.42 (20.0.0.42) 56(84) bytes of data.
From 20.0.0.42 icmp_seq=1 Destination Port Unreachable
From 20.0.0.42 icmp_seq=2 Destination Port Unreachable
From 20.0.0.42 icmp_seq=3 Destination Port Unreachable
//测试成功  已经ping不通了

1.6:数据包的常见控制类型

ACCECT:允许通过

DROP:直接丢弃

REJECT:拒绝通过,必要时会给出提示

LOG:记录日志信息,然后传给下一条规则继续匹配

二:iptables的管理选项

2.1:添加新的规则

  • -A:在链的末尾追加一条规则

  • -l:在链的开头(或指定序号)插入一条规则

[root@localhost ~]# iptables -t filter -A INPUT -p tcp -j ACCEPT
[root@localhost ~]# iptables -I INPUT -p udp -j ACCEPT
[root@localhost ~]# iptables -I INPUT 2 -p icmp -j ACCEPT

2.2:查看规则列表

L:列出所有的规则条目
-n: 以数字形式显示地址、端口等信息
-V: 以更详细的方式显示规则信息
-line-numbers:查看规则时,显示规则的序号

2.3:查看规则列表

[root@localhost ~]# iptables -L INPUT --line-numbers
[root@localhost ~]# iptables -n -L INPUT //-n -L可合写 

2.4:删除、清空规则

  • -D: 删除链内指定序号 (或内容)的一条规则

  • -F:清空所有的规则

[root@localhost ~]# iptables -D INPUT 3
[root@localhost ~]# iptables -n -L INPUT
[root@localhost ~]# iptables F    //默认是情况filter
[root@localhost ~]# iptables - nat F
[root@localhost ~]# iptables - mangle F
[root@localhost ~]# iptables -t raw F

2.5:设置默认策略

-P:为指定的链设置默认规则

[root@localhost ~]# iptables -t filter P FORWARD DROP
[root@localhost ~]# iptables P OUTPUT ACCEPT
//清空所有默认策略要么是ACCEPT 要么是DROP表的所有链

2.6:常用管理选项汇总

类别 选项 用途
添加新的规则 -A 在链的末尾追加一条规则
-l 在链的开头(或指定序号)插入一条规则
查看规则列表 -L 列出所有的规则条目
-n 以数字形式显示地址、端口等信息
-v 以更详细的方式、显示规则的序号
–line-numbers 查看规则时,显示规则的序号
删除、清空规则 -D 删除链内指定序号(或内容)的一条规则
-F 清空所有规则
设置默认策略 -P 为指定的链设置默认规则

三:规则的匹配条件

3.1:通用匹配

●可直接使用,不依赖于其他条件或扩展
●包括网络协议、IP地址、网络接口等条件

3.2:隐含匹配

●要求以特定的协议匹配作为前提
●包括端口、TCP标记、ICMP类型等条件

3.3:显式匹配

●要求以:-m扩展模块”的形式明确指出类型
●包括多端口、MAC地址、IP范围、 数据包状态等条件

3.4:常见的通用匹配条件

●协议匹配: -p 协议名
●地址匹配: -s 源地址、-d目的地址
●接口匹配: -i 入站网卡、-o 出站网卡

//在INPUT链中拒绝icmp协议
[root@localhost ~]# iptables -I INPUT -p icmp -j DROP
//除了icmp协议外其他协议都通过允许   !:表示取反
[root@localhost ~]# iptables -A FORWARD ! -p icmp j ACCEPT
//入口为ens33源地址192.168.0.0网段全部做拒绝  ens33:外网接口
[root@localhost ~]# iptables -A INPUT -i ens33 -S 192.168.0.0/16 j DROP
//
[root@localhost ~]# iptables -A INPUT -i ens33 -S 10.0.0.0/8 -j DROP
[root@localhost ~]# iptables -A INPUT -i ens33 -S 172.16.0.0/12 j DROP

3.5:常用的隐含匹配条件

  • 端口匹配: --sport源端口、 --dport目的端口

  • ICMP类型匹配: --imcp-typeICMP类型

//在转发链中源地址为4.0段协议为upd 53端口可以放行通过 【dns】
[root@localhost ~]# iptables A FORWARD -s 192.168.4.0/24 -P udp -dport 53 j ACCEPT
//20:21表示多端口 
[root@localhost ~]# iptables -A INPUT -P tcp --dport 20:21 ACCEPT

TFTP端口号:69 UDP协议

FTP端口号:TCP 的20 21 速度快的是UDP协议 用于链接的是TCP

[root@localhost ~]# iptables -A INPUT -P icmp --icmp-type 8 -j DROP
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 0 j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp --icmp-type 3 j ACCEPT
[root@localhost ~]# iptables -A INPUT -p icmp -j DROP
//8请求 0回显 3不可达

3.6:常用的显示匹配条件

●多端口匹配: -m multiport --sports源端口列表
-m multiport --dports目的端口列表
●IP范围匹配: -m iprange --sr-range IP范围
●MAC地址匹配: -m mac --mac-source MAC地址
●状态匹配: -m state --state连接状态

//在INPUT链中tcp协议目标端口25,80,110,143允许
[root@localhost ~]# iptables -A INPUT -P tcp -m multiport --dport 25,80,110,143 j
ACCEPT
//在转发链中TCP的地址段源地址的范围
[root@localhost ~]# iptables -A FORWARD -P tcp -m iprange -rC-range 192.168.4.21-
192.168.4.28 j ACCEPT
//在INPUT链中MAC地址为..做拒绝
[root@localhost ~]# iptables -A INPUT -m mac --mac-source 00:0c:29:c0:55:3f j DROP

3.7:常用管理选项汇总

类别 条件类型 用法
通用匹配 协议匹配 -P协议名
地址匹配 -s源地址、-d目的地址
接口匹配 -i入站网卡、-o出站网卡
隐含匹配 端口匹配 –sport源端口、–dport目的端口
ICMP类型匹配 –icmp-type ICMP类型
多端口匹配 -m multiport --soprts | --dpoets 端口列表
显式匹配 IP范围匹配 -m iprange --src-range IP范围
MAC地址匹配 -m mac --mac-source MAC地址
状态匹配 -m state --state 链接状态

前提条件

  • 局域网各主机正确设置IP地址/子网掩码

  • 局域网各主机正确设置默认网关地址

  • Llinx网关支持IP路由转发

四:实验

mark

实验环境

准备三台 centos 7

shuai01作为内网客户机IP:192.168.138.10

shuai02作为中间防火墙双网卡IP:192.168.138.1

​ IP:12.0.0.1

shuai03作为外网服务器IP:12.0.0.12

4.1:给防火墙添加一块网卡,两块网卡改为VMnet 1

mark4.2:查看网卡

[root@shuai02 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 20.0.0.88  netmask 255.255.255.0  broadcast 20.0.0.255
        inet6 fe80::20c:29ff:febd:4f59  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:bd:4f:59  txqueuelen 1000  (Ethernet)
        RX packets 14389  bytes 7580304 (7.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3040  bytes 286617 (279.8 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        ether 00:0c:29:bd:4f:63  txqueuelen 1000  (Ethernet)
        RX packets 39  bytes 2436 (2.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 59  bytes 9746 (9.5 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

4.3:配置IP地址

mark

//复制一份网卡改为ens36    -p:保持原有属性
[root@shuai02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
//编辑ens36网卡
[root@shuai02 network-scripts]# vim ifcfg-ens36

mark

//重启网卡
[root@shuai02 network-scripts]# service network restart
Restarting network (via systemctl):                        [  确定  ]
[root@shuai02 network-scripts]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.138.1  netmask 255.255.255.0  broadcast 192.168.138.255
        inet6 fe80::8920:f7fe:5a7b:1356  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:bd:4f:59  txqueuelen 1000  (Ethernet)
        RX packets 14451  bytes 7597582 (7.2 MiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 3099  bytes 292919 (286.0 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

ens36: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 12.0.0.1  netmask 255.255.255.0  broadcast 12.0.0.255
        inet6 fe80::8076:14d2:adce:b054  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:bd:4f:63  txqueuelen 1000  (Ethernet)
        RX packets 90  bytes 7924 (7.7 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 202  bytes 33519 (32.7 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
//已经修改好了   36网卡作外网段  33作为内网段
[root@shuai02 network-scripts]# vim /etc/sysctl.conf
//允许对方能够访问就要开启数据转发

mark

4.4:设置防火墙规则

[root@shuai02 network-scripts]# sysctl -p        //加载参数
net.ipv4.ip_forward = 1
[root@shuai02 network-scripts]# iptables -F      //清空防火墙
[root@shuai02 network-scripts]# iptables -t nat -F       //自行添加规则       
[root@shuai02 network-scripts]# iptables -L       //查看条目是否清空

4.5:内网客户机设置

mark

4.6:设置网卡

[root@shuai01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33

mark

 //重启网卡
[root@shuai01 ~]# service network restart
Restarting network (via systemctl):                        [  确定  ]
[root@shuai01 ~]# ifconfig
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.138.10  netmask 255.255.255.0  broadcast 192.168.138.255
        inet6 fe80::fce1:77f:7a9:b103  prefixlen 64  scopeid 0x20<link>
        ether 00:0c:29:84:c1:e3  txqueuelen 1000  (Ethernet)
        RX packets 8981  bytes 934213 (912.3 KiB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 4428  bytes 448953 (438.4 KiB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
//ping一下网关查看连接性
[root@shuai01 ~]# ping 192.168.138.1
PING 192.168.138.1 (192.168.138.1) 56(84) bytes of data.
64 bytes from 192.168.138.1: icmp_seq=1 ttl=128 time=0.212 ms
64 bytes from 192.168.138.1: icmp_seq=2 ttl=128 time=0.298 ms
64 bytes from 192.168.138.1: icmp_seq=3 ttl=128 time=0.264 ms
....省略
//ping外网网关
[root@shuai01 ~]# ping 12.0.0.1
PING 12.0.0.1 (12.0.0.1) 56(84) bytes of data.
64 bytes from 12.0.0.1: icmp_seq=1 ttl=64 time=0.918 ms
64 bytes from 12.0.0.1: icmp_seq=2 ttl=64 time=0.505 ms
64 bytes from 12.0.0.1: icmp_seq=3 ttl=64 time=1.41 ms
....省略

4.7:配置外部服务器

[root@shuai03 ~]# yum -y install httpd     //安装httpd服务
[root@shuai03 ~]# systemctl start httpd    //重启服务
[root@shuai03 ~]# iptables -F              //清空防火墙
[root@shuai03 ~]# iptables -t nat -F

mark

[root@shuai03 ~]# systemctl start network    //重启网卡

局域网主机已经可以访问外部服务器的web界面

mark

4.7:查看访问日志

[root@shuai03 ~]# cd /var/log/httpd
[root@shuai03 httpd]# ls
access_log  error_log
[root@shuai03 httpd]# cat access_log 

可以清楚的看到是内部主机IP访问了外网

mark

4.8:防火墙shuai02配置SNAT

//做NAT转换 把内部IP192.168.138.10变为外部接口地址为12.0.0.1去访问外部服务

[root@shuai02 ~]# iptables -t nat -I POSTROUTING -s 192.168.138.10 -o ens36 -j SNAT  --to-source 12.0.0.1

切换shuai01客户机刷新访问界面

mark

转到shuai03外部服务器查看访日志 已经变为外部接口地址12.0.0.1了

mark

4.9:配置DNAT

内部shuai01要做一个网站,由于是VM1,我们需要自己本地 源,创建一个yum仓库

[root@shuai01 ~]# cd /etc/yum.repos.d/
[root@shuai01 yum.repos.d]# ls
CentOS-Base.repo  CentOS-Debuginfo.repo  CentOS-Media.repo    CentOS-Vault.repo
CentOS-CR.repo    CentOS-fasttrack.repo  CentOS-Sources.repo
[root@shuai01 yum.repos.d]# mkdir bak
[root@shuai01 yum.repos.d]# mv *.repo bak
[root@shuai01 yum.repos.d]# ls
bak
[root@shuai01 yum.repos.d]# vim shuai.repo

[shuai]
name=test                      //仓库名称
baseurl=file:///mnt            //仓库软件源头
enabled=1                      //开启yum仓库
gpgcheck=0                     //关闭密钥检查

[root@shuai01 yum.repos.d]# mount /dev/sr0 /mnt
mount: /dev/sr0 写保护,将以只读方式挂载
[root@shuai01 yum.repos.d]# df -Th
文件系统                类型      容量  已用  可用 已用% 挂载点
...省略
/dev/sr0                iso9660   4.3G  4.3G     0  100% /mnt
[root@shuai01 yum.repos.d]# yum list       //加载仓库
[root@shuai01 yum.repos.d]# yum -y install httpd  //下载服务
[root@shuai01 yum.repos.d]# vim /var/www/html/index.html
<h1>I am a handsome boy</h1>
[root@shuai01 yum.repos.d]# systemctl start httpd  //启动服务

设置好检查自己是否能否访问

mark

外网想要访问内部的私IP是直接访问不了的,所以接下来做IP地址映射

5.0:设置防火墙DNAT

[root@shuai02 ~]# iptables -t nat -I PREROUTING -d 12.0.0.1 -i ens36 -p tcp --dport 80 -j DNAT --to-destination 192.168.138.10
//shuai01清空防火墙
[root@shuai02 ~]# iptables -F
[root@shuai02 ~]# iptables -t nat -F
//这边内网的防火墙一定别忘记清空

mark

5.1:iptables规则保存!!!

[root@shuai02 ~]# iptables-save > /opt/1.txt
[root@shuai02 ~]# cd /opt
[root@shuai02 opt]# ls
1.txt  rh
[root@shuai02 opt]# vim 1.txt      //查看规则
//我们把规则清空
[root@shuai02 opt]# iptables -F
[root@shuai02 opt]# iptables -t nat -F

在用shuai03访问一下shuai01

mark

//直接找回就行
[root@shuai02 opt]# iptables-restore < /opt/1.txt 
//查看规则已经回来了
[root@shuai02 opt]# iptables -t nat -L

mark

本次实验结束,感谢观看,记住生产环境一定要进行备份!

猜你喜欢

转载自blog.csdn.net/weixin_47151643/article/details/107748021
今日推荐