###防火墙

  • 查看防火墙状态service iptables status/etc/init.d/iptables status
  • 临时开启防火墙service iptables start/etc/init.d/iptables start
  • 临时关闭防火墙service iptables stop/etc/init.d/iptables stop
  • 永久开启防火墙(重启生效)chkconfig iptables on
  • 永久关闭防火墙(重启生效)chkconfig iptables off

###端口的理解
Linux中,端口是依附于进程的,不能独立存在。当某个进程开启,那么它对应的端口就开启了,进程关闭,则该端口也就关闭了。iptables工具只是起到过滤端口,隔绝本系统与其他系统通过此端口进行管理,并没有真正意义上的关闭端口。如果想要关闭某个端口,有两种方式:

  1. 通过iptables工具将该端口禁掉(多虑掉)
  2. 使用kill -9 PID关掉对应的进程

###iptables命令的使用

  1. 查看iptables规则
    初始的iptables没有规则,但是如果在安装时选择自动安装防火墙,系统中会有默认的规则存在,可以先查看默认的防火墙规则:
    #iptables [-t 表名] <-L> <链名> [-t 表名]:定义查看哪个表的规则列表,表名可以使用filter、nat和mangle,如果没有定论表名,默认使用fliter表
    <-L>:列出指定表和指定链的规则
    <链名>:定义查看指定表中哪个链的规则,如果不指明哪个链,将查看某个表中所有链的规则
    #iptables -L -n(查看filter表所有链的规则)
    注:在最后添加-n参数,可以不进行IP与HOSTNAME的转换,显示的速度会快很多。
    #iptables -nL --line-number 注:–line-number,可显示规则的行号
    #iptables -t nat -L OUTPUT(查看nat表OUTPUT链的规则)
  2. 定义默认策略
    当数据包不符合链中任何一条规则时,iptables将根据该链默认策略来处理数据包,默认策略的定义方法如下
    #iptables [-t 表名] <-P> <链名> <动作> [-t 表名]:定义查看哪个表的规则,表名可以使用filter、nat和mangle,如果没有宝,默认使用filter表
    <-P>:定义默认策略
    <链名>:定义查看指定表中哪个链的规则,如果不指明,将查看某个表中所有链的规则
    <动作>:处理数据包的动作,可以使用ACCEPT(接受)和DROP(丢弃)
    #iptables -P INPUT ACCEPT (将filter表INPUT链的默认策略定义为接受)
    #iptables -t nat -P OUTPUT DROP (将nat表OUTPUT链的默认策略定义为丢弃)
    创建一个最简单的规则范例。对于没有经验和时间的用户而言,设置一个简单而又实用的规则是必要的,最基本的原则是“先拒绝所有数据包,然后再允许需要的数据包”,也就是说通常为filter表的链定义。一般都将INPUT定义为DROP,这样就可以阻止任何数据包进入,其他项目定义为ACCEPT,这样对外发送的数据就可以出去。
    #iptables -P INPUT DROP (慎用,否则xshell将无法登陆)
    #iptables -P FORWARD ACCEPT#iptables -P OUTPUT ACCEPT
  3. 增加、插入、删除和替换规则
    #iptables [-t 表名] <-A | I | D | R>链名 [规则编号] [-i | o 网卡] [-p 协议类型] [-s 源IP | 源子网] [--sport 源端口号] [-d 目标IP | 目标子网] [--dport 目标端口号] <-j 动作> [-t 表名]:定义查看哪个表的规则,表名可以使用filter、nat和mangle,如果没有定义,默认使用filter表
    -A:新增一条规则,该规则将增加到规则列表的最后一行,该参数不能使用规则编号
    -I:插入一条规则,原来该位置上的规则就会身后顺序移动,如果没有指定规则编号,则在第一条规则前插入
    -D:删除一条规则,可以输入完整规则,或直接指定规则编号
    -R:替换某条规则,规则被替换并不会改变顺序,必须要指定替换的规则编号
    <链名>:指定查看指定表中某条链的规则,可以使用INPUT、OUTPUT、FORWARD、PREROUTING、OUTPUT、POSTROUTIN
    [规则编号]:规则编号是在插入、删除和替换规则时用,编号是按照规则列表的顺序排列,第一条规则编号为1
    [-i | o 网卡名称]:i是指数据包从哪块网卡输入,o是批数据包从哪块网卡输出
    [-p 协议类型]:可以指定规则应用的协议,包含TCP、UDP、ICMP等
    [-s 源IP | 源子网]:数据包的源IP或子网
    [–sport 源端口号]:数据包的源端口号
    [-d 目标IP | 目标子网]:数据包的目标IP或子网
    [–dport 目标端口号]:数据包的目标端口号
    <-j 动作>:处理数据包的动作
    [–line-number]:显示规则的行号
    #iptables -A INPUT -i lo -j ACCEPT (追加一条规则,接受所有来自lo接口的数据包)
    #iptables -A INPUT -s 192.168.0.44 -j ACCEPT (追加一条规则,接受所有来自192.168.0.44的数据包)
    #iptables -A INPUT -s 192.168.0.44 -j DROP (追加一条规则,丢弃所有来自192.168.0.44的数据包)
    注:iptables的按照顺序读取规则的,如果两条规则冲突,以排在前面的规则为准。
    #iptables -I INPUT 3 -s 192.168.1.0/24 -j DROP (在INPUT链中的第3条规则前插入一条规则,丢弃所有来自192.168.1.0/24的数据包)
    注:-I参数如果没有指定插入的位置,将插入到所有规则的最前面
    #iptables -D INPUT 2 (删除filter表中INPUT链中的第2条规则)
    #iptables -R INPUT 2 -s 192.168.10.0/24 -p tcp --dport 80 -j DROP (替换filter表INPUT链中第2条规则为,禁止192.168.10.0/24访问TCP的80端口)
    #iptables -A INPUT -p tcp --dport 22 -j ACCEPT(打开22端口)
    #iptables -A INPUT -p tcp --dport 7001:7099 -j ACCEPT(开放7001~7009的端口)
  4. 清除规则和计数器
    在新建规则时,往往需要清除原有的或旧的规则,以免影响新规则。如果规则较多,逐条删除比较麻烦,可以使用清除规则参数快速删除所有规则。
    #iptables [-t 表名] <-F | Z> [-t 表名]:指定策略将应用于哪个表,可以使用filter、nat和mangle,如果没有指定,默认为filter表
    -F:删除指定表中所有规则
    -Z:将指定表中数据包计数器和流量计数器归零
    #iptables -Z (将filter表中数据包计数器和流量计数器请零)
    #iptables -F (删除filter表中的所有规则)
  5. 记录与恢复防火墙规则
    可以使用记录与恢复防火墙规则命令,将现有防火墙机制复制下来,在需要恢复时直接恢复即可。
    #iptables-save > 文件名 (记录当前防火墙规则)(>两边的空格不影响效果)
    #iptables-restore < 文件名 (将防火墙规则恢复到当前主机环境)(<两边的空格不影响效果)
    #service iptables save(将本次设置的规则保存至/etc/sysconfig/iptables)
    #chkconfig iptables on(使设置的规则永久生效,否则只是本次有效)
  6. DNS设置示例
    linux下输入ping www.baidu.com会ping不通,原因是 iptables 限制了53端口。这会导致一些服务器,特别是Web服务速度变慢。
    grep domain /etc/services使用此命令查看域名服务端口号。然后进行设置:
    iptables -A OUTPUT -p udp --dport 53 -j ACCEPTiptables -A INPUT -p udp --sport 53 -j ACCEPTiptables -A INPUT -p udp --dport 53 -j ACCEPTiptables -A OUTPUT -p udp --sport 53 -j ACCEPT
  7. FTP设置示例
    ftp连接端口有2个 21 和 20 端口。如下设置:
    iptables -A INPUT -p tcp --dport 21 -j ACCEPTiptables -A INPUT -p tcp --dport 20 -j ACCEPTiptables -A OUTPUT -p tcp --sport 21 -j ACCEPTiptables -A OUTPUT -p tcp --sport 20 -j ACCEPT 除此之外还有数据传输端口,用来上传、下载文件的,但是数据传输端口是任意的,因此比较特殊。解决办法就是指定这个数据传输端口的一个范围。以下用vsftpd来修改演示:
    输入命令vi /etc/vsftpd.conf在里面加入以下两行后保存退出
    pasv_min_port=30001pasv_max_port=31000 意思是告诉vsftpd, 要传输数据的端口范围就在30001到31000 这个范围内传送。
    接下来用iptables打开相应的端口:
    iptables -A INPUT -p tcp --dport 30001:31000 -j ACCEPTiptables -A OUTPUT -p tcp --sport 30001:31000 -j ACCEPT 此时就可以正常的上传和下载了。

###其他
xshell端口22
xftp端口21
oracle端口1521
oracle在开放1521端口,tcp协议下,可以在xshell端进行数据库的连接,启动,关闭,以及监听的启动,关闭(不过很慢)。在默认filter表的INPUT链丢弃的情况下,此时在客户端无法通过sqlplus打开数据库,但通过telnet可以ping通。当linux开启filter表的INPUT链为接受,则可以使用plsql访问数据库。之后技术把filter表的INPUT链改为丢弃,也不受影响。

oracle数据库未启动,监听未打开的情况下,连接会报ora-12541错误

###问题

  1. linux下已经通过iptables工具开放了1521端口,且正常启动了数据库,在windows客户端,telnet测试也顺利通过,但是使用pl/sql工具仍然无法登陆,报ora-12514错误。
    解:通过pl/sql登陆的日志文件E:\Oracle\PLSQL Developer\sqlnet.log,发现其请求连接时发过去的主机名是一串英文,而不是具体的ip地址。而linux服务器,没有开放DNS的域名解析端口,无法解析域名为对应的ip地址,因此连接超时,报没有监听异常。处理方法是linux服务器开放DNS的域名解析端口53,命令如下:
    iptables -A INPUT -p udp --sport 53 -j ACCEPTiptables -A INPUT -p udp --dport 53 -j ACCEPT 以上解法有误。最新理解,pl/sql每打开一个新的应用,都会随机生成一个端口号,通过此端口号与Linux进行连接。之前的解,其中的测试通过(默认开放了20,21,1521,7001~7099),是因为第一次打开pl/sql其随机生成的端口不在默认开放端口的范围内,第二次打开其应用,随机的端口在默认开放的范围内,所以第二次连接成功了。
  2. liunx需要打开什么端口才能让其他机子访问到本地oracle