iptables实现网络防火墙
iptables/netfilter网络防火墙:
(1) 充当网关
(2) 使用filter表的FORWARD链
192开头的IP地址模拟内网,使用的是虚拟机中的NAT模式,172开头的IP地址这里充当外网IP,使用的是桥接
172.16.8.78 外网IP地址
192.168.1.7 内网IP地址
充当网关, 将主机名设置为Firewalld,只是为了区分清楚
hostnamectl set-hostname Firewalld
192.168.1.6上修改网卡配置,将其网关指定到192.168.1.7(NAT)
vim /etc/sysconfig/network-scripts/ifcfg-eth0 DEVICE=eth0 NAME=eth0 BOOTPROTO=static PREFIX=24 ONBOOT=yes NM_CONTROLLED=yes IPADDR=192.168.1.6 GATEWAY=192.168.1.7
172.16.8.49 充当外网客户端将其网关设置为172.16.8.78,这个IP地址和192.168.1.7是同一个机器,只不过这个是外网地址
vim /etc/sysconfig/network-scripts/ifcfg-ens33 TYPE=Ethernet PROXY_METHOD=none BROWSER_ONLY=no BOOTPROTO=static DEFROUTE=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_FAILURE_FATAL=no IPV6_ADDR_GEN_MODE=stable-privacy NAME=ens33 UUID=7bc25b67-d129-5cd8-8ccc-90eaa29767fb DEVICE=ens33 ONBOOT=yes IPADDR=172.16.8.49 NETMASK=255.255.254.0 GATEWAY=172.16.8.78
一、在192.168.1.7上修改配置
vim /etc/sysctl.conf net.ipv4.ip_forward=1
使其生效
sysctl -p
此时在192.168.1.6和172.16.8.49上互拼对方都是可以访问的
二、设置允许192网段的IP地址可以ping到172网段,172网段ping不到192网段,也可以理解为从内网可以ping到外网,外网ping不到内网
1、在网关主机192.168.1.7IP地址的主机上设置iptables ,穿过这个主机的所以在FORWARD上设置,拒绝所有(默认accept)
iptables -A FORWARD -j REJECT
这时192.168.1.6和172.16.8.49 两台主机是不通的
响应报文是0,请求报文类型是8
2、在上一条命令前添加一条新的记录 ,直接通过-A追加的话是不生效的,前面一条规则生效了,就不匹配后面一条规则了。
iptables -I FORWARD 1 -s 192.168.1.0/24 -p icmp --icmp-type 8 -j ACCEPT iptables -I FORWARD 1 -d 192.168.1.0/24 -p icmp --icmp-type 0 -j ACCEPT
插入一条几记录,1表示在第一条前面,-s 源地址 ,-p icmp 指定ICMP协议 ,-d目标地址。
3、删除掉其中0的记录,内网也就ping不到外网了,只有去没有回的记录了。
iptables -D FORWARD 1
4、不用0记录,启用状态跟踪
iptables -I FORWARD 1 -m state --state ESTABLISHED,RELATED -j ACCEPT
能ping出去,回来就算ESTABLISHED,现在就能ping通外网
5、允许内网访问外网的http服务
iptables -I FORWARD 2 -s 192.168.1.0/24 -p tcp --dport 80 -j ACCEPT
定义从内网的192.168.1.0/24这个网段,可以访问外网的80端口,因为第4条添加了状态跟踪就不需要考虑回来的问题了。
iptables -R FORWARD 2 -s 192.168.1.0/24 -p tcp -m multiport --dports 80,443 -j ACCEPT
这里直接替换掉刚刚的命令,80和443不是连续的端口,所以需要-m指定模块 multiport,也可以写两条命令
6、内部web服务器,外部可以访问
iptables -I FORWARD 2 -d 192.168.1.6 -p tcp --dport 80 -j ACCEPT
在forward 第2条钱插入一条,目标地址192.168.1.6 的80 端口,允许访问
插入在第几条没关系,只要在拒绝所有前面就行,
三、策略太多,新建一个自定义链,将你需要定义的规则放在一个自定义的链中,链接到系统自带的五个链中。
链管理:
-N:new, 自定义一条新的规则链
-X:delete,删除自定义的空的规则链
-P:Policy,设置默认策略;对filter表中的链而言,其默认策略有:
ACCEPT:接受
DROP:丢弃
-E:重命名自定义链;引用计数不为0的自定义链不能够被重命名,也不能被删除
1、新建自定义链,用于从局域网访问外网,链名TOINTERNET
iptables -N TOINTERNET
2、允许外网访问内网的192.168.1.0/24这个网段的80和443端口,将这条规则添加到TOINERNET这个自定义的链中
iptables -A TOINTERNET -s 192.168.1.0/24 -p tcp -m multiport --dport 80,443 -j ACCE PT
3、允许icmp这个类型的8 访问192.168.1.0/24 将这条记录添加到TOINTERNET这个自定义链中
iptables -A TOINTERNET -s 192.168.1.0/24 -p icmp --icmp-type 8 -j ACCEPT
4、将刚刚创建的链关联到forward链中
iptables -I FORWARD 2 -j TOINTERNET
在foreword第二条添加了一个TOINERNET规则(类似于函数和调用函数的关系)
5、在TOINTERNET替换掉第一条规则 ,允许22,80,444访问
iptables -R TOINTERNET 1 -s 192.168.1.0/24 -p tcp -m multiport --dport 22,80,443 -j ACCEPT
自定义链的好处,在forward规则中更清晰,如果需要更改对应的规则,不需要修改forward中的规则,直接修改对应的链即可
四、删除自定义链
直接删除链是删除不了的
1、取消关联,找到FORWARD中关联的链,删除,我这里是第2条
iptables -D FORWARD 2
2、清空TOINTERNET 链
iptables -F TOINTERNET
3、删除TOINTERNET链
iptables -X TOINTERNET