Fork me on GitHub

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

 

posted @ 2021-06-04 09:19  Alex-Lzy  阅读(275)  评论(0编辑  收藏  举报