iptables:iptables有多种功能,每一种功能都用一张表来实现,最常用的功能是防火墙和NAT。从RHEL7开始,默认的防火墙为firewalld,但是它的底层仍然在调用iptables。
iptables有四个表:raw(状态跟踪表)、mangle(包标记表)、nat(地址转换表)、filter(过滤表-默认的表)。
环境搭配:
client1:eth0->192.168.88.10,网关192.168.88.11
node1:eth0->192.168.88.11,eth1->192.168.99.11
server1:eth1->192.168.99.100,网关192.168.99.11
![](https://i-blog.csdnimg.cn/blog_migrate/58fb15b0b1e27dcc59e27ca9ad35083b.png)
![](https://i-blog.csdnimg.cn/blog_migrate/59e84556961da89b5da43bd4584a5522.png)
![](https://i-blog.csdnimg.cn/blog_migrate/c9be0ed6d94400cb94970ca3a667d029.png)
配置双网卡通信
![](https://i-blog.csdnimg.cn/blog_migrate/519356c09c8bd78a39ef7dcf66d32381.png)
![](https://i-blog.csdnimg.cn/blog_migrate/edd1ff89aec1cb971ef3ca4a4c5865c5.png)
此时就能使用88网段ping99网段
![](https://i-blog.csdnimg.cn/blog_migrate/3ba1558afe21681a484b532b389561de.png)
在node1主机上安装iptables服务,先关闭firewalld防火墙
![](https://i-blog.csdnimg.cn/blog_migrate/4fe400f3161106b46ef0b872ffa687bc.png)
![](https://i-blog.csdnimg.cn/blog_migrate/517cbc62f708054c3e5dbb9db2c1e79b.png)
防火墙filter表:配置iptables时,不指定表就是使用filter表;配置时不指定规则链,则配置所有链;可以向规则链中加入很多规则,数据包进入该链时,从上向下匹配,一旦匹配就停止,开始应用规则。如果全都不匹配,则应用默认规则;命令选项、链名、目标操作使用大写字母,其他小写字母。
指定filter表和不指定表查看表的结果都是一样的
![](https://i-blog.csdnimg.cn/blog_migrate/ffb1082ac85cc7008f3804cbc245d26d.png)
filter中的三条链:
INPUT:数据包的目标地址是自己,则进入INPUT链。
OUTPUT:数据包的源地址是自己,则进入OUTPUT链。
FORWARD:数据包穿过自己,则进入FORWARD链。
iptables常用选项:
-A:追加规则--iptables -A INPUT
-D:删除规则--iptables -D INPUT 1(编号)
-R:修改规则--iptables -R INPUT 1 -s 192.168.88.10 -j DROP
-I:插入规则--iptables -I INPUT 1 --dport 80 -j ACCEPT (成为规则1)
-L:查看规则--iptables -L INPUT (列出该规则链中的所有规则)
-F:清空规则--iptables -F
-P:设置默认规则--iptables -P INOUT DROP
通用参数:
-p:协议--iptables -A INPUT -p tcp
-s:源地址--iptables -A INPUT -s 192.168.88.1
-d:目的地址--iptables -A INPUT -d 192.168.88.1
--sport:源端口--iptables -A INPUT -p tcp --sport 22
--dport:目的端口--iptables -A INPUT -p tcp --dport 22
-i:指定入口网卡--iptables -A INPUT -i eth0
-o:指定出口网卡--iptables -A INPUT -i eht0
-j:指定要进行的处理动作,常用的ACTION:DROP(丢弃)、REJECT(明确拒绝)、ACCEPT(接收)。
-n:以数字形式显示
查看filter表中的规则,-t指定表名。所有的规则链都是空的。iptables -t filter -L
![](https://i-blog.csdnimg.cn/blog_migrate/986f46ddf9f5bf400b4427bdc9ef3016.png)
不指定表名也是filter表
![](https://i-blog.csdnimg.cn/blog_migrate/5c772dbb0b3d3d5331547107f7ff16a8.png)
开启iptables服务
![](https://i-blog.csdnimg.cn/blog_migrate/47a9feeac54d2c62d3b28f1d6c5a28a2.png)
此时规则链中就会增加一些规则
![](https://i-blog.csdnimg.cn/blog_migrate/c0344fd348edc06b6671e49cde4e3462.png)
清空规则:iptables -F 。不指定规则链就清空所有的规则
![](https://i-blog.csdnimg.cn/blog_migrate/5a02129f0117b7a40b0389d58ca2dd6d.png)
可以设置默认拒绝,然后明确允许;也可以设置默认允许,然后明确拒绝。
向INPUT链的默认规则设置DROP丢弃,-P设置默认规则。
先设置宿主机的IP地址为允许访问,否则修改默认规则为DROP该ssh就会断开
![](https://i-blog.csdnimg.cn/blog_migrate/d65d5367c3a4d5b7c60c55ac1110ab99.png)
修改默认规则为DROP
![](https://i-blog.csdnimg.cn/blog_migrate/6c18ce0fef66119ddff112cb9bd19481.png)
-n以数字形式显示
![](https://i-blog.csdnimg.cn/blog_migrate/cc182fd123fccf0a00eb17111fa177d5.png)
当其他主机访问是就会ping不通,node1主机既不拒绝也不允许,会把请求访问的包丢弃。
![](https://i-blog.csdnimg.cn/blog_migrate/5f0e77bb430a4ce2bd669a23474c1ad8.png)
当使用node1主机ping192.168.88.10主机时也不能ping通,因为访问外面主机时OUPPUT默认的是ACCEPT允许规则可以访问,当192.168.88.10主机要返回请求时,会被node1主机的INPUT规则链中的规则所拒绝。网络通信是双向的。
![](https://i-blog.csdnimg.cn/blog_migrate/1f86f7c71f3d3d9b1911149e65bf93b5.png)
允许88网段的所有主机访问node1主机的ssh端口
iptables -I INPUT 1 -s 192.168.88.0/24 -p tcp --dport 22 -j ACCEPT
![](https://i-blog.csdnimg.cn/blog_migrate/1068f257eef487dde5142bde7452d775.png)
此时就能远程登录了
![](https://i-blog.csdnimg.cn/blog_migrate/7df291f618992bda6cc8db5217f4b04b.png)
但ping还是不能ping通的,因为只是设置的所有主机访问ssh的端口被允许,而其他主机访问的数据包还是丢弃的。
![](https://i-blog.csdnimg.cn/blog_migrate/52f42ff96468572fc467bff87fbc837b.png)
当安装http服务时会安装不上
![](https://i-blog.csdnimg.cn/blog_migrate/abed07ddc8a6ea0a73f9faa8a3eb975f.png)
因为使用的yum为网络yum源,设置的INPUT规则链中没有允许240的ftp服务端口的规则,所以240主机返回的数据包会被丢弃
![](https://i-blog.csdnimg.cn/blog_migrate/b7b4506ea72e1f54dc22f4552854544b.png)
设置规则240主机被允许
![](https://i-blog.csdnimg.cn/blog_migrate/2e8712c8c5b59c630fd92cabfc0799c5.png)
此时就能安装http服务了
![](https://i-blog.csdnimg.cn/blog_migrate/5d7f5ce7fda89154d93dab6deb0f0380.png)
开启http服务
![](https://i-blog.csdnimg.cn/blog_migrate/60c8fab5ca2b41a8869271275a6c0db3.png)
当其他主机访问11主机的http服务会被丢弃,
![](https://i-blog.csdnimg.cn/blog_migrate/bb2b4babb103767834744e9f16ce0f34.png)
设置所有主机允许访问11主机的80端口的规则。不指定IP 地址则默认所有地址
![](https://i-blog.csdnimg.cn/blog_migrate/4db0cde88b4937b50e87dbaba501e326.png)
此时就能访问了
![](https://i-blog.csdnimg.cn/blog_migrate/d7908b98c7ffa1eda941f5195a1eca4f.png)
禁止宿主机1地址ping node1主机11IP地址,使用icmp协议没有端口
iptables -A INPUT -s 192.168.88.1 -p icmp -j REJECT。但该规则位于允许宿主机所有访问所有协议规则的下面,所以会执行允许访问所有协议规则不会执行拒绝ping的规则。
![](https://i-blog.csdnimg.cn/blog_migrate/39e86ae05965ba4af147936b09eaf52f.png)
此时还是能够ping通
![](https://i-blog.csdnimg.cn/blog_migrate/eae2bbd9d09367fb18eeb34715f020fd.png)
将该规则删除,重新写在最上面
![](https://i-blog.csdnimg.cn/blog_migrate/b39674e859e956a9df3ee612edeee7d6.png)
插入没有指明位置默认插入到第一个 iptables -I INPUT -s 192.168.88.1 -p icmp -j REJECT
![](https://i-blog.csdnimg.cn/blog_migrate/832329310f40fe1b799b1baeeda2c78a.png)
此时宿主机就不能ping通node1了
![](https://i-blog.csdnimg.cn/blog_migrate/4682c1c766fc349a9e11ba4739d41caa.png)
每次系统开机该防火墙数据就会消失,需要保存数据到/etc/sysconfig/iptables文件中,因为iptables重启会自动加载该文件。
iptables-save将防火墙规则打印到屏幕
![](https://i-blog.csdnimg.cn/blog_migrate/e744cf943af328b6f8a95e1a0f4166d7.png)
将防火墙打印到屏幕的内容导入到/etc/sysconfig/iptables中
![](https://i-blog.csdnimg.cn/blog_migrate/3bcd712939997ca1c68548b29f26683c.png)
当自己访问自己的时候就不能访问
![](https://i-blog.csdnimg.cn/blog_migrate/d8652e227403475bf99c61bd7c14ae07.png)
因为数据是双向通信的,自己访问自己的80端口时会随机生成一个大于1024的源端口(如1234),访问自己的80目标端口,能够成功的访问到。但当访问请求传递回的时候目标端口就变成的随机生成的那个大于1024的源端口(1234),而源端口就变成的80端口,此时没有设置改源端口的允许规则所以就访问失败。
设置192.168.88.11的所有端口被允许放行
iptables -I INPUT -d 192.168.88.11 -p tcp --sport 80 -j ACCEPT
或者允许所有的端口的目标端口被放行iptables -I INPUT -p tcp --sport 80 -j ACCEPT
![](https://i-blog.csdnimg.cn/blog_migrate/24ae261fbe4d5d9a0c1a4bf2602d1ab1.png)
此时自己就能够访问自己的80端口了
![](https://i-blog.csdnimg.cn/blog_migrate/d2107bd943abbf11b4e5b3e3af4898a7.png)
设置自己访问自己的ssh服务
iptables -I INPUT -p tcp --sport 22 -j ACCEPT
![](https://i-blog.csdnimg.cn/blog_migrate/ee4e3d930ec19e05a0933cc5f7643585.png)
此时就那个ssh自己了
![](https://i-blog.csdnimg.cn/blog_migrate/3281bdaca2d4a84112181a92645ad3e3.png)
FORWARD链:
在server1上安装http服务
![](https://i-blog.csdnimg.cn/blog_migrate/3fb8c3e0bf13d090ec2bc5b870542df6.png)
![](https://i-blog.csdnimg.cn/blog_migrate/857d92667fe27bc2f7d411e915bdd1df.png)
此时客户端能够访问服务器
![](https://i-blog.csdnimg.cn/blog_migrate/c1f73833658f28aa9dcbd51da9507d97.png)
在node1上配置防火墙保护server1:1、默认拒绝所有数据包通过。2、从server1所在网段发往client1所在网段的包全部允许。3、从client1所在的网段到server1所在网段,允许ICMP、ssh、80、443端口通过。
FORWARD默认允许所有通过
![](https://i-blog.csdnimg.cn/blog_migrate/86b1407980d176e3a140724a9e95a703.png)
1、设置默认拒绝所有数据包通过iptables -P FORWARD DROP
![](https://i-blog.csdnimg.cn/blog_migrate/86c7b19e3267737ff7f401872aa3626d.png)
此时server1和client1完全不通
![](https://i-blog.csdnimg.cn/blog_migrate/4ebecc9e8b898d8a604100d234da502a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/6770f0c4691d90d4c66bdb0c23ca5a5e.png)
2、设置从server1所在网段发往client1所在网段的包全部允许
iptables -A FORWARD -s 192.168.99.0/24 -d 192.168.88.0/24 -j ACCEPT
![](https://i-blog.csdnimg.cn/blog_migrate/56f39d852157df4460196bc560f3112b.png)
此时server不能ping通client因为数据是双向的,当client回应server是会被拒绝。
![](https://i-blog.csdnimg.cn/blog_migrate/15d7721b2087f2c102acaf78ce764aec.png)
3、设置从client1所在的网段到server1所在网段,允许ICMP、ssh、80、443端口通过。
![](https://i-blog.csdnimg.cn/blog_migrate/ebaa7688f70a4fdf2b4601935533dba3.png)
此时就那个连接到server1主机了
![](https://i-blog.csdnimg.cn/blog_migrate/cc8fd17713e0bb866363ae24563416da.png)
但ssh服务还是不能连接
![](https://i-blog.csdnimg.cn/blog_migrate/fa6651ff4b80eb1cecbb1fb57011336a.png)
设置源22端口允许通行
iptables -A FORWARD -s 192.168.88.0/24 -d 192.168.99.0/24 -p tcp --sport 22 -j ACCEPT
![](https://i-blog.csdnimg.cn/blog_migrate/e271bffe857b34fd976e9c4342f41d4b.png)
此时就那个远程登录客户端了
![](https://i-blog.csdnimg.cn/blog_migrate/77adfbad3d141149a230641cff9c682b.png)
设置server访问客户端的http通行
![](https://i-blog.csdnimg.cn/blog_migrate/9c447d2dd2cf24aed26711d19e99b3e4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ade4f4a748f56bdfbcf95cd0696ba27a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/f679f6232d09324d0d8c2e886fe99f46.png)
清空FORWARD规则链,重新编写
![](https://i-blog.csdnimg.cn/blog_migrate/5b8bf1642746d9a7a11ef5b1deda0b32.png)
![](https://i-blog.csdnimg.cn/blog_migrate/75ad61a6e967f6d475646b31bf2312be.png)
-m multiport 允许连续设置端口,使用逗号隔绝非连续的端口,使用冒号来表示连续端口(如10:120)
iptables -A FORWARD -s 192.168.88.0/24 -d 192.168.99.0/24 -p tcp -m multiport --dport 22,80,443 -j ACCEPT
![](https://i-blog.csdnimg.cn/blog_migrate/a60687ba90266118208d096ebaf8a93f.png)
端口可以使用范围来表示,IP地址也可以使用范围来表示
拒绝192.168.88.10-20访问192.168.99.50-150。-m是引导扩展模块,src-range是源地址范围,dst-range是目标地址范围
iptables -I FORWARD -m iprange --src-range 192.168.88.10-192.168.88.20 --dst-range 192.168.99.50-192.168.99.150 -j REJECT
![](https://i-blog.csdnimg.cn/blog_migrate/f6ea681b7539fb3951979ff4d62cd49c.png)
此时就不能连接server1主机了
![](https://i-blog.csdnimg.cn/blog_migrate/0314ba31f786c74519c549a04cb07b48.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ae3f482a138e00bcd6ed1d96420783c9.png)
NAT:网络地址翻译、网络地址转换。NAT技术的产生主要是解决ipv4地址不够用,NAT一般用于将私有地址转换成全球唯一的公有地址、
私有地址:A类:10.0.0.0-10.255.255.255、B类:172.16.0.0-172.31.255.255、C类:192.168.0.0-192.168.255.255
私有地址如果需要访问互联网中的公有地址进行上网,可以通过NAT技术将私有地址转换成公有地址,再访问外界。
配置SNAT:S(Source)
查看client访问server的记录
![](https://i-blog.csdnimg.cn/blog_migrate/8afc32bb8c77a3de0745533254e7b920.png)
访问server
![](https://i-blog.csdnimg.cn/blog_migrate/b7e08b74762c8f2b67679516eed3c272.png)
此刻就有client的访问记录
![](https://i-blog.csdnimg.cn/blog_migrate/3b749b7a4170a9a386e44b9835928617.png)
查看NAT表 iptables -t nat -L
![](https://i-blog.csdnimg.cn/blog_migrate/421d273b221a695d62faa6abce75fbe4.png)
向nat表中的POSTROUTING链(路由后)中添加规则,将源地址192.168.88.0/24转换创外网卡地址 iptables -t nat -A POSTROUTING -s 192.168.88.0/24 -j MASQUERADE
![](https://i-blog.csdnimg.cn/blog_migrate/977f752bf2953ef84ab80305823a76ea.png)
此时客户端访问server,就会变成99网段的地址
![](https://i-blog.csdnimg.cn/blog_migrate/94ed72dbd99d55693397ecef4091165a.png)
![](https://i-blog.csdnimg.cn/blog_migrate/decf4a935c37cb9b4f85f2665879cd0d.png)