需求:把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表应用
准备工作
- 准备两台虚拟机A、B
- A设备上两块网卡,分别为ens33(192.168.159.128),ens37(192.168.100.10),ens33可以上外网,ens44仅可以是内部网络。
- 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端口来进行远程连接。