[root@localhost ~]# systemctl stop firewalld.service
//centos 7默认使用firewalld防火墙,要是使用iptables必须先关闭firewalld防火墙
[root@localhost ~]# systemctl disable firewalld.servic:e
[root@localhost ~]# yum y install iptables iptables-services
[root@localhost ~]# systemctl start iptables.service
[root@localhost ~]# systemctl enable iptables.service
iptables [-t 表名] 选项 [链名] [条件] [-j 控制类型]
如果不指定表名,则会默认指定filter表
[root@localhost ~]# iptables -t filter -l INPUT -p icmp -j REJECT
-p :协议 阻止ping测试
REJECT:拒绝 或者用DROP
filter:默认表 -t可以不写 其他三个表就要写
注意事项
不指定表名时,默认指filter表
不指定链名时,默认指表内的所有链
除非设置链的默认策略,否则必须指定匹配条件
选项、链名、控制类型使用大写字母,其余均为小写
所有链名必须大写
INPUT/OUTPUT/FORWARD/PREROUTING/POSTROUTING
所有表名必须小写
filter/nat/mangle
所有动作必须大写
ACCEPT/DROP/SNAT/DNAT/MASQUERADE
所有匹配必须小写
-s/-d/-m <module_name>/-p
//两台主机 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不通了
ACCECT:允许通过
DROP:直接丢弃
REJECT:拒绝通过,必要时会给出提示
LOG:记录日志信息,然后传给下一条规则继续匹配
-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
L:列出所有的规则条目
-n: 以数字形式显示地址、端口等信息
-V: 以更详细的方式显示规则信息
-line-numbers:查看规则时,显示规则的序号
[root@localhost ~]# iptables -L INPUT --line-numbers
[root@localhost ~]# iptables -n -L INPUT //-n -L可合写
-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
-P:为指定的链设置默认规则
[root@localhost ~]# iptables -t filter P FORWARD DROP
[root@localhost ~]# iptables P OUTPUT ACCEPT
//清空所有默认策略要么是ACCEPT 要么是DROP表的所有链
类别 | 选项 | 用途 |
---|---|---|
添加新的规则 | -A | 在链的末尾追加一条规则 |
-l | 在链的开头(或指定序号)插入一条规则 | |
查看规则列表 | -L | 列出所有的规则条目 |
-n | 以数字形式显示地址、端口等信息 | |
-v | 以更详细的方式、显示规则的序号 | |
–line-numbers | 查看规则时,显示规则的序号 | |
删除、清空规则 | -D | 删除链内指定序号(或内容)的一条规则 |
-F | 清空所有规则 | |
设置默认策略 | -P | 为指定的链设置默认规则 |
●可直接使用,不依赖于其他条件或扩展
●包括网络协议、IP地址、网络接口等条件
●要求以特定的协议匹配作为前提
●包括端口、TCP标记、ICMP类型等条件
●要求以:-m扩展模块”的形式明确指出类型
●包括多端口、MAC地址、IP范围、 数据包状态等条件
●协议匹配: -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
端口匹配: --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不可达
●多端口匹配: -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
类别 | 条件类型 | 用法 |
---|---|---|
通用匹配 | 协议匹配 | -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路由转发
实验环境
准备三台 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
[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
//复制一份网卡改为ens36 -p:保持原有属性
[root@shuai02 network-scripts]# cp -p ifcfg-ens33 ifcfg-ens36
//编辑ens36网卡
[root@shuai02 network-scripts]# vim ifcfg-ens36
//重启网卡
[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
//允许对方能够访问就要开启数据转发
[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 //查看条目是否清空
[root@shuai01 ~]# vim /etc/sysconfig/network-scripts/ifcfg-ens33
//重启网卡
[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
....省略
[root@shuai03 ~]# yum -y install httpd //安装httpd服务
[root@shuai03 ~]# systemctl start httpd //重启服务
[root@shuai03 ~]# iptables -F //清空防火墙
[root@shuai03 ~]# iptables -t nat -F
[root@shuai03 ~]# systemctl start network //重启网卡
局域网主机已经可以访问外部服务器的web界面
4.7:查看访问日志
[root@shuai03 ~]# cd /var/log/httpd
[root@shuai03 httpd]# ls
access_log error_log
[root@shuai03 httpd]# cat access_log
可以清楚的看到是内部主机IP访问了外网
//做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客户机刷新访问界面
转到shuai03外部服务器查看访日志 已经变为外部接口地址12.0.0.1了
内部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 //启动服务
设置好检查自己是否能否访问
外网想要访问内部的私IP是直接访问不了的,所以接下来做IP地址映射
[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
//这边内网的防火墙一定别忘记清空
[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
//直接找回就行
[root@shuai02 opt]# iptables-restore < /opt/1.txt
//查看规则已经回来了
[root@shuai02 opt]# iptables -t nat -L
本次实验结束,感谢观看,记住生产环境一定要进行备份!