浅谈linux网络防火墙
1️⃣ iptables/netfilter网络防火墙
- 充当网关
- 使用filter表的FORWARD链
- 注意的问题:
- 请求-响应报文均会经由FORWARD链,要注意规则的方向性
- 如果要启用conntrack机制,建议将双方向的状态为ESTABLISHED的报文直接放行
2️⃣ 实验:模拟网络防火墙实现内外网分离
▶ 环境搭配
- 1号内网机器配置
ip route flush dev eth0
ipconfig eth0 192.168.39.14 / 指定内网地址
ip route add 192.168.39.0/24 dev eth0 / 创建路由表
ip route add default via 192.168.39.39 dev eth0 / 网关指向防火墙机器
yum -y install httpd
systemctl start httpd
echo "welcome to lanserver" > /var/www/html/index.html
- 配置2号防火墙机器
/ 查看路由转发是否开启
[root@centos7 ~]#sysctl -a | grep ip_forward
net.ipv4.ip_forward = 0
net.ipv4.ip_forward_use_pmtu = 0
/ 永久开启写入文件
vim /etc/sysctl.conf
net.ipv4.ip_forward=1
/ 加载生效
[root@centos7 ~]#sysctl -p
net.ipv4.ip_forward = 1
- 配置3号互联网机器
yum -y install vsftpd httpd
systemctl start vsftpd httpd
echo "weclome to netserver" > /var/www/html/index.html
vim /etc/sysconfig/netwerk-scripts/ifcfg-ens33
TYPE="Ethernet"
BOOTPROTO=static
DEFROUTE="yes"
NAME=eth0
DEVICE=eth0
ONBOOT="yes"
PREFIX=16
IPADDR=172.20.1.248
GATEWAY=172.20.1.247 / 网关指向firewall
DNS1=180.76.76.76
/ 加载启用网卡配置
nmcli con reload
nmcli con up eth0
/ 测试是否访问内网机器
[root@netserver ~]#ping -c3 192.168.39.14
PING 192.168.39.14 (192.168.39.14) 56(84) bytes of data.
64 bytes from 192.168.39.14: icmp_seq=1 ttl=63 time=1.71 ms
64 bytes from 192.168.39.14: icmp_seq=2 ttl=63 time=5.63 ms
64 bytes from 192.168.39.14: icmp_seq=3 ttl=63 time=1.50 ms
--- 192.168.39.14 ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 2004ms
rtt min/avg/max/mdev = 1.503/2.951/5.635/1.899 ms
▶ 开始配置防火墙规则
- 允许内网(192.168.39.0/24)的主机访问外网(172.20.0.0/16)的ftp, ssh服务,但外网的主机不允许访问内网主机的所有服务
/ 加载ftp模块
lsmod | grep ftp
modprobe nf_conntrack_ftp
/ 定义要求所需要的规则
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -s 192.168.39.0/24 -p tcp --dport 21:22 -j ACCEPT
iptables -A FORWARD -j REJECT
-
内网访问互联网ftp,ssh服务,均成功
-
外网访问内网任何服务,全部拒绝
-
增加外网访问内网的httpd服务,其他服务拒绝
/ 定义要求所需要的规则
iptables -I FORWARD 2 -p tcp --dport 80 -j ACCEPT
3️⃣ NAT表
▶1 NAT基本概念
-
NAT:network address translation
支持链:PREROUTING,INPUT,OUTPUT,POSTROUTING
请求报文:修改源/目标IP,由定义如何修改
响应报文:修改源/目标IP,根据跟踪机制自动实现 -
SNAT:source NAT
支持链:POSTROUTING, INPUT
让本地网络中的主机通过某一特定地址访问外部网络,实现地址伪装
请求报文:修改源IP -
DNAT:destination NAT
支持链:PREROUTING, OUTPUT
把本地网络中的主机上的某服务开放给外部网络访问(发布服务和端口映射),但隐藏真实IP
请求报文:修改目标IP -
PNAT:port NAT,端口和IP都进行修改,发生在多台本地网络主机的端口冲突时
▶2 SNAT配置:通过net表的target配置
- SNAT:基于nat表的target,适用于固定的公网IP
- SNAT选项:
--to-source [ipaddr[-ipaddr]][:port[-port]]
--random
- MASQUERADE:动态IP,如拨号网络
🌐 实验:通过SNAT实现本地网络主机访问外网,而不会暴露本地网络主机IP
- 当外网IP为固定IP时,就是防火墙连接互联网的地址
iptables -t nat -A POSTROUTING -s 192.168.39.0/24 -j SNAT --to-source 172.20.1.247
- 当外网IP为动态IP时
iptables -t nat -A POSTROUTING -s 192.268.39.0/24 -j MASQUERADE
- 内网访问外网httpd
curl 172.20.1.248
外网服务器httpd服务日志显示源地址为172.20.1.247,实现了SNAT功能
▶3 DNAT配置:通过net表的target配置
- DNAT:nat表的target,适用于端口映射
- 格式:
DNAT --to-destination [ipaddr[-ipaddr]][:port[-port]]
🌐 实验:实现本地网络主机通过外网的指定网址提供http服务,
- 环境搭配:
外网指定IP:172.20.1.247,内网主机IP:192.168.39.14
外网IP端口80指向内网主机的80端口,外网IP端口8080指向内网主机的8000端口 - 配置内网主机多端口httpd服务
/ 创建目录生成访问页面
mkdir -p /data/website2
echo "welcome to LAN1" > /data/website1/index.html
echo "welcome to LAN2" > /data/website2/index.html
/ 编写配置文件
vim /etc/httpd/conf.d/test.conf
listen 8080
<virtualhost *:8080>
documentroot /data/website2/
<directory /data/website2>
allow from all / httpd2.2的写法
</directory>
</virtualhost>
httpd -t
service httpd restart
- 修改防火墙规则
/ 开放tcp 8080端口
iptables -I FORWARD 3 -p tcp --dport 8080 -j ACCEPT
/ 定义DNAT表
iptables -t nat -A PREROUTING -d 172.20.1.247 -p tcp --dport 80 -j DNAT --to-destination 192.168.39.14:80
iptables -t nat -A PREROUTING -d 172.20.1.247 -p tcp --dport 8080 -j DNAT --to-destination 192.168.39.14:8080
- 外网主机访问内网不同的端口,打开不同的web网页
- 内网主机httpd的访问日志
▶4 转发REDIRECT
- REDIRECT,是NAT表的target,
- 通过改变目标IP和端口,将接受的包转发至同一个主机的不同端口
- 可用于PREROUTING OUTPUT链
- 格式:REDIRECT --to-ports port[-port]
- 实验:实现将对主机80,8080端口的访问转发至主机的8081端口
/ 修改配置文件,增加一个8081端口主机
listen 8081
<virtualhost *:8081>
documentroot /data/website1/
<directory /data/website1>
allow from all / 注意:我这里用的是httpd2.2版本
</directory>
</virtualhost>
/ 制作访问页面
echo "welcome to lanserver 8081" > /data/website1/index.html
service httpd restart
/ 定义要求所需要的防火墙策略,注意这个是内网主机的端口转发
iptables -t nat -A PREROUTING -d 192.168.39.14 -p tcp -m multiport --dports 80,8080 -j REDIRECT --to-ports 8081
- 外网访问测试