1.防火墙种类及使用说明
1.1 防火墙种类
-
硬件 【访问量巨大可以选硬件防火墙】
-
三层路由器:H3C 华为 Cisco(思科)
-
深信服
-
-
软件 【推荐iptables,大部分场景都 可用】
-
iptables 【写入到linux内核中】
-
firewalld 【从CentOS 7开始】
-
-
云防护墙 【公司使用的公有云,推荐使用这些服务】
-
阿里云:安全组(部分的iptables功能),态势感知(云安全中心)
-
-
-
阿里云:安全组
-
1.2 防火墙的作用和目标
-
# 防火墙的作用 1.网站入口的安全防护机制. 数据的过滤工具 2.符合规则的可以进入 3.不符合的,拒绝在外 # 防火墙的目标 通过iptables实现对ip或端口开启或禁止 通过防火墙nat功能实现:共享上网 通过防火墙nat功能实现:端口映射
2.iptables防火墙基础
-
防火墙处理用户请求的流程
-
四表五链
2.1 iptables防火墙基本名词
-
1.容器: 瓶子 罐子 存放东西 2.表(table): 存放链的容器,防火墙最大概念 3.链(chain): 存放规则的容器 4.规则(policy): 准许或拒绝规则 ,未来书写的防火墙条件就是各种防火墙规则
-
Netfilter 表(tables) 链(chains) 规则(Policy) 一栋楼 楼里的房子 房子里的柜子 柜子里衣服,摆放规则
2.2 防火墙如何处理用户请求的规则
-
工作流程小结: 1. 防火墙是层层过滤的,实际是按照配置规则的顺序从上到下,从前到后进行过滤的 2. 如果匹配成功规则,即明确表示是拒绝(DROP)还是接收(ACCEPT),数据包就不再向下匹配 新的规则 3. 如果规则中没有明确表明是阻止还是通过的,也就是没有匹配规则,向下进行匹配,直到匹配 默认规则得到明确的阻止还是通过 4. 防火墙的默认规则是所有规则都匹配完才会匹配的。
2.3 iptables防火墙-四表五链
1. 四表五链
-
四表:filter 表 nat表 raw表 mangle表
-
五链: INPUT OUTPUT FORWARD PREROUTING POSTROUTING
-
四表 五链 应用 filter表 INPUT ,OUTPUT ,FORWARD 防火墙功能,过滤功能 nat表 PREROUTING,POSTROUTING,OUTPUT 共享上网,端口映射 raw表 了解 mangle表 了解
2. 表链的请求关系
3. 表的规则
3.iptables常用参数与环境准备
3.1 常用参数
-
iptables参数 含义 -t 指定表,必须是【filter 表 nat表 raw表 mangle表】中的一个。如果不指定此选项,默认的是 filter 表 -nL 查看表中链与规则 -I (insert) 把规则插入到所有规则之前。 拒绝类规则 -A (append) 把规则追加到所有规则之后 -D 删除规则 -s --source 指定源ip地址 -d --destination 指定目标ip地址 -p protocal 指定协议 tcp,udp,icmp…… --dport 目标端口 (destination)指定端口 加上协议 -p tcp --sport 源端口 (source) 源 -m 指定模块,multiport模块 -j 指定规则准许,拒绝 ACCEPT,DROP,REJECT DROP REJECT拒绝 DROP把数据丢掉 不会返回信息给用户 REJECT 拒绝 返回拒绝信息 -F 清空指定表中所有规则 -x 删除用户自定义链 -z 链的计数器清零(数据包计数器与数据包字节计数器) -i input 输入的时候 从哪个网卡进来 -o ouput 输出的时候 从哪个网卡出去
3.2 iptables环境准备
-
1.安装iptables管理工具,systemctl管理。 root@web03 16:38:40 ~ # yum install -y iptables-services root@web03 16:53:37 ~ # rpm -ql iptables-services /etc/sysconfig/ip6tables /etc/sysconfig/iptables # 防火墙的配置文件 /usr/lib/systemd/system/ip6tables.service /usr/lib/systemd/system/iptables.service # 防火墙服务配置文件(命令) 2.关闭firewalld root@web03 16:40:01 ~ # systemctl stop firewalld root@web03 16:40:01 ~ # systemctl disable firewalld 3.启动防火墙并加入开机自启 root@web03 16:40:01 ~ # systemctl start iptables.service root@web03 16:40:42 ~ # systemctl enable iptables.service 4.加载防火墙内核选项并写入到开机自启动/etc/rc.d/rc.local root@web03 17:01:30 ~ # modprobe ip_tables root@web03 17:01:37 ~ # modprobe iptable_filter root@web03 17:01:40 ~ # modprobe iptable_nat root@web03 17:01:45 ~ # modprobe ip_conntrack root@web03 17:01:48 ~ # modprobe ip_conntrack_ftp root@web03 17:01:54 ~ # modprobe ip_nat_ftp root@web03 17:01:57 ~ # modprobe ipt_state # 加入开机自启文件 cat >>/etc/rc.local<<EOF modprobe ip_tables modprobe iptable_filter modprobe iptable_nat modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ip_nat_ftp modprobe ipt_state EOF # 给/etc/rc.d/rc.local可执行权限 root@web03 17:03:22 ~ # chmod +x /etc/rc.d/rc.local 5.检查加载的内容 root@web03 16:55:08 ~ # lsmod |egrep 'filter|nat|ipt' nf_nat_ftp 12809 0 nf_conntrack_ftp 18478 1 nf_nat_ftp iptable_nat 12875 0 nf_nat_ipv4 14115 1 iptable_nat nf_nat 26583 2 nf_nat_ftp,nf_nat_ipv4 ipt_REJECT 12541 2 nf_reject_ipv4 13373 1 ipt_REJECT nf_conntrack 139264 7 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,xt_conntrack,nf_conntrack_ftp,nf_conntrack_ipv4 iptable_filter 12810 1 ip_tables 27126 2 iptable_filter,iptable_nat libcrc32c 12644 3 xfs,nf_nat,nf_conntrack 6.查看防火墙当前的规则 root@web03 17:04:22 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22 REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain FORWARD (policy ACCEPT) target prot opt source destination REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited Chain OUTPUT (policy ACCEPT) target prot opt source destination 7.清空规则 iptables -F #清空指定表中所有规则。 iptables -X #删除自定义链。 iptables -Z #清空统计信息。 root@web03 17:04:29 ~ # iptables -F root@web03 17:07:08 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 8.书写规则: iptables -t 表名 -A/I/D/R 规则链名/规则号 -i/o 网卡名 -p 协议名 -s 源IP/源子网 -- sport 源端口 -d 目标IP/目标子网 -- dport 目标端口 -j 动作
4. FILTER表 (iptables默认的表)
4.1 filter表作用
-
1.不指定任何表的情况下,默认使用filter表 2.filter表实现的就是防火墙功能,屏蔽或准许 端口 IP 访问 3.阿里云安全组,相当于是防火墙的filter表。
4.2 filter表包含的链
-
filter表 主要和主机自身相关,真正负责主机防火墙功能的(过滤流入流出主机的数据包) 【应用:主机防火墙】 INPUT 负责过滤所有目标地址是本机地址的数据包 通俗来说:就是过滤进入主机的数据包 OUTPUT 处理所有源地址是本机地址的数据包 通俗的讲:就是处理从主机发出去的数据包 FORWARD 负责转发流经主机的数据包。起转发的作用,和NAT关系很大,后面会详细介绍 LVS NAT模式,net.ipv4.ip_forward=0
4.3 filter表实践
1. 禁止用户访问22端口
-
# 禁止用户访问22端口 root@web03 17:18:40 ~ # iptables -t filter -I INPUT -p tcp --dport 22 -j DROP # 查看防火墙当前的规则 root@web03 17:07:08 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 发现Xshell连不上了,需要删除刚才添加的规则 方法一: iptables -t filter -D INPUT 1 方法二: iptables -t filter -D INPUT -p tcp --dport 22 -j DROP # 再次连接Xshell发现可以了
2. 禁止IP10.0.0.200访问
-
# 禁止IP10.0.0.200主机访问 root@web03 17:38:16 ~ # iptables -t filter -I INPUT -s 10.0.0.200/32 -j DROP root@web03 17:38:31 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- 10.0.0.200 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 用10.0.0.200连接web03的10.0.0.9测试 root@SSH 17:36:55 ~ # ssh 10.0.0.9 # 发现卡住了不通 # 再用ping命令测试 root@SSH 17:45:15 ~ # ping 10.0.0.9 PING 10.0.0.9 (10.0.0.9) 56(84) bytes of data. # 发现也不通 # 测试ping172.16.1.9 root@SSH 17:46:09 ~ # ping 172.16.1.9 # 发现可以通 PING 172.16.1.9 (172.16.1.9) 56(84) bytes of data. 64 bytes from 172.16.1.9: icmp_seq=1 ttl=64 time=0.366 ms 64 bytes from 172.16.1.9: icmp_seq=2 ttl=64 time=0.345 ms # 清除防火墙规则 root@web03 17:47:30 ~ # iptables -D INPUT 1
3. 禁止IP10.0.0.200访问22端口
-
# 禁止IP10.0.0.200访问22端口 root@web03 17:47:57 ~ # iptables -t filter -I INPUT -s 10.0.0.200 -p tcp --dport 22 -j DROP # 查看防火墙规则 root@web03 17:59:32 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 10.0.0.200 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 用10.0.0.200主机 ssh连接 10.0.0.9发现连接不上 # 删除防火墙规则 root@web03 18:02:16 ~ # iptables -D INPUT 1
4. 屏蔽10.0.0.0/24访问8888端口
-
# 屏蔽10.0.0.0/24访问8888端口 1.先模拟一个8888端口 root@web03 18:10:31 ~ # yum -y install nc -------------------------------------------- nc ncat netcat nc -l -l 使用监听模式,管控传入的资料 -v 显示指令执行过程。 -k 接受多个连接请求 -------------------------------------------- root@web03 19:04:20 ~ # nc -l 8888 模拟监听一个8888端口 root@web03 18:14:11 ~ # netstat -tnulp Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:8888 0.0.0.0:* LISTEN 31818/nc 2.测试8888端口,测试成功 [c:\~]$ telnet 10.0.0.9 8888 Connecting to 10.0.0.9:8888... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. oldboy haha root@web03 19:04:20 ~ # nc -l 8888 oldboy haha 3.屏蔽10.0.0.0/24访问8888端口 root@web03 19:14:09 ~ # iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8888 -j DROP root@web03 19:17:13 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 10.0.0.0/24 0.0.0.0/0 tcp dpt:8888 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 4.测试连接,发现连不上了 [c:\~]$ telnet 10.0.0.9 8888 Connecting to 10.0.0.9:8888...
5. 只允许指定网段连入(允许10.0.0.0网段)
-
1.方法一:这里用到!取反 # 只允许指定网段连入(允许10.0.0.0网段) root@web03 19:42:10 ~ # iptables -I INPUT ! -s 10.0.0.0/24 -j DROP root@web03 19:43:10 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP all -- !10.0.0.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 连接测试 root@web03 19:44:32 ~ # ping 172.16.1.9 PING 172.16.1.9 (172.16.1.9) 56(84) bytes of data. root@web03 19:44:54 ~ # ping 10.0.0.9 PING 10.0.0.9 (10.0.0.9) 56(84) bytes of data. 64 bytes from 10.0.0.9: icmp_seq=1 ttl=64 time=0.151 ms 64 bytes from 10.0.0.9: icmp_seq=2 ttl=64 time=0.058 ms 2.方法二:修改匹配默认规则为DROP,只允许10.0.0.0/24的访问规则 # 添加接受10.0.0.0/24网段访问 root@web03 19:49:30 ~ # iptables -I INPUT -s 10.0.0.0/24 -j ACCEPT root@web03 19:51:28 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT all -- 10.0.0.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 修改匹配默认规则为DROP root@web03 19:51:29 ~ # iptables -P INPUT ACCEPT root@web03 19:53:52 ~ # iptables -nL Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- 10.0.0.0/24 0.0.0.0/0 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 访问测试 root@SSH 19:54:47 ~ # ssh 172.16.1.9 无法访问 root@SSH 19:55:07 ~ # ssh 10.0.0.9 可以访问 root@10.0.0.9's password: Last login: Mon Jul 25 19:54:42 2022 from 10.0.0.200 root@web03 19:55:09 ~ #
6. 只允许10.0.0.200通过22端口访问
-
1.采用取反的方式允许22端口访问 【先允许再拒绝测试默认匹配顺序】 root@web03 20:05:42 ~ # iptables -I INPUT -s 10.0.0.200/32 -p tcp ! --dport 22 -j DROP root@web03 20:06:25 ~ # iptables -A INPUT -s 10.0.0.200/32 -p tcp --dport 22 -j DROP root@web03 20:06:57 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 10.0.0.200 0.0.0.0/0 tcp dpt:!22 DROP tcp -- 10.0.0.200 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 2.连接测试 [c:\~]$ telnet 10.0.0.9 22 # 发现连不上了 Connecting to 10.0.0.9:22... 3.结论 如果用取反的话,下面出现参数相同但是动作相反的规则,还是会继续向下匹配 如果不用取反的话,则默认按照第一条规则匹配,即使下面有参数相同但是动作相反的规则。
7. 指定多个端口
-
1.当允许连接的端口不相邻时 root@web03 20:56:59 ~ # iptables -I INPUT -p tcp -m multiport --dport 80,443,22 -j ACCEPT root@web03 20:58:29 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443,22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 测试均可以连接 2.当允许连接的端口相邻时 root@web03 21:00:23 ~ # iptables -I INPUT -p tcp --dport 888:999 -j ACCEPT root@web03 21:01:40 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:888:999 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 80,443,22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 测试链接成功 root@web03 21:00:25 ~ # nc -l 899 [c:\~]$ telnet 10.0.0.9 899 Connecting to 10.0.0.9:899... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. root@web03 21:02:47 ~ # nc -l 999 [c:\~]$ telnet 10.0.0.9 999 Connecting to 10.0.0.9:999... Connection established. To escape to local shell, press 'Ctrl+Alt+]'.
8. 匹配ICMP类型
-
ICMP(Internet Control Message Protocol)Internet控制报文协议 【主要是用来ping测试】
-
通过防火墙规则 控制是否可以ping
-
1.设置ICMP规则不让别人ping自己 root@web03 21:27:21 ~ # iptables -I INPUT -p icmp --icmp-type 8 -j DROP root@web03 21:27:27 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 2.测试是否可以ping通10.0.0.9 [c:\~]$ ping 10.0.0.9 正在 Ping 10.0.0.9 具有 32 字节的数据: 请求超时。 -------------------------------------------------------------------------------------- 3.设置规则无法ping通外网,但是正常连接上网 root@web03 22:06:49 ~ # iptables -I INPUT -p icmp --icmp-type 8 -j DROP root@web03 22:10:59 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 0 DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 4.测试是否可以ping通www.baidu.com root@web03 22:12:06 ~ # ping www.baidu.com PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data. # 发现无法ping通www.baidu.com
-
通过内核参数 控制 禁止被ping
-
1.通过内核参数控制不让别人ping通自己 root@web03 22:18:44 ~ # echo 1 >/proc/sys/net/ipv4/icmp_echo_ignore_all root@web03 22:18:44 ~ # net.ipv4.icmp_echo_ignore_all=1 写入到 /etc/sysctl.conf 2.可以让别人ping通自己 root@web03 22:18:44 ~ # echo 0 >/proc/sys/net/ipv4/icmp_echo_ignore_all root@web03 22:18:44 ~ # net.ipv4.icmp_echo_ignore_all=0 写入到 /etc/sysctl.conf
9. 匹配网络状态【TCP/IP连接状态】
-
网络状态 参数 含义 -m state --state NEW 已经或将启动新的连接 ESTABLISHED 已建立的连接 RELATED 正在启动的新连接 INVALID 非法或无法识别的 -
# 指定匹配规则,匹配网络状态 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
10. 限制并发及速率
-
-m limit 限制模块
-
-m limit --limit 10/minute #每分钟只能有10个数据包 每6秒生成
-
-m limit --limit n/{second/minute/hour}: 指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时
-
-m limit --limit 10/minute --limit-burst 5 每6秒释放工牌 给别人使用 #10个数据包 前5个 1个1个工牌 从第6个开始 每6秒 才能释放1个工牌
-
--limit-burst [n]:在同一时间内允许通过的请求”n”为数字,不指定默认为5
-
# ping icmp 协议 进行测试 iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -P INPUT DROP # ping 测试 root@SSH 22:16:29 ~ # ping 10.0.0.9 PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data. 64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.240 ms 64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.376 ms 64 bytes from 10.0.0.61: icmp_seq=3 ttl=64 time=0.474 ms 64 bytes from 10.0.0.61: icmp_seq=4 ttl=64 time=0.693 ms 64 bytes from 10.0.0.61: icmp_seq=5 ttl=64 time=2.43 ms 64 bytes from 10.0.0.61: icmp_seq=7 ttl=64 time=0.351 ms 64 bytes from 10.0.0.61: icmp_seq=13 ttl=64 time=0.869 ms 64 bytes from 10.0.0.61: icmp_seq=19 ttl=64 time=0.482 ms 64 bytes from 10.0.0.61: icmp_seq=25 ttl=64 time=0.378 ms # 前5个一次/s 后面一次/6s
11. 防火墙规则的保存与恢复
-
命令 含义 iptables-save 防火强规则保存【默认输出到屏幕】 iptables-restore 防火强规则导入 -
重启继续生效需要写入到/etc/sysconfig/iptables文件中
-
1.将规则带备份导入到配置文件 root@web03 22:45:12 ~ # iptables -I INPUT -s 172.16.1.0/24 -p tcp --dport 22 -j DROP root@web03 22:45:56 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 172.16.1.0/24 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 2.导入规则到配置文件 root@web03 22:46:55 ~ # iptables-save >/etc/sysconfig/iptables root@web03 22:47:19 ~ # cat /etc/sysconfig/iptables # Generated by iptables-save v1.4.21 on Mon Jul 25 22:47:19 2022 *nat :PREROUTING ACCEPT [407:33962] :INPUT ACCEPT [127:12818] :OUTPUT ACCEPT [166:12418] :POSTROUTING ACCEPT [166:12418] COMMIT # Completed on Mon Jul 25 22:47:19 2022 # Generated by iptables-save v1.4.21 on Mon Jul 25 22:47:19 2022 *filter :INPUT ACCEPT [93:7420] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [62:6908] -A INPUT -s 172.16.1.0/24 -p tcp -m tcp --dport 22 -j DROP # 规则已写入 COMMIT # Completed on Mon Jul 25 22:47:19 2022 3.重启服务,并清空规则 root@web03 22:48:21 ~ # systemctl restart iptables root@web03 22:48:36 ~ # iptables -D INPUT 1 root@web03 22:48:47 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 4.从备份文件中导出规则 root@web03 22:48:49 ~ # iptables-restore </etc/sysconfig/iptables root@web03 22:50:08 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination DROP tcp -- 172.16.1.0/24 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination # 发现规则又回来了 补充: 也可以拷贝别人的配置文件来导入规则
4.4 filter表小结
1. filter主要作用
-
- 封ip 端口 网段 - 禁止ping - 限制速度和并发 - iptables filter表 功能可以在云服务器使用
2. filter表企业应用
-
# 在企业中,为了降低网站风险,我们可以把filter表的默认规则由ACCEPT改为DROP,然后再放行我们自己的ip和端口即可,这样别人就无法访问了 1.添加允许我们自己的ip和端口范文规则到filter表 root@web03 23:10:48 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.0.0.0/24 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 2.将默认规则改为DROP root@web03 23:10:51 ~ # iptables -P INPUT DROP root@web03 23:12:18 ~ # iptables -nL Chain INPUT (policy DROP) target prot opt source destination ACCEPT tcp -- 10.0.0.0/24 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination 3.这样使用ssh连接就只能通过10.0.0.0段的ip了 root@SSH 22:16:29 ~ # ssh 172.16.1.9 # 连接失败 ^C root@SSH 23:13:34 ~ # ssh 10.0.0.9 # 连接成功 root@10.0.0.9's password: Last login: Mon Jul 25 22:06:41 2022 from 10.0.0.1 root@web03 23:13:41 ~ # # 测试完记得改回去 root@web03 23:14:44 ~ # iptables -nL Chain INPUT (policy ACCEPT) target prot opt source destination ACCEPT tcp -- 10.0.0.0/24 0.0.0.0/0 tcp dpt:22 Chain FORWARD (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
3. 常用规则汇总
-
root@web03 23:14:45 ~ # iptables-save # Generated by iptables-save v1.4.21 on Mon Jul 25 23:18:28 2022 *nat :PREROUTING ACCEPT [8:1011] :INPUT ACCEPT [4:599] :OUTPUT ACCEPT [10:628] :POSTROUTING ACCEPT [10:628] COMMIT # Completed on Mon Jul 25 23:18:28 2022 # Generated by iptables-save v1.4.21 on Mon Jul 25 23:18:28 2022 *filter :INPUT ACCEPT [6:521] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [22:2022] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT # 放行ssh端口 添加来源IP地址 -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT # 放行业务接口 -A INPUT -i lo -j ACCEPT # 放行回环测试接口 -A INPUT -s 10.0.0.0/24 -j ACCEPT -A INPUT -s 172.16.1.0/24 -j ACCEPT # 放心所有内网ip -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT -A OUTPUT -o lo -j ACCEPT -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 根据需求放行状态 COMMIT # Completed on Mon Jul 25 23:18:28 2022
5.NAT表
5.1 NAT表作用
-
1.内网服务器共享上网 2.端口映射/转发
5.2 NAT表包含的链
-
nat表 作用 应用场景 PREROUTING 用户请求到达防火墙后先经历nat表的PREROUTING链处理,修改请求的ip或端口 端口映射/转发 POSTROUTING 用户请求离开防火墙的时候经历nat表的POSTROUTING链处理,修改ip 共享上网(无公网服务器访问外网) OUTPUT 转发出口
5.3 SNAT共享上网
1. 内部服务器共享上网原理
-
使用了防火墙的NAT表的POSTROUTING链对数据包中的源ip进行修改,把数据包中的源ip修改为公网ip
2. 共享上网原理图
3. 实战
-
0.实战要求 1)web01的网关要设置为web03的防火墙172.16.1.9 2)关闭web02的eth0网卡 3)nat表的POSTROUTING链对内网数据进行伪装 4)开启ip_forword功能,ip转换功能 ------------------------------------------------------------------------------------------------------ 1.web01主机环境设置 # 设置web01的eth1网卡网关为web03的内网ip root@web01 08:44:46 network-scripts # vim ifcfg-eth1 TYPE=Ethernet BOOTPROTO=none NAME=eth1 DEVICE=eth1 ONBOOT=yes IPADDR=172.16.1.7 PREFIX=24 GATEWAY=172.16.1.9 网关设置为web03的内网ip DNS1=223.5.5.5 # 关闭web01的eth0网卡 root@web01 08:44:46 network-scripts # vim ifcfg-eth0 TYPE=Ethernet BOOTPROTO=none NAME=eth0 DEVICE=eth0 ONBOOT=no IPADDR=10.0.0.7 PREFIX=24 GATEWAY=10.0.0.2 DNS1=223.5.5.5 # 重启web01的网卡并查看ip root@web01 08:46:10 network-scripts # systemctl restart network root@web01 08:48:37 ~ # ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000 link/ether 00:0c:29:91:91:2e brd ff:ff:ff:ff:ff:ff 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether 00:0c:29:91:91:38 brd ff:ff:ff:ff:ff:ff inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fe91:9138/64 scope link valid_lft forever preferred_lft forever # 查看路由表 root@web01 08:48:40 ~ # route -n Kernel IP routing table Destination Gateway Genmask Flags Metric Ref Use Iface 0.0.0.0 172.16.1.9 0.0.0.0 UG 0 0 0 eth1 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1 172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1 # ping外网测试 root@web01 08:52:37 ~ # ping 114.114.114.114 PING 114.114.114.114 (114.114.114.114) 56(84) bytes of data. # 测试web01已经上不了外网了 ------------------------------------------------------------------------------------------------------ 2.web03设置防火墙规则 # 添加共享上网规则到web03的NAT表 root@web03 08:58:03 ~ # iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.9 root@web03 08:58:23 ~ # iptables -t nat -nL 【查看NAT表】 Chain PREROUTING (policy ACCEPT) target prot opt source destination Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.9 #用户的请求通过nat表的POSTROUTING链进行处理。处理的时候把源ip是172.16.1.0/24网段的ip 都伪装成为10.0.0.9 (修改的是源IP) # 修改防火墙服务器的内核参数开启ip_forward功能 root@web03 08:59:38 ~ # vim /etc/sysctl.conf root@web03 09:06:30 ~ # tail -2 /etc/sysctl.conf net.ipv4.icmp_echo_ignore_all = 0 net.ipv4.ip_forward = 1 # #开启内核转发功能。请求到达eth1网卡,转发到eth0网卡,需要开启内核转发。 # 加载内核 root@web03 09:06:40 ~ # sysctl -p net.ipv4.icmp_echo_ignore_all = 0 net.ipv4.ip_forward = 1 3.到web01主机测试是否可以ping通外网 root@web01 09:06:40 ~ # ping www.baidu.com PING www.a.shifen.com (110.242.68.3) 56(84) bytes of data. 64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=1 ttl=127 time=12.4 ms 64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=2 ttl=127 time=11.5 ms 64 bytes from 110.242.68.3 (110.242.68.3): icmp_seq=3 ttl=127 time=12.2 ms # web01可以上网了
4. 小结
-
1.内网服务器,访问公网的案例 2.原理:iptables nat表POSTROUTING链实现 SNAT 3.防火墙开启内核转发,后端节点网关指向防火墙
5.4 DNAT端口转发
1. DNAT端口转发原理
-
外部用户访问内网服务器或服务端某个端口
-
1.用户请求到达一个防火墙后,通过nat表的PREROUTING链处理请求 2.用用户请求的ip+端口(10.0.0.9:9000)转发到某台内网服务期的ip+端口 (172.16.1.7:22)
2. DNAT端口转发原理图
3. 实战
-
0.实战要求 【连接10.0.0.9的9000端口直接转发到钱2.16.1.7的22端口】 1)后端这些无公网的服务器,他们的网关要设置为防火墙172.16.1.61 2)关闭eth0网卡 3)配置防火墙,nat表的PRETROUTING链对内网数据进行伪装 4)开启ip_forword功能,ip转换功能 ------------------------------------------------------------------------------------------------------- 1.web03设置防火墙规则 root@web03 09:38:57 ~ # iptables -t nat -A PREROUTING -d 10.0.0.9 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22 root@web03 09:44:17 ~ # iptables -t nat -nL Chain PREROUTING (policy ACCEPT) target prot opt source destination DNAT tcp -- 0.0.0.0/0 10.0.0.9 tcp dpt:9000 to:172.16.1.7:22 Chain INPUT (policy ACCEPT) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination Chain POSTROUTING (policy ACCEPT) target prot opt source destination SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.9 ------------------------------------------------------------------------------------------------------ 3.再本地windows连接10.0.0.9:9000测试 [c:\~]$ ssh 10.0.0.9 9000 Connecting to 10.0.0.9:9000... Connection established. To escape to local shell, press 'Ctrl+Alt+]'. Last login: Tue Jul 26 09:09:03 2022 from 10.0.0.9 root@web01 09:45:56 ~ # # 连接成功 root@web02 09:47:34 ~ # ssh 10.0.0.9 -p9000 The authenticity of host '[10.0.0.9]:9000 ([10.0.0.9]:9000)' can't be established. ECDSA key fingerprint is SHA256:LbUlfXUR6bxgVQ4caeFc77yXbxJtNMHdElVbXZV3ybg. ECDSA key fingerprint is MD5:e8:cf:9d:e8:43:9b:86:2d:52:a4:b9:4d:3b:d7:13:2d. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '[10.0.0.9]:9000' (ECDSA) to the list of known hosts. root@10.0.0.9's password: Last login: Tue Jul 26 09:45:55 2022 from 10.0.0.1 root@web01 09:47:51 ~ # # 连接成功