当前位置:   article > 正文

【运维知识进阶篇】iptables防火墙详解(iptables执行过程+表与链概述+iptables命令参数+配置filter表规则+NAT表实现共享上网、端口转发、IP映射)

iptables

这篇文章给大家介绍下iptables防火墙,防火墙大致分三种,分别是硬件、软件和云防火墙。硬件的话部署在企业网络的入口,有三层路由的H3C、华为、Cisco(思科),还有深信服等等;软件的话一般是开源软件,写在网站内部,最常见的有iptables(写入Linux内核)和firewalld(CentOS7有的),云防火墙就是阿里云业务的防火墙安全组等等。

目录

名词解释

iptables执行过程

NetFilter框架

Linux服务器双网卡路由器

表与链

1、filter表

2、NAT表

3、Mangle表

环境准备及命令

iptables命令参数

配置filter表规则

1、禁止访问22端口

​编辑

2、封ip,屏蔽某个ip

3、禁止网段连入(禁止10.0.0.0/24网段访问 8888端口)

4、只允许指定网段连入(允许10.0.0.0网段)

​编辑

5、指定多个端口

6、匹配ICMP类型

7、匹配网络状态(TCP/IP连接状态)

8、限制并发及速率

9、防火墙规则的保存与恢复

10、filter表简单总结

企业中用法

1、ssh可以连接

2、设置允许本机lo通讯规则

3、配置默认规则及放行80,443端口

NAT表

1、实现共享上网

2、端口转发(端口映射)

3、IP映射

4、NAT表简单总结

iptables简单练习


名词解释

在介绍防火墙之前,我们先了解几个名词

容器:可以存放东西

(table):存放的容器

(chain):存放规则的容器

规则(policy):准许或拒绝规则

这几个像俄罗斯套娃那样环环相套!

iptables执行过程

NetFilter框架

最底层是网络接口层,网络接口层上面是网络层,网络层部署了NetFilter(网络过滤框架)

网络层上面部署了TCP、UDP传输层,这一层部署了Filter表、NAT表、Mangle表,表种存放要检查的条件和操作,这些都是内核层,再往上就是用户层,也就是应用层,可以设置iptables命令。

Linux服务器双网卡路由器

从物理层和数据链路层进入先通过PREROUTING链,进入路由判决,如果可以进入会通过INPUT链进入TCP、UDP,再进入应用层,由应用层再返回到TCP、UDP,通过OUTPUT链进入路由判决,再通过POSTROUTING链传输到物理层和数据链路层出来。

如果在路由判决那里不能进入的话,则会通过FORWARD链传输到出口的路由判决,在通过POSTROUTING链进入物理层和数据链路层传输出来。

表与链

iptables是4表5链,4表是filter表、nat表、raw表、mangle表,5链是input、pouput、forward、prerouting、postrouting

filter表有input链、output链、forward链

nat表有prerouting链、output链、postrouting链

mangle表有prerouting链、forward链、input链、output链、postrouting链

1、filter表

负责流量进出,屏蔽或准许端口IP

filter表

主要和主机自身相关,真正负责主机防火墙功能的(过滤流入与流出主机数据包)filter标识iptables默认使用的表,这个表定义了三个链。企业工作场景:主机防火墙

INPUT负责过滤所有目标地址是本机地址的数据包,通俗说就是过滤进入主机的数据包
FORWARD负责转发流经主机的数据包,起转发的作用,和NAT关系很大,有专门的LVS NAT模式,net.ipv4.ip_forward=0
OUTPUT处理所有源地址是本机地址的数据包,通俗说就是从主机发送出去的数据包

2、NAT表

双网卡的,负责接受到后转发,类似于路由器,可以实现NAT功能:共享上网(内网服务器上外网)、端口映射和ip映射

NAT

负责网络地址转换,即来源与目的IP地址和端口的转换。

应用:和主机本身无关,一般用于局域网共享上网或者特殊的端口转换服务

工作场景:

1、用于企业路由(zebra)或网关(iptables),共享上网(postrouting)

2、做内部外部IP地址一对一映射(dmz),硬件防火墙映射IP到内部服务器,ftp服务(prerouting)

3、web,单个端口的映射,直接映射80端口(prerouting),这个表定义了3个链,nat功能相当于网络的acl控制,和网络交换机acl类似。

OUTPUT和主机放出去的数据包有关,改变主机发出数据包的目的地址
PREROUTING

在数据包到达防火墙时,进行路由判断之前执行的规则,作用是改变数据包的目的地址、目的端口等

就是收信时,根据规则重写收件人的地址

例如:把公网IP映射到局域网的服务器上,如果是web服务,可以把80转换为局域网的服务器9000端口上10.0.0.61:80(目标端口)----nat----10.0.0.7:22

POSTROUTING

在数据包离开防火墙时进行路由判断之后执行的规则,作用是改变数据包的源地址,源端口等

写好发件人的地址,要让家人的回信时能够有地址可以回

例如:默认笔记本和虚拟机都是局域网地址,在出网的时候被路由器将源地址改为了公网地址

生产应用:局域网共享上网

3、Mangle表

存放头部信息

环境准备及命令

准备Ansible(10.0.0.61,172.16.1.61)和Web01(10.0.0.7、172.16.1.7)两台主机

安装iptables

[root@Ansible ~]# yum install -y iptables-services

查看iptables服务的配置文件

  1. [root@Ansible ~]# rpm -ql iptables-services
  2. /etc/sysconfig/ip6tables
  3. /etc/sysconfig/iptables #防火墙的配置文件
  4. /usr/lib/systemd/system/ip6tables.service
  5. /usr/lib/systemd/system/iptables.service #防火墙服务配置文件(命令)
  6. /usr/libexec/initscripts/legacy-actions/ip6tables
  7. /usr/libexec/initscripts/legacy-actions/ip6tables/panic
  8. /usr/libexec/initscripts/legacy-actions/ip6tables/save
  9. /usr/libexec/initscripts/legacy-actions/iptables
  10. /usr/libexec/initscripts/legacy-actions/iptables/panic
  11. /usr/libexec/initscripts/legacy-actions/iptables/save
  12. /usr/libexec/iptables
  13. /usr/libexec/iptables/ip6tables.init
  14. /usr/libexec/iptables/iptables.init

 将防火墙相关的模块、加载到内核中

  1. [root@Ansible ~]# modprobe ip_tables
  2. [root@Ansible ~]# modprobe iptable_filter
  3. [root@Ansible ~]# modprobe iptable_nat
  4. [root@Ansible ~]# modprobe ip_conntrack
  5. [root@Ansible ~]# modprobe ip_conntrack_ftp
  6. [root@Ansible ~]# modprobe ip_nat_ftp
  7. [root@Ansible ~]# modprobe ipt_state

 永久加入,写进开机自启动

  1. cat >>/etc/rc.local<<EOF
  2. modprobe ip_tables
  3. modprobe iptable_filter
  4. modprobe iptable_nat
  5. modprobe ip_conntrack
  6. modprobe ip_conntrack_ftp
  7. modprobe ip_nat_ftp
  8. modprobe ipt_state
  9. EOF

 列出三表相关的内核模块,lsmod是列出系统当前载入的所有内核模块

  1. [root@Ansible ~]# lsmod |egrep 'filter|nat|ipt'
  2. nf_nat_ftp 12809 0
  3. nf_conntrack_ftp 18478 1 nf_nat_ftp
  4. iptable_nat 12875 0
  5. nf_nat_ipv4 14115 1 iptable_nat
  6. nf_nat 26583 2 nf_nat_ftp,nf_nat_ipv4
  7. nf_conntrack 139264 6 nf_nat_ftp,nf_nat,xt_state,nf_nat_ipv4,nf_conntrack_ftp,nf_conntrack_ipv4
  8. iptable_filter 12810 0
  9. ip_tables 27126 2 iptable_filter,iptable_nat
  10. libcrc32c 12644 3 xfs,nf_nat,nf_conntrack

关闭firewalld,启用iptables,并设置开机自启动

  1. [root@Ansible ~]# systemctl stop firewalld
  2. [root@Ansible ~]# systemctl disable firewalld
  3. [root@Ansible ~]# systemctl start iptables.service
  4. [root@Ansible ~]# systemctl enable iptables.service
  5. Created symlink from /etc/systemd/system/basic.target.wants/iptables.service to /usr/lib/systemd/system/iptables.service.

列出iptables所有规则

  1. [root@Ansible ~]# iptables -nL
  2. Chain INPUT (policy ACCEPT) #链默认规则
  3. target prot opt source destination
  4. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
  5. ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 #规则
  6. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  7. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
  8. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
  9. Chain FORWARD (policy ACCEPT) #链默认规则
  10. target prot opt source destination
  11. REJECT all -- 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
  12. Chain OUTPUT (policy ACCEPT) #链默认规则
  13. target prot opt source destination

iptables命令参数

参数含义
-L显示表中的所有规则
-n不要把端口或ip反向解析为名字
-t指定表,不指定默认是filter表
-Aappend追加,加入准许类规则
-Ddelete删除,-D INPUT 1
-Iinsert拒绝类规则放在所有规则的最上面
-p协议protocal tcp/udp/icmp/all
--dport目标端口dest destination指定端口加上协议 -p tcp
--sport源端口,source源
-d--destination 目标IP
-m指定模块 multiport
-iinput输入的时候,从哪个网卡进来
-ooutput输出的时候,从哪个网卡出去
-j

满足条件后的工作:DROP/ACCEPT/REJECT

DROP REJECT拒绝

DROP把数据丢掉,不会返回信息给用户

REJECT拒绝,返回拒绝信息

-Fflush 清楚所有规则,不会处理默认的规则
-X删除用户自定义的链
-Z链的计数器清零(数据包计数器和数据包字节计数器)

配置filter表规则

正式配置之前,先备份,清空规则

  1. [root@Ansible ~]# iptables -F
  2. [root@Ansible ~]# iptables -X
  3. [root@Ansible ~]# iptables -Z
  4. [root@Ansible ~]# iptables -nL
  5. Chain INPUT (policy ACCEPT)
  6. target prot opt source destination
  7. Chain FORWARD (policy ACCEPT)
  8. target prot opt source destination
  9. Chain OUTPUT (policy ACCEPT)
  10. target prot opt source destination

1、禁止访问22端口

  1. [root@Ansible ~]# iptables -t filter -I INPUT -p tcp --dport 22 -j DROP
  2. [root@Ansible ~]#
  3. Connection closed by foreign host.
  4. Disconnected from remote host(Linux86-10.0.0.61-Ansible) at 22:43:23.
  5. Type `help' to learn how to use Xshell prompt.
  6. [c:\~]$

743e56c0f995479b92d9ed65c703b4cb.png

 删除规则

  1. Connecting to 10.0.0.61:22...
  2. Connection established.
  3. To escape to local shell, press Ctrl+Alt+].
  4. Last login: Sat May 6 22:44:26 2023
  5. [root@Ansible ~]#

2、封ip,屏蔽某个ip

  1. [root@Ansible ~]# iptables -I INPUT -s 10.0.0.7 -j DROP
  2. [root@Ansible ~]# iptables -I INPUT -s 172.16.1.7 -j DROP
  3. [root@Ansible ~]# iptables -nL
  4. Chain INPUT (policy ACCEPT)
  5. target prot opt source destination
  6. DROP all -- 172.16.1.7 0.0.0.0/0
  7. DROP all -- 10.0.0.7 0.0.0.0/0
  8. Chain FORWARD (policy ACCEPT)
  9. target prot opt source destination
  10. Chain OUTPUT (policy ACCEPT)
  11. target prot opt source destination

屏蔽之后用10.0.0.7ssh连接会卡住 

[root@Web01 ~]# ssh 10.0.0.61

3、禁止网段连入(禁止10.0.0.0/24网段访问 8888端口)

  1. #指定10.0.0.0网段的屏蔽了22端口
  2. [root@Ansible ~]# iptables -F
  3. [root@Ansible ~]# iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 22 -j DROP
  4. [root@Web01 ~]# ssh 10.0.0.61 hostname
  5. ^C
  6. [root@Web01 ~]# ssh 172.16.1.61 hostname
  7. root@172.16.1.61's password:
  8. Ansible
  9. #指定10.0.0.0网段的屏蔽8888端口
  10. [root@Ansible ~]# iptables -F
  11. [root@Ansible ~]# iptables -I INPUT -s 10.0.0.0/24 -p tcp --dport 8888 -j DROP
  12. 这个可以用nc和telnet测试

4、只允许指定网段连入(允许10.0.0.0网段)

类似于阿里云白名单功能,开放指定端口和网段,其他均拒绝

1、利用!排除,只准许10.0.0.0/24访问

  1. [root@Ansible ~]# iptables -I INPUT ! -s 10.0.0.0/24 -j DROP
  2. [root@Web01 ~]# ping 10.0.0.61
  3. PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
  4. 64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.466 ms
  5. 64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=0.658 ms
  6. ^C
  7. --- 10.0.0.61 ping statistics ---
  8. 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
  9. rtt min/avg/max/mdev = 0.466/0.562/0.658/0.096 ms
  10. [root@Web01 ~]# ping 172.16.1.61
  11. PING 172.16.1.61 (172.16.1.61) 56(84) bytes of data.
  12. ^C
  13. --- 172.16.1.61 ping statistics ---
  14. 4 packets transmitted, 0 received, 100% packet loss, time 2999ms

2、修改链默认规则,修改为拒绝,添加准许 

若默认规则修改为拒绝后,ping公网IP可以但是ping公网域名不行,故障类似于DNS解析有问题(我踩过的坑)

  1. [root@Ansible ~]# iptables -nL
  2. Chain INPUT (policy ACCEPT)
  3. target prot opt source destination
  4. Chain FORWARD (policy ACCEPT)
  5. target prot opt source destination
  6. Chain OUTPUT (policy ACCEPT)
  7. target prot opt source destination
  8. [root@Ansible ~]# iptables -P INPUT DROP
  9. [root@Ansible ~]# iptables -nL
  10. Chain INPUT (policy DROP)
  11. target prot opt source destination
  12. Chain FORWARD (policy ACCEPT)
  13. target prot opt source destination
  14. Chain OUTPUT (policy ACCEPT)
  15. target prot opt source destination
  16. [root@Ansible ~]# iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
  17. [root@Ansible ~]# iptables -nL
  18. Chain INPUT (policy DROP)
  19. target prot opt source destination
  20. ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
  21. Chain FORWARD (policy ACCEPT)
  22. target prot opt source destination
  23. Chain OUTPUT (policy ACCEPT)
  24. target prot opt source destination

b98ebdc9d90c429ea21a2c2dcb5eb4a1.png

5、指定多个端口

  1. [root@Ansible ~]# ​​iptables -I INPUT -p tcp --dport 8888 -j DROP
  2. [root@Ansible ~]# iptables -I INPUT -p tcp --dport 9999 -j DROP
  3. [root@Ansible ~]# ​iptables -nL
  4. Chain INPUT (policy ACCEPT)
  5. target prot opt source destination
  6. DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:9999
  7. DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8888
  8. Chain FORWARD (policy ACCEPT)
  9. target prot opt source destination
  10. Chain OUTPUT (policy ACCEPT)
  11. target prot opt source destination
  12. [root@Ansible ~]# iptables -I INPUT -p tcp -m multiport ! --dport 80,443 -j DROP
  13. #如果是禁用连续端口可以不加-m multiport 1:1024
  14. [root@Ansible ~]# iptables -I INPUT -p tcp --dport 1024:65535 -j DROP
  15. [root@Ansible ~]# iptables -nL
  16. Chain INPUT (policy ACCEPT)
  17. target prot opt source destination
  18. DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpts:1024:65535
  19. Chain FORWARD (policy ACCEPT)
  20. target prot opt source destination
  21. Chain OUTPUT (policy ACCEPT)
  22. target prot opt source destination

6、匹配ICMP类型

ICMP(Internet Control Message Protocol)Internet控制报文协议,ping,是整个网站的核心

通过防火墙规则,控制是否可以ping

  1. [root@Ansible ~]# iptables -I INPUT -p icmp --icmp-type 8 -j DROP
  2. [root@Ansible ~]# iptables -nL
  3. Chain INPUT (policy ACCEPT)
  4. target prot opt source destination
  5. DROP icmp -- 0.0.0.0/0 0.0.0.0/0 icmptype 8
  6. Chain FORWARD (policy ACCEPT)
  7. target prot opt source destination
  8. Chain OUTPUT (policy ACCEPT)
  9. target prot opt source destination
  10. [root@Web01 ~]# ping 10.0.0.61
  11. PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
  12. ^C
  13. --- 10.0.0.61 ping statistics ---
  14. 6 packets transmitted, 0 received, 100% packet loss, time 5002ms

通过内核参数,控制禁止被ping 

  1. [root@Ansible ~]# cat /etc/sysctl.conf
  2. net.ipv4.icmp_echo_ignore_all = 0 #0为允许,1为禁止
  3. [root@Ansible ~]# sysctl -p
  4. net.ipv4.icmp_echo_ignore_all = 0

7、匹配网络状态(TCP/IP连接状态)

-m state --state

NEW:已经或将启动新的连接

ESTABLISHED:已建立的连接

RELATED:正在启动的新连接

INVALID:非法或无法识别的

  1. iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
  2. iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

8、限制并发及速率

-m limit 限制模块

-m limit --limit 10/minute     #每分钟只能有10个数据包 每6秒生成

 -m limit --limit n/{second/minute/hour}:指定时间内的请求速率”n”为速率,后面为时间分别为:秒 分 时

  1. -m limit --limit 10/minute --limit-burst 56秒释放工牌 给别人使用
  2. #10个数据包
  3. 511个工牌 从第6个开始 每6秒 才能释放1个工牌

--limit-burst [n]:在同一时间内允许通过的请求“n”为数字,不指定默认为5

  1. #ping icmp 协议 进行测试
  2. [root@Ansible ~]# iptables -F
  3. [root@Ansible ~]# iptables -I INPUT -p icmp -m limit --limit 10/minute --limit-burst 5 -j ACCEPT
  4. [root@Ansible ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  5. [root@Ansible ~]# iptables -P INPUT DROP
  6. [root@Ansible ~]# iptables -nL
  7. Chain INPUT (policy DROP)
  8. target prot opt source destination
  9. ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
  10. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
  11. Chain FORWARD (policy ACCEPT)
  12. target prot opt source destination
  13. Chain OUTPUT (policy ACCEPT)
  14. target prot opt source destination

 测试

  1. [root@Web01 ~]# ping 10.0.0.61
  2. PING 10.0.0.61 (10.0.0.61) 56(84) bytes of data.
  3. 64 bytes from 10.0.0.61: icmp_seq=1 ttl=64 time=0.298 ms
  4. 64 bytes from 10.0.0.61: icmp_seq=2 ttl=64 time=1.33 ms
  5. 64 bytes from 10.0.0.61: icmp_seq=3 ttl=64 time=0.435 ms
  6. 64 bytes from 10.0.0.61: icmp_seq=4 ttl=64 time=0.460 ms
  7. 64 bytes from 10.0.0.61: icmp_seq=5 ttl=64 time=0.758 ms
  8. 64 bytes from 10.0.0.61: icmp_seq=7 ttl=64 time=2.28 ms #71之间间隔6
  9. 64 bytes from 10.0.0.61: icmp_seq=13 ttl=64 time=0.793 ms #137之间间隔6
  10. 64 bytes from 10.0.0.61: icmp_seq=19 ttl=64 time=0.734 ms
  11. 64 bytes from 10.0.0.61: icmp_seq=25 ttl=64 time=0.803 ms
  12. ^C
  13. --- 10.0.0.61 ping statistics ---
  14. 26 packets transmitted, 9 received, 65% packet loss, time 25013ms
  15. rtt min/avg/max/mdev = 0.298/0.877/2.286/0.572 ms

9、防火墙规则的保存与恢复

iptables-save 保存,默认输出到屏幕

iptables-restore 恢复,加上文件

写入/etc/sysconfig/iptables

  1. [root@Ansible ~]# iptables-save >/etc/sysconfig/iptables
  2. [root@Ansible ~]# cat /etc/sysconfig/iptables
  3. # Generated by iptables-save v1.4.21 on Sun May 7 16:11:34 2023
  4. *nat
  5. :PREROUTING ACCEPT [306:36403]
  6. :INPUT ACCEPT [182:29467]
  7. :OUTPUT ACCEPT [145:11135]
  8. :POSTROUTING ACCEPT [145:11135]
  9. COMMIT
  10. # Completed on Sun May 7 16:11:34 2023
  11. # Generated by iptables-save v1.4.21 on Sun May 7 16:11:34 2023
  12. *filter
  13. :INPUT DROP [17:1428]
  14. :FORWARD ACCEPT [0:0]
  15. :OUTPUT ACCEPT [49:5580]
  16. -A INPUT -p icmp -m limit --limit 10/min -j ACCEPT
  17. -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
  18. COMMIT
  19. # Completed on Sun May 7 16:11:34 2023
  20. [root@Ansible ~]# iptables -nL
  21. Chain INPUT (policy DROP)
  22. target prot opt source destination
  23. ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
  24. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
  25. Chain FORWARD (policy ACCEPT)
  26. target prot opt source destination
  27. Chain OUTPUT (policy ACCEPT)
  28. target prot opt source destination
  29. [root@Ansible ~]# iptables -D INPUT 1
  30. [root@Ansible ~]# iptables -nL
  31. Chain INPUT (policy DROP)
  32. target prot opt source destination
  33. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
  34. Chain FORWARD (policy ACCEPT)
  35. target prot opt source destination
  36. Chain OUTPUT (policy ACCEPT)
  37. target prot opt source destination
  38. [root@Ansible ~]# iptables-restore < /etc/sysconfig/iptables
  39. [root@Ansible ~]# iptables -nL
  40. Chain INPUT (policy DROP)
  41. target prot opt source destination
  42. ACCEPT icmp -- 0.0.0.0/0 0.0.0.0/0 limit: avg 10/min burst 5
  43. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
  44. Chain FORWARD (policy ACCEPT)
  45. target prot opt source destination
  46. Chain OUTPUT (policy ACCEPT)
  47. target prot opt source destination
  48. 此外,systemctl restart iptables 会读取/etc/sysconfig/iptables内容

10、filter表简单总结

1、封ip,端口,网段

2、禁止ping

3、限制速度和并发

4、iptables filter表功能可以在云服务器使用

企业中用法

iptables配置方式:1、逛公园模式,默认规则是ACCEPT;2、看电影模式,默认规则是DROP

默认是拒绝

1、ssh可以连接

  1. [root@Ansible ~]# iptables -F
  2. [root@Ansible ~]# iptables -X
  3. [root@Ansible ~]# iptables -Z
  4. [root@Ansible ~]# iptables -nL
  5. Chain INPUT (policy ACCEPT)
  6. target prot opt source destination
  7. Chain FORWARD (policy ACCEPT)
  8. target prot opt source destination
  9. Chain OUTPUT (policy ACCEPT)
  10. target prot opt source destination
  11. [root@Ansible ~]# iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  12. [root@Ansible ~]# iptables -nL
  13. Chain INPUT (policy ACCEPT)
  14. target prot opt source destination
  15. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
  16. Chain FORWARD (policy ACCEPT)
  17. target prot opt source destination
  18. Chain OUTPUT (policy ACCEPT)
  19. target prot opt source destination
  20. [root@Web01 ~]# ssh 10.0.0.61 hostname
  21. root@10.0.0.61's password:
  22. Ansible

2、设置允许本机lo通讯规则

允许本机回环lo(本地操作)接口数据流量流出和流入

  1. [root@Ansible ~]# iptables -A INPUT -i lo -j ACCEPT
  2. [root@Ansible ~]# iptables -A OUTPUT -o lo -j ACCEPT

3、配置默认规则及放行80,443端口

  1. [root@Ansible ~]# iptables -P INPUT DROP
  2. [root@Ansible ~]# iptables -P FORWARD DROP
  3. [root@Ansible ~]# iptables -P OUTPUT ACCEPT
  4. [root@Ansible ~]#
  5. [root@Ansible ~]# iptables -A INPUT -m multiport -p tcp --dport 443,80 -j ACCEPT
  6. [root@Ansible ~]# iptables -nL
  7. Chain INPUT (policy DROP)
  8. target prot opt source destination
  9. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
  10. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  11. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
  12. Chain FORWARD (policy DROP)
  13. target prot opt source destination
  14. Chain OUTPUT (policy ACCEPT)
  15. target prot opt source destination
  16. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  17. [root@Ansible ~]# iptables -A INPUT -s 10.0.0.0/24 -j ACCEPT
  18. [root@Ansible ~]# iptables -A INPUT -s 172.16.1.0/24 -j ACCEPT
  19. #此处还可以添加 vpn网段 比如说 10.7.1.0/24
  20. [root@Ansible ~]# iptables -nL
  21. Chain INPUT (policy DROP)
  22. target prot opt source destination
  23. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
  24. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  25. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
  26. ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
  27. ACCEPT all -- 172.16.1.0/24 0.0.0.0/0
  28. Chain FORWARD (policy DROP)
  29. target prot opt source destination
  30. Chain OUTPUT (policy ACCEPT)
  31. target prot opt source destination
  32. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  33. [root@Ansible ~]# iptables-save
  34. # Generated by iptables-save v1.4.21 on Sun May 7 16:24:29 2023
  35. *nat
  36. :PREROUTING ACCEPT [9:711]
  37. :INPUT ACCEPT [2:112]
  38. :OUTPUT ACCEPT [3:312]
  39. :POSTROUTING ACCEPT [3:312]
  40. COMMIT
  41. # Completed on Sun May 7 16:24:29 2023
  42. # Generated by iptables-save v1.4.21 on Sun May 7 16:24:29 2023
  43. *filter
  44. :INPUT DROP [0:0]
  45. :FORWARD DROP [0:0]
  46. :OUTPUT ACCEPT [7:1480]
  47. -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
  48. -A INPUT -i lo -j ACCEPT
  49. -A INPUT -p tcp -m multiport --dports 443,80 -j ACCEPT
  50. -A INPUT -s 10.0.0.0/24 -j ACCEPT
  51. -A INPUT -s 172.16.1.0/24 -j ACCEPT
  52. -A OUTPUT -o lo -j ACCEPT
  53. COMMIT
  54. # Completed on Sun May 7 16:24:29 2023

NAT表

恢复链

  1. [root@Ansible ~]# iptables -P INPUT ACCEPT
  2. [root@Ansible ~]# iptables -P FORWARD ACCEPT
  3. [root@Ansible ~]# iptables -nL
  4. Chain INPUT (policy ACCEPT)
  5. target prot opt source destination
  6. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22
  7. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  8. ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 multiport dports 443,80
  9. ACCEPT all -- 10.0.0.0/24 0.0.0.0/0
  10. ACCEPT all -- 172.16.1.0/24 0.0.0.0/0
  11. Chain FORWARD (policy ACCEPT)
  12. target prot opt source destination
  13. Chain OUTPUT (policy ACCEPT)
  14. target prot opt source destination
  15. ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
  16. [root@Ansible ~]# iptables -F
  17. [root@Ansible ~]# iptables -nL
  18. Chain INPUT (policy ACCEPT)
  19. target prot opt source destination
  20. Chain FORWARD (policy ACCEPT)
  21. target prot opt source destination
  22. Chain OUTPUT (policy ACCEPT)
  23. target prot opt source destination

1、实现共享上网

1、防火墙配置

  1. [root@Ansible ~]# iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 10.0.0.61
  2. [root@Ansible ~]# echo 'net.ipv4.ip_forward = 1' >> /etc/sysctl.conf
  3. [root@Ansible ~]# sysctl -p
  4. net.ipv4.icmp_echo_ignore_all = 0
  5. net.ipv4.ip_forward = 1
  6. 注意:公网IP不固定
  7. iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j MASQUERADE

2、web配置

  1. [root@Web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth0
  2. TYPE=Ethernet
  3. BOOTPROTO=none
  4. NAME=eth0
  5. DEVICE=eth0
  6. ONBOOT=no #修改网卡,禁止开机自启动
  7. IPADDR=10.0.0.7
  8. PREFIX=24
  9. GATEWAY=10.0.0.2
  10. DNS1=223.5.5.5
  11. [root@Web01 ~]# cat /etc/sysconfig/network-scripts/ifcfg-eth1
  12. TYPE=Ethernet
  13. BOOTPROTO=none
  14. NAME=eth0
  15. DEVICE=eth0
  16. ONBOOT=yes
  17. IPADDR=10.0.0.7
  18. PREFIX=24
  19. GATEWAY=172.16.1.61
  20. DNS1=1.2.4.8
  21. [root@Web01 ~]# systemctl restart network
  22. [root@Ansible ~]# ssh 172.16.1.7
  23. Last login: Sun May 7 21:16:43 2023 from 10.0.0.1
  24. [root@Web01 ~]# ip a
  25. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  26. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  27. inet 127.0.0.1/8 scope host lo
  28. valid_lft forever preferred_lft forever
  29. inet6 ::1/128 scope host
  30. valid_lft forever preferred_lft forever
  31. 2: eth0: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 1000
  32. link/ether 00:0c:29:91:01:20 brd ff:ff:ff:ff:ff:ff
  33. 3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
  34. link/ether 00:0c:29:91:01:2a brd ff:ff:ff:ff:ff:ff
  35. inet 172.16.1.7/24 brd 172.16.1.255 scope global eth1
  36. valid_lft forever preferred_lft forever
  37. inet6 fe80::20c:29ff:fe91:12a/64 scope link
  38. valid_lft forever preferred_lft forever

 3、在web01测试结果

  1. [root@Web01 ~]# ip r
  2. default via 172.16.1.61 dev eth1
  3. 169.254.0.0/16 dev eth1 scope link metric 1003
  4. 172.16.1.0/24 dev eth1 proto kernel scope link src 172.16.1.7
  5. [root@Web01 ~]# route -n
  6. Kernel IP routing table
  7. Destination Gateway Genmask Flags Metric Ref Use Iface
  8. 0.0.0.0 172.16.1.61 0.0.0.0 UG 0 0 0 eth1
  9. 169.254.0.0 0.0.0.0 255.255.0.0 U 1003 0 0 eth1
  10. 172.16.1.0 0.0.0.0 255.255.255.0 U 0 0 0 eth1
  11. [root@Web01 ~]# ping baidu.com
  12. PING baidu.com (39.156.66.10) 56(84) bytes of data.
  13. 64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=1 ttl=127 time=10.3 ms
  14. 64 bytes from 39.156.66.10 (39.156.66.10): icmp_seq=2 ttl=127 time=12.3 ms
  15. ^C
  16. --- baidu.com ping statistics ---
  17. 2 packets transmitted, 2 received, 0% packet loss, time 1000ms
  18. rtt min/avg/max/mdev = 10.306/11.346/12.386/1.040 ms
  19. [root@Web01 ~]# ping 1.2.4.8
  20. PING 1.2.4.8 (1.2.4.8) 56(84) bytes of data.
  21. 64 bytes from 1.2.4.8: icmp_seq=1 ttl=127 time=12.5 ms
  22. 64 bytes from 1.2.4.8: icmp_seq=2 ttl=127 time=11.3 ms
  23. ^C
  24. --- 1.2.4.8 ping statistics ---
  25. 2 packets transmitted, 2 received, 0% packet loss, time 1002ms
  26. rtt min/avg/max/mdev = 11.337/11.945/12.554/0.618 ms

2、端口转发(端口映射)

1a8225b6b7254ef3b0101af92666442a.png

  1. [root@Ansible ~]# iptables -t nat -A PREROUTING -d 10.0.0.61 -p tcp --dport 9000 -j DNAT --to-destination 172.16.1.7:22
  2. [root@Ansible ~]# iptables -nL -t nat
  3. Chain PREROUTING (policy ACCEPT)
  4. target prot opt source destination
  5. DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:9000 to:172.16.1.7:22
  6. Chain INPUT (policy ACCEPT)
  7. target prot opt source destination
  8. Chain OUTPUT (policy ACCEPT)
  9. target prot opt source destination
  10. Chain POSTROUTING (policy ACCEPT)
  11. target prot opt source destination
  12. SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61

 本地shell测试

  1. c:\~]$ ssh root@10.0.0.61 9000
  2. Connecting to 10.0.0.61:9000...
  3. Connection established.
  4. To escape to local shell, press Ctrl+Alt+].
  5. Last login: Sun May 7 21:34:55 2023 from 10.0.0.61

3、IP映射

  1. [root@Ansible ~]# iptables -t nat -A PREROUTING -d 10.0.0.62 -j DNAT --to-destination 172.16.1.7
  2. [root@Ansible ~]# iptables -nL -t nat
  3. Chain PREROUTING (policy ACCEPT)
  4. target prot opt source destination
  5. DNAT tcp -- 0.0.0.0/0 10.0.0.61 tcp dpt:9000 to:172.16.1.7:22
  6. DNAT all -- 0.0.0.0/0 10.0.0.62 to:172.16.1.7
  7. Chain INPUT (policy ACCEPT)
  8. target prot opt source destination
  9. Chain OUTPUT (policy ACCEPT)
  10. target prot opt source destination
  11. Chain POSTROUTING (policy ACCEPT)
  12. target prot opt source destination
  13. SNAT all -- 172.16.1.0/24 0.0.0.0/0 to:10.0.0.61

4、NAT表简单总结

1、可以实现共享上网

2、可以实现端口转发

3、NAT功能在云服务器无法使用,但有替代品叫NAT网关

iptables简单练习

1、查看iptables当前所有规则的命令

  1. iptables-save
  2. iptables -nL
  3. iptables -nL -t nat

2、禁止来自10.0.0.188IP地址访问80端口的请求

iptables -I   INPUT   -s 10.0.0.188 -p tcp   --dport 80      -j  DROP 

3、在命令行执行的iptables规则永久生效

iptables-save > /etc/sysconfig/iptables

 4、实现把访问10.0.0.3:80请求转到172.16.1.17:80

iptables -t nat  -A PREROUTING  -d 10.0.0.3  -p tcp --dport 80    -j   DNAT  --to-destination  172.16.1.17:80

5、实现172.16.1.0/24段所有主机通过124.32.54.26外网IP共享上网

  1. iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT --to-source 123.32.54.26
  2. iptables -t nat -A POSTROUTING -s 172.16.1.0/24 -j SNAT MASQUERADE

6、iptables实现防止syn ddos和ping攻击

  1. -A FORWARD -p tcp --syn -m limit --limit 1/s --limit-burst 5 -j ACCEPT
  2. -A FORWARD -p tcp --tcp-flags SYN,ACK,FIN,RST RST -m limit --limit 1/s -j ACCEPT
  3. -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 1/s -j ACCEPT
  4. 说明:第一行:每秒中最多允许5个新连接。第二行:防止各种端口扫描。第三行:Ping洪水攻击(Ping of Death),可以根据需要调整或关闭

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/631789
推荐阅读
相关标签
  

闽ICP备14008679号