10.15 iptables filter表小案例
iptables 命令、语法总结
iptables-nvL //查看iptables规则
iptables -F //清空规则
service iptables save //保存规则,保存在/etc/sysconfig/iptables,重启的时候会调用这里面的规则
iptables -t nat //-t指定表,如果不用-t,默认对filter 执行
iptables -Z //可以把计数器清零
iptables -I/-A/-D INPUT -s 1.1.1.1 -j DROP
iptables -I INPUT -s 192.168.1.0/24 -ieth0 -j ACCEPT
-A 和 -I 的区别
- -A 是在规则列表最下方增加
- -I 是在规则列表最上方增加
- 谁在规则列表最上,谁就最先匹配、加载
命令语法
iptables -A INPUT -s 192.168.188.1 -p tcp--sport 1234 -d 192.168.188.128 --dport80 -j DROP
iptables -I [链的名字] -s [源IP] -p [指定协议] --sport [指定源端口] -d [指定目标IP] --dport [指定目标端口] -j [指定行为]
[链的名字]
- INPUT //进来的包
- OUTPUT //出去的包
- FORWARD //比较少用
[指定协议]
- tcp
- udp
- icmp
[指定行为]
- DROP // 丢弃
- ACCEPT // 放行
- REJECT // 拒绝
iptables -nvL --line-numbers //查看规则的序号
iptables -D INPUT 1 //针对序号删除
iptables -P INPUT DROP //指定链的默认策略,最好不要直接操作,很有可能导致远程终端直接中断
案例
需求:把80端口、22端口、21端口放行,22端口指定IP段内的IP才能进行访问
使用脚本实现
#! /bin/bash
ipt="/usr/sbin/iptables" //定义了环境变量 ipt
$ipt -F //清除filter表的规则
$ipt -P INPUT DROP //定义INPUT链的默认策略为全部丢掉
$ipt -P OUTPUT ACCEPT //定义OUTPUT链的默认策略为全部放行
$ipt -P FORWARD ACCEPT //定义了FORWARD链的默认策略为全部放行
$ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT //针对RELATED,ESTABLISHED这两状态进行放行
$ipt -A INPUT -s 192.168.133.0/24 -p tcp --dport 22 -j ACCEPT //这个网段的数据包放行
$ipt -A INPUT -p tcp --dport 80 -j ACCEPT //80端口放行
$ipt -A INPUT -p tcp --dport 21 -j ACCEPT //21端口放行
脚本解释:
定义环境变量的理由,因为正确使用命令是用绝对路径进行使用,这样才不会因为环境变量的改动导致无法使用命令 两种状态:
- RELATED 有关系的端口的,是一个边缘的状态,客户端和服务端建立连接之后,还有继续有一些额外的链接出来,这个时候就变成这个状态
- ESTABLISHED 已建立的连接,保持连接 仅仅是 ESTABLISHED,很有可能其他的通信被禁掉,因为默认策略是DROP,所以必须加上这个状态,加这个状态的目的就是为了让通信更加顺畅
使用脚本的原因
因为逐个执行命令,会导致远程终端断开连接,如果使用脚本将会在瞬间执行好所有的命令,将不再产生端口终端的状态
查看新增规则状况
[root@aminglinux-02 ~]# !sh
sh /usr/local/sbin/iptables.sh
[root@aminglinux-02 ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
26 1888 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
0 0 ACCEPT tcp -- * * 192.168.133.0/24 0.0.0.0/0 tcp dpt:22
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80
0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21
licmp示例:
禁止ping本机
iptables -I INPUT -p icmp --icmp -type 8 -j DROP
10.16/10.17/10.18 iptables nat表应用
准备工作:
设备情况: A机器两块网卡ens33(192.168.133.130)、ens37(192.168.100.1),ens33可以上外网,ens37仅仅是内部网络,B机器只有ens37(192.168.100.101),和A机器ens37可以通信互联。
- 环境准备
一、克隆一个虚拟机
==PS:克隆好的虚拟机需要修改 hostname 以便区分==
二、对两台(aminglinux-02、aminglinux-02的克隆)虚拟机增加一个网卡,网卡选项选择为LAN区段
PS:需要同时对两台虚拟机都进行这个操作,这个操作是目的,为的就是让两台虚拟机都处于同一个虚拟交换机中(LAN区段,就类似一个虚拟交换机);克隆好虚拟机以后记得修改hostname 不然也会出错
需要注意的一点,因为实验环境,A机器是可以内网、外网同时访问,所以A机器必须是要有两个网卡;B机器可以只有一个网卡,所以在配置B机器的时候只需要把B机器的网络适配器网络连接调整为LAN区段也是可以的(但这样做需要改动进入系统内调整网卡配置),但是为了方便,直接重复创建一个网卡,改动网络连接为LAN区段即可
三、配置两台机器的LAN区段IP
A机器: 因为A机器配置能访问外网的网卡,所以可以直接通过终端进行访问 配置LAN网卡
[root@aminglinux-02 ~]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.133.131 netmask 255.255.255.0 broadcast 192.168.133.255
inet6 fe80::6e6a:61ff:f17c:5942 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:c4:13:b8 txqueuelen 1000 (Ethernet)
RX packets 2908766 bytes 284945595 (271.7 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7085 bytes 1858943 (1.7 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::44fe:e11f:f99c:4de1 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:c4:13:c2 txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 51 bytes 8994 (8.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 68 bytes 5524 (5.3 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 68 bytes 5524 (5.3 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@aminglinux-02 network-scripts]# ifconfig ens34 192.168.100.1/24
[root@aminglinux-02 network-scripts]# ifconfig
ens32: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.133.131 netmask 255.255.255.0 broadcast 192.168.133.255
inet6 fe80::6e6a:61ff:f17c:5942 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:c4:13:b8 txqueuelen 1000 (Ethernet)
RX packets 2911127 bytes 285202630 (271.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8305 bytes 2026122 (1.9 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens34: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.100.1 netmask 255.255.255.0 broadcast 192.168.100.255
inet6 fe80::acc1:13e6:b0b6:33ab prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:c4:13:c2 txqueuelen 1000 (Ethernet)
RX packets 39 bytes 8230 (8.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 81 bytes 11500 (11.2 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 72 bytes 5864 (5.7 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 72 bytes 5864 (5.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ifconfig 配置的网卡IP只是暂时生效,重启以后又会失效,如果想永久生效,需要更改配置,但是网卡是新创建的并没有网卡配置文件,需要cp原有的ens32网卡的配置文件,修改NAME、DEVICE两个还需要修改相关的IP B机器 因为环境需要,我们只用使用一个网卡,所以需要在虚拟机上进行配置
四、测试两台机器的连通状况
A机器pingB机器
[root@aminglinux-02 ~]# ping 192.168.100.100
PING 192.168.100.100 (192.168.100.100) 56(84) bytes of data.
64 bytes from 192.168.100.100: icmp_seq=1 ttl=64 time=0.406 ms
64 bytes from 192.168.100.100: icmp_seq=2 ttl=64 time=0.258 ms
64 bytes from 192.168.100.100: icmp_seq=3 ttl=64 time=0.333 ms
64 bytes from 192.168.100.100: icmp_seq=4 ttl=64 time=0.333 ms
64 bytes from 192.168.100.100: icmp_seq=5 ttl=64 time=0.307 ms
64 bytes from 192.168.100.100: icmp_seq=6 ttl=64 time=0.290 ms
64 bytes from 192.168.100.100: icmp_seq=7 ttl=64 time=0.323 ms
^C
--- 192.168.100.100 ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6004ms
rtt min/avg/max/mdev = 0.258/0.321/0.406/0.045 ms
[root@aminglinux-02 ~]#
B机器pingA机器情况
需求一
可以让B机器连接外网
A机器配置
- 打开路由转发
echo "1">/proc/sys/net/ipv4/ip_forward
要想使用路由转发,必须要修改内核文件,打开端口转发
[root@aminglinux-02 ~]# cat /proc/sys/net/ipv4/ip_forward
0
/proc/sys/net/ipv4/ip_forward 这个文件默认是0 表示没有打开
[root@aminglinux-02 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
[root@aminglinux-02 ~]# cat /proc/sys/net/ipv4/ip_forward
1
- 增加一个规则
[root@aminglinux-02 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens32 -j MASQUERADE
[root@aminglinux-02 network-scripts]# iptables -t nat -nvL
Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
1 84 MASQUERADE all -- * ens32 192.168.100.0/24 0.0.0.0/0
B机器配置
- 增加网关
因为使用ifconfig命令添加的IP地址是没有网关的,通过下图可以看到
测试连通情况
==PS:之前配置A机器的时候出了错误,导致一直ping不同外网,最后检查的时候发现,设置的网卡出错了。(因为命令也是复制PPT的,PPT里面针对设置的网卡是ens33,而我的虚拟机并没有这个网卡)==
需求二:
实现远程登录B机器,也就是实现宿主机C,能ping通B机器
A机器配置
- 一、打开端口转发
echo "1">/proc/sys/net/ipv4/ip_forward
因为之前A机器B机器互通,已经做过了,可以省略
- 二、清除原有规则
因为之前A机器B机器互通,添加有规则,先把规则清楚,不让他影响到我们之后的操作 [root@aminglinux-02 network-scripts]# iptables -t nat -D POSTROUTING -s 192.168.100.0/24 -o ens32 -j MASQUERADE [root@aminglinux-02 network-scripts]# iptables -t nat -nvL Chain PREROUTING (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Chain OUTPUT (policy ACCEPT 1 packets, 76 bytes) pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 1 packets, 76 bytes) pkts bytes target prot opt in out source destination
- 三、新增规则
1、
iptables -t nat -A PREROUTING -d 192.168.133.131 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
命令理解:将192.168.133.131 端口为1122 进来的数据转发到 192.168.100.100端口22
2、
iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.133.130
命令理解:将192.168.100.100源IP转发到192.168.133.130
B机器配置
- 在B机器上增加网关
route add default gw 192.168.100.1
因为之前需求一的时候,做过这个操作,所以这一步也可以省略
- 用终端连接
做完这些操作就可以尝试在终端上进行连接
证明连接的就是B机器 查看一下是否能上网
[root@aminglinux-02-kl ~]# ping www.qq.com
PING www.qq.com (14.17.42.40) 56(84) bytes of data.
64 bytes from 14.17.42.40 (14.17.42.40): icmp_seq=1 ttl=127 time=23.5 ms
64 bytes from 14.17.42.40 (14.17.42.40): icmp_seq=2 ttl=127 time=23.9 ms
64 bytes from 14.17.42.40 (14.17.42.40): icmp_seq=3 ttl=127 time=23.1 ms
^C
--- www.qq.com ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 23.187/23.574/23.945/0.309 ms
上网也是正常的
经过前面的操作,实现了C机器连接A机器,同时还能上网,完成了需求