需求:把80端口、22端口、21端口都放行,其中22端口指定IP段放行。

  • 用一个脚本来实现这个需求。
• #!/bin/bash
 ipt="/usr/sbin/iptables" #定义变量,执行命令时写命令的绝对路径。
 $ipt -F #清空filter表之前的规则
 $ipt -P INPUT DROP #定义INPUT默认策略
 $ipt -P OUTPUT ACCEPT #定义OUTPUT默认策略
 $ipt -P FORWARD ACCEPT #定义FORWAD默认策略
 $ipt -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT #指定状态放行
 $ipt -A INPUT -s 192.168.159.0/24 -p tcp --dport 22 -j ACCEPT #指定ip和端口放行
 $ipt -A INPUT -p tcp --dport 80 -j ACCEPT #指定端口放行
 $ipt -A INPUT -p tcp --dport 21 -j ACCEPT #指定端口放行

使用脚本实现需求是因为开始就将INPUT链的默认策略改成了DROP,远程就会断开。

[root@localhost ~]# iptables -nvL
Chain INPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         
57  4188 ACCEPT     all  --  *      *       0.0.0.0/0            0.0.0.0/0            state RELATED,ESTABLISHED
0     0 ACCEPT     tcp  --  *      *       192.168.159.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

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target     prot opt in     out     source               destination         

Chain OUTPUT (policy ACCEPT 39 packets, 3644 bytes)
pkts bytes target     prot opt in     out     source               destination

使用iptables -nvL命令查看filter表的策略,刚才使用脚本添加的策略已经添加成功。

  • -m state --state[状态]
  • INVALID:无效的封包,例如数据破损的封包状态
  • ESTABLISHED:已经联机成功的联机状态
  • NEW:想要新建立联机的封包状态
  • RELATED:这个最常用!表示这个封包是与我们主机发送出去的封包有关, 可能是响应封包或者是联机成功之后的传送封包!这个状态很常被设定,因为设定了他之后,只要未来由本机发送出去的封包,即使我们没有设定封包的 INPUT 规则,该有关的封包还是可以进入我们主机, 可以简化相当多的设定规则。

禁止外面的机器ping本机

iptables -I INPUT -p icmp --icmp-type 8 -j DROP

禁ping不代表不能访问,只是ping不同而已。

iptables nat表应用

准备工作

  1. 准备两台虚拟机A、B
  2. A设备上两块网卡,分别为ens33(192.168.159.128),ens37(192.168.100.10),ens33可以上外网,ens44仅可以是内部网络。
  3. B设备上只有ens37(192.168.100.100)仅可以使用内部网络,并且和A设备可以通信。

需求1:可以让B设备连接外网

  • A设备上需要打开路由转发
• [root@centos-01 ~]# cat /proc/sys/net/ipv4/ip_forward
 0
 [root@centos-01 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward
 [root@centos-01 ~]# cat /proc/sys/net/ipv4/ip_forward
 1

文件内容默认为0,表示没有开启内核转发。改成1就打开了端口转发。

  • 在nat表POSTROUTING链上增加一条规则
• [root@centos-01 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.0/24 -o ens33 -j MASQUERADE
 [root@centos-01 ~]# 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 4 packets, 304 bytes)
 pkts bytes target prot opt in out source destination
Chain POSTROUTING (policy ACCEPT 4 packets, 304 bytes)
 pkts bytes target prot opt in out source destination 
 0 0 MASQUERADE all -- * ens33 192.168.100.0/24 0.0.0.0/0

-o选项后面跟网卡设备名称,表示出口网卡,MASQUERADE是伪装、冒充的意思。

  • 将B设备的网关(GATEWAY)改成设备A的ip地址

此时B机器可以连通外网,但是外网机器无法访问B机器,A机器的作用就类似于一个路由器

需求2:C机器只能和A通信,让C机器可以直接连通B机器的22端口(端口映射)

  • A设备打开路由转发
• [root@centos-01 ~]# echo "1" > /proc/sys/net/ipv4/ip_forward

更改内核设置,打开路由转发功能,默认值是0.设置成1则打开。

  • 在A设备的nat表中增加两条规则(增加之前需要清空nat表中的规则)
• [root@centos-01 ~]# iptables -t nat -A PREROUTING -d 192.168.159.128 -p tcp --dport 1122 -j DNAT --to 192.168.100.100:22
 [root@centos-01 ~]# iptables -t nat -A POSTROUTING -s 192.168.100.100 -j SNAT --to 192.168.159.128
  • 将B设备的网关设置成A设备的ens37的IP

完成之后,B可以连接外网,还可以使用远程通过连接A的1122端口来进行远程连接。