linux面试经历:iptables面试题

时间:2019-01-02
本文章向大家介绍linux面试经历:iptables面试题,主要包括linux面试经历:iptables面试题使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

1 你听说过iptables 或 firewall? 知道如何用?
知道, iptables是c语言编写的基于GNU的应用程序。最新稳定版本是1.6.1.可以作为unix平台下或linux开放系统下的防火墙。实际上通过iptables/netfilter 来实现相应功能。 管理员通过console端在预定义的表中定义防火墙规则。Netfilter是系统的核心模块,用于过滤规则。
firewalld 是RHEL,Centos7下最新的过滤规则。他代替了iptables,与netfilter一起作用。

2 你知道iptales的前端图形化工具或命令行?
曾经用过shorewall,他是整合在webmin平台下的。命令行工具更适合有经验的管理者。

3 iptables 和 firewalld基本不同点?
iptables和firewalld是基于包过滤目标的不同分支。如果规则修改后,iptables会刷新整个规则, firewalld则不会。
iptables配置文件/etc/sysconfig/iptables‘, firewalld配置文件是/etc/firewalld/‘一组xml文件,相对iptables更直观。firewalld通过自己的命令行接口和配置文件运行类似iptables功能。

在这里插入代码片

4 如果你用firewalld代替iptable,你有什么建议?
如果没有什么需要动态变更,而目前iptable能适应各种场合,也没有明显的抱错,不建议替换。但如果一致决定更换成firewalld,那就必须执行。

5 iptables 有哪些表, 简明介绍
nat 用于网络地址解析
mangle mangle包, 特定数据包的更改,比如head,content
filter default表,用于过滤包
raw 优先级最高,用于pretouting和output ,使用raw表,可以跳过NAT表和 ip_conntrack处理,即不再做地址转换和数据包的链接跟踪处理了
链 prerouting,input ,forword,output, postrouting

6 iptable 作用结果
accept : queue : drop : return: reject deny

7 检查是否安装了iptables, 如何安装
iptables系统内置的。不需要特别安装。

# rpm -qa iptables
iptables-1.4.21-13.el7.x86_64

yum install iptables-services

8 检查iptables 服务运行

# service iptables status			[On CentOS 6/5]
# systemctl status iptables			[On CentOS 7]

#运行服务
---------------- On CentOS 6/5 ---------------- 
# chkconfig --level 35 iptables on
# service iptables start

---------------- On CentOS 7 ---------------- 
# systemctl enable iptables 
# systemctl start iptables 

#模块是否装载
# lsmod | grep ip_tables

9 查看当前的定义规则

# iptables -L

10 刷新iptables 或某个链

# iptables --flush OUTPUT
# iptables --flush

11 加一条规则接受指定ip (192.168.1.7

#下面命令用法是一致的
# iptables -A INPUT -s 192.168.1.7 -j ACCEPT 
# iptables -A INPUT -s 192.168.1.7/24 -j ACCEPT 
# iptables -A INPUT -s 192.168.1.7/255.255.255.0 -j ACCEPT

12 如何加,ACCEPT,DROP,DENY 的ssh (port22) 规则

# iptables -A INPUT -s -p tcp --dport 22 -j ACCEPT 
# iptables -A INPUT -s -p tcp --dport 22 -j REJECT
# iptables -A INPUT -s -p tcp --dport 22 -j DENY
# iptables -A INPUT -s -p tcp --dport 22 -j DROP

13 对于源地址192.168.1.7, 禁止访问服务器端口22,23,80,135

#iptables -A INPUT -s 192.168.1.7 -p tcp --dport 22,23,80,135 drop

14 对于访问量大的服务器192.168.8.21,在RAW表做优化

iptables -t raw -A PREROUTING -d 192.168.8.21 -p tcp --dport 80 -j NOTRACK
iptables -A FORWARD -m state --state UNTRACKED -j ACCEPT

#解决ip_conntrack: table full, dropping packet的问题
vi /etc/sysctl.conf
1 提高最大值
net.ipv4.ip_conntrack_max = 393216
net.ipv4.netfilter.ip_conntrack_max = 393216
2减低timeout值
net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120

15 iptables 数据包流程

基本步骤如下: 
1. 数据包到达网络接口,比如 eth0。 
2. 进入 raw 表的 PREROUTING 链,这个链的作用是赶在连接跟踪之前处理数据包。 
3. 如果进行了连接跟踪,在此处理。 
4. 进入 mangle 表的 PREROUTING 链,在此可以修改数据包,比如 TOS 等。 
5. 进入 nat 表的 PREROUTING 链,可以在此做DNAT,但不要做过滤。 
6. 决定路由,看是交给本地主机还是转发给其它主机。 

到了这里我们就得分两种不同的情况进行讨论了,一种情况就是数据包要转发给其它主机,这时候它会依次经过: 
7. 进入 mangle 表的 FORWARD 链,这里也比较特殊,这是在第一次路由决定之后,在进行最后的路由决定之前,我们仍然可以对数据包进行某些修改。 
8. 进入 filter 表的 FORWARD 链,在这里我们可以对所有转发的数据包进行过滤。需要注意的是:经过这里的数据包是转发的,方向是双向的。 
9. 进入 mangle 表的 POSTROUTING 链,到这里已经做完了所有的路由决定,但数据包仍然在本地主机,我们还可以进行某些修改。 
10. 进入 nat 表的 POSTROUTING 链,在这里一般都是用来做 SNAT ,不要在这里进行过滤。 
11. 进入出去的网络接口。完毕。 

另一种情况是,数据包就是发给本地主机的,那么它会依次穿过: 
7. 进入 mangle 表的 INPUT 链,这里是在路由之后,交由本地主机之前,我们也可以进行一些相应的修改。 
8. 进入 filter 表的 INPUT 链,在这里我们可以对流入的所有数据包进行过滤,无论它来自哪个网络接口。 
9. 交给本地主机的应用程序进行处理。 
10. 处理完毕后进行路由决定,看该往那里发出。 
11. 进入 raw 表的 OUTPUT 链,这里是在连接跟踪处理本地的数据包之前。 
12. 连接跟踪对本地的数据包进行处理。 
13. 进入 mangle 表的 OUTPUT 链,在这里我们可以修改数据包,但不要做过滤。 
14. 进入 nat 表的 OUTPUT 链,可以对防火墙自己发出的数据做 NAT 。 
15. 再次进行路由决定。 
16. 进入 filter 表的 OUTPUT 链,可以对本地出去的数据包进行过滤。 
17. 进入 mangle 表的 POSTROUTING 链,同上一种情况的第9步。注意,这里不光对经过防火墙的数据包进行处理,还对防火墙自己产生的数据包进行处理。 
18. 进入 nat 表的 POSTROUTING 链,同上一种情况的第10步。 
19. 进入出去的网络接口。完毕。

15 其他常用命令

iptables -F
#清除规则

iptables -A INPUT -s ! 189.25.89.0/23 -m state --state NEW -p tcp -m multiport --dport 23,110 -j DROP
#除189.25.89.0之外的主机,new状态,23,110端口数据包drop

iptables -A INPUT -s 0/0 -m state --state NEW -p tcp -m multiport --dport 123,110 -j DROP
#这句意思为源地址是0/0的 NEW状态的的TCP数据包都禁止访问我的123和110端口。

iptables -R INPUT 10 -s 192.168.5.20  -p tcp --dport 25 -j ACCEPT
替换INPUT链中的第十条规则

iptables -t filter -L INPUT -vn
#以数字形式详细显示filter表INPUT链的规则

iptables -t nat -A PREROUTING -d 192.168.102.55 -p tcp --dport 90 -j DNAT --to 172.20.11.1:800
#-A PREROUTING 指定在路由前做的。完整的意思是在 NAT TABLE 的路由前处理,目的地为192.168.102.55 的 目的端口为90的我们做DNAT处理,给他转向到172.20.11.1:800那里去。

iptables -t nat -A POSTROUTING -d 172.20.11.1 -j SNAT --to 192.168.102.55
#-A POSTROUTING 路由后。意思为在 NAT TABLE 的路由后处理,凡是目的地为 172.20.11.1 的,我们都给他做SNAT转换,把源地址改写成 192.168.102.55 。

iptables -A INPUT -d 192.168.20.0/255.255.255.0 -i eth1 -j DROP
iptables -A INPUT -s 192.168.20.0/255.255.255.0 -i eth1 -j DROP
iptables -A OUTPUT -d 192.168.20.0/255.255.255.0 -o eth1 -j DROP
iptables -A OUTPUT -s 192.168.20.0/255.255.255.0 -o eth1 -j DROP
# 上例中,eth1是一个与外部Internet相连,而192.168.20.0则是内部网的网络号,上述规则用来防止IP欺骗,因为出入eth1的包的ip应该是公共IP
iptables -A INPUT -s 255.255.255.255 -i eth0 -j DROP
iptables -A INPUT -s 224.0.0.0/224.0.0.0 -i eth0 -j DROP
iptables -A INPUT -d 0.0.0.0 -i eth0 -j DROP
# 防止广播包从IP代理服务器进入局域网:

iptables -A INPUT -p tcp -m tcp --sport 5000 -j DROP
iptables -A INPUT -p udp -m udp --sport 5000 -j DROP
iptables -A OUTPUT -p tcp -m tcp --dport 5000 -j DROP
iptables -A OUTPUT -p udp -m udp --dport 5000 -j DROP
# 屏蔽端口 5000

iptables -A input -s ! 192.168.1.0/24  -i eth1 -p tcp -m tcp --dport 3306 -j drop
iptables -A input -s  192.168.1.0/24  -i eth1 -p tcp -m tcp --dport 3306 -j accept
#只允许内网用户访问 MySQL 服务器(就是 3306 端口)

iptables -A INPUT -p tcp -m multiport --dports 110,80,25,139 -j ACCEPT
#允许内网访问邮件,web,samba

iptables -A INPUT -i eth1 -p udp -m multiport --dports 53 -j ACCEPT
#允许dns连接

iptables -A INPUT -p tcp --dport 1723 -j ACCEPT
iptables -A INPUT -p gre -j ACCEPT
#允许外网vpn连接

ptables -A INPUT -i eth0 -p tcp --syn -m connlimit --connlimit-above 15 -j DROP
#为了防止DoS太多连接进来,那么可以允许最多15个初始连接,超过的丢弃

iptables -A INPUT -p icmp -j DROP
#禁止icmp通信-ping 不通

iptables -t nat -A POSTROUTING -o ppp0 -s 192.168.0.0/24 -j MASQUERADE
#内网转发

iptables -N syn-flood
iptables -A INPUT -p tcp --syn -j syn-flood
iptables -I syn-flood -p tcp -m limit --limit 3/s --limit-burst 6 -j RETURN
itables -A syn-flood -j REJECT
#防止SYN攻击 轻量

iptables -I FORWARD -p udp --dport 53 -m string --string "tencent" -m time --timestart 8:15 --timestop 12:30 --days Mon,Tue,Wed,Thu,Fri,Sat -j DROP
#星期一到星期六的8:00-12:30禁止qq通信

iptables -I FORWARD -s 192.168.0.0/24 -m string --string "ay2000.NET" -j DROP
#禁止ay2000.Net连接 !

iptables -A FORWARD -m ipp2p --edk --kazaa --bit -j DROP
iptables -A FORWARD -p tcp -m ipp2p --ares -j DROP
iptables -A FORWARD -p udp -m ipp2p --kazaa -j DROP
#禁止BT连接

iptables -A FORWARD -p tcp --syn --dport 80 -m connlimit --connlimit-above 15 --connlimit-mask 24 -j DROP
#只允许每组ip同时15个80端口转发

sysctl -w net.ipv4.ip_forward=1 &>/dev/null
#打开转发

sysctl -w net.ipv4.tcp_syncookies=1 &>/dev/null
#打开 syncookie (轻量级预防 DOS 攻击)

sysctl -w net.ipv4.netfilter.ip_conntrack_tcp_timeout_established=3800 &>/dev/null
#设置默认 TCP 连接痴呆时长为 3800 秒(此选项可以大大降低连接数)

sysctl -w net.ipv4.ip_conntrack_max=300000 &>/dev/null
#设置支持最大连接树为 30W(这个根据你的内存和 iptables 版本来,每个 connection 需要 300 多个字节)