iptables: 包过滤型防火墙

    1. Firewall: 防火墙,隔离工具;工作于主机或网络的边缘,对于进出本主机或网络的报文根据事先定义好的检查规则作匹配检测,对于能够被规则所匹配到的报文做出相应处理的组件;
    2. 主机防火墙:
    3. 网络防火墙
    4. ipfw
    5. ipchains
    6. iptables/netfilter
    7. framework: netfilter
    8. hooks function
    9. rule utils: iptables
    10. 功能:
    11. filter: 过滤,防火墙;
    12. nat: network address translation, 网络地址转换;
    13. mangle:拆解报文,做出修改,封装报文;
    14. raw:关闭nat表上启用的连接追踪机制;
    15. 链(内置):
    16. PREROUTING
    17. INPUT
    18. FORWARD
    19. OUTPUT
    20. POSTROUTING
    21. 流入:PREROUTING --> INPUT
    22. 流出:OUTPUT --> POSTROUTING
    23. 转发:PREROUTING --> FORWARD --> POSTROUTING
    24. 各功能的分别实现:
    25. filterINPUT, FORWARD, OUTPUT
    26. nat: PREROUTING(DNAT), OUTPUT, POSTROUTING(SNAT)
    27. manglePREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
    28. rawPREROUTING, OUTPUT
    29. 路由发生的时刻:
    30. 报文进入本机后:
    31. 判断目标主机;
    32. 报文发出之前:
    33. 判断经由哪个接口送往下一跳;
    34. iptables:四表五链
    35. 添加规则时的考量点:
    36. (1) 要实现哪种功能:判断添加在哪张表上;
    37. (2) 报文流经的路径:判断添加在哪个链上;
    38. 链:链上规则的次序,即为检查的次序;因此隐含一定的法则
    39. (1) 同类规则(访问同一应用),匹配范围小的放上面;
    40. (2) 不同类规则(访问不同应用),匹配到报文频率较大的放上面;
    41. (3) 将那些可由一条规则描述的多个规则合并为一个;
    42. (4) 设置默认策略;
    43. 功能的优先级次序:raw --> mangle --> nat --> filter
    44. 规则:
    45. 组成部分:报文的匹配条件,匹配到之后处理动作
    46. 匹配条件:根据协议报文特征指定
    47. 基本匹配条件
    48. 扩展匹配条件
    49. 处理动作:
    50. 内建处理机制
    51. 自定义处理机制
    52. 注意:报文不会经过自定义链,只能在内置链上通过规则进行引用后生效;
    53. iptables:规则管理工具
    54. 添加、修改、删除、显示等;
    55. 规则和链有计数器:
    56. pkts:由规则或链所匹配到的报文的个数;
    57. bytes:由规则或链匹配到的所有报文大小之和;
    58. iptables命令:
    59. iptables [-t table] {-A|-D} chain rule-specification
    60. iptables [-t table] -I chain [rulenum] rule-specification
    61. iptables [-t table] -R chain rulenum rule-specification
    62. iptables [-t table] -D chain rulenum
    63. iptables [-t table] -S [chain [rulenum]]
    64. iptables [-t table] {-F|-L|-Z} [chain [rulenum]] [options...]
    65. iptables [-t table] -N chain
    66. iptables [-t table] -X [chain]
    67. iptables [-t table] -P chain target
    68. iptables [-t table] -E old-chain-name new-chain-name
    69. -t table
    70. filter, nat, mangle, raw
    71. 链管理:
    72. -Fflush,清空规则链;省略链,表示清空指定表上的所有的链;
    73. -Nnew, 创建新的自定义规则链;
    74. -Xdrop, 删除用户自定义的空的规则链;
    75. -Zzero,清零,置零规则计数器;
    76. -PPolicy,为指定链设置默认策略;对filter表中的链而言,默认策略通常有ACCEPT, DROP, REJECT;
    77. -E: rEname,重命令自定义链;引用计数不为0的自定义链,无法改名,也无法删除;
    78. 规则管理:
    79. -Aappend,将新规则追加于指定链的尾部;
    80. -Iinsert,将新规则插入至指定链的指定位置;
    81. -Ddelete,删除指定链上的指定规则;
    82. 有两种指定方式:
    83. (1) 指定匹配条件;
    84. (2) 指定规则编号;
    85. -Rreplace,替换指定链上的指定规则;
    86. 查看:
    87. -Llist,列出指定链上的所有规则;
    88. -n: numberic,以数字格式显示地址和端口号;
    89. -v: verbose,显示详细信息;
    90. -vv, -vvv
    91. --line-numbers:显示规则编号;
    92. -x: exactly, 显示计数器计数结果的精确值;
    93. 匹配条件:
    94. 基本匹配:
    95. [!] -s, --src, --source IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围;
    96. [!] -d, --dst, --destination IP|Netaddr:检查报文中源IP地址是否符合此处指定的地址范围;
    97. -p, --protocol {tcp|udp|icmp}:检查报文中的协议,即ip首部中的protocols所标识的协议;
    98. -i, --in-interface IFACE:数据报文的流入接口;仅能用于PREROUTING, INPUTFORWARD链上;
    99. -o, --out-interface IFACE:数据报文的流出接口;仅能用于FORWARD, OUTPUTPOSTROUTING链上;
    100. 扩展匹配:-m macth_name --spec_options
    101. 例如:-m tcp --dport 22
    102. 隐式扩展:对-p protocol指明的协议进行的扩展,可省略-m选项;
    103. -p tcp
    104. --dport PORT[-PORT]:目标端口,可以是单个端口或连续多个端口;
    105. --sport PORT[-PORT]
    106. --tcp-flags LIST1 LIST2:检查LIST1所指明的所有标志位,且这其中,LIST2所表示出的所有标记位必须为1,而余下的必须为0;没有LIST1中指明的,不作检查;
    107. SYN, ACK, FIN, RST, PSH, URG
    108. --tcp-flags SYN,ACK,FIN,RST SYN
    109. --syn:
    110. -p udp
    111. --dport
    112. --sport
    113. -p icmp
    114. --icmp-type
    115. 可用数字表示其类型:
    116. 0echo-reply
    117. 8: echo-request
    118. 显式扩展: 必须使用-m选项指定使用的扩展;
    119. 目标:
    120. -j TARGETjump至指定的TARGET
    121. ACCEPT: 接受
    122. DROP: 丢弃
    123. REJECT: 拒绝
    124. RETURN: 返回调用链
    125. REDIRECT:端口重定向
    126. LOG: 记录日志
    127. MARK:做防火墙标记
    128. DNAT:目标地址转换
    129. SNAT:源地址转换
    130. MASQUERADE:地址伪装
    131. ...
    132. 自定义链:由自定义链上的规则进行匹配检查

    回顾:
    iptables/netfilter
    netfilter: kernel framework,
    iptables

    1. 四表:filter, nat, mangle, raw
    2. 五链:PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING
    3. 回顾:
    4. 子命令:
    5. 链:-F, -X, -N, -E, -Z, -P, -L
    6. 规则:-A, -I, -D, -R
    7. -j TARGET
    8. ACCEPT, DROP, REJECT, RETURN, LOG, MARK, DNAT, SNAT, MASQUEARDE, ...
    9. 匹配标准:
    10. 通用匹配:-s, -d, -p, -i, -o
    11. 扩展匹配
    12. 隐含扩展:
    13. -p tcp: --dport, --sport, --tcp-flags, --syn (--tcp-flags SYN,ACK,FIN,RST SYN)
    14. -p udp: --dport, --sport
    15. -p icmp: --icmp-type
    16. 显式扩展: -m

    iptables:

    1. 显式扩展:必须显式指明使用的扩展模块(rpm -ql iptables | grep "\.so")
    2. CentOS 6: man iptables
    3. CentOS 7: man iptables-extensions
    4. 1multiport扩展
    5. 以离散方式定义多端口匹配;最多指定15个端口;
    6. [!] --source-ports,--sports port[,port|,port:port]...:指明多个源端口;
    7. [!] --destination-ports,--dports port[,port|,port:port]...:指明多个离散的目标端口;
    8. [!] --ports port[,port|,port:port]...
    9. ~]# iptables -I INPUT -s 172.16.0.0/16 -d 172.16.100.9 -p tcp -m multiport --dports 22,80 -j ACCEPT
    10. ~]# iptables -I OUTPUT -d 172.16.0.0/16 -s 172.16.100.9 -p tcp -m multiport --sports 22,80 -j ACCEPT
    11. 2iprange扩展
    12. 指明连续的(但一般是不能扩展为整个网络)ip地址范围时使用;
    13. [!] --src-range from[-to]:指明连续的源IP地址范围;
    14. [!] --dst-range from[-to]:指明连续的目标IP地址范围;
    15. ~~]# iptables -I INPUT -d 172.16.100.9 -p tcp -m multiport --dports 22:23,80 -m iprange --src-range 172.16.100.1-172.16.100.120 -j ACCEPT
    16. ~]# iptables -I OUTPUT -s 172.16.100.9 -p tcp -m multiport --sports 22:23,80 -m iprange --dst-range 172.16.100.1-172.16.100.120 -j ACCEPT
    17. 3string扩展
    18. 检查报文中出现的字符串;
    19. --algo {bm|kmp}
    20. bm = Boyer-Moore
    21. kmp = Knuth-Pratt-Morris
    22. [!] --string pattern
    23. ~]# iptables -I OUTPUT -m string --algo bm --string 'movie' -j REJECT
    24. 4time扩展
    25. 根据报文到达的时间与指定的时间范围进行匹配;
    26. --datestart
    27. --datestop
    28. --timestart
    29. --timestop
    30. --monthdays
    31. --weekdays
    32. 5connlimit扩展
    33. 根据每客户端IP(也可以是地址块)做并发连接数数量匹配;
    34. --connlimit-above n:连接的数量大于n
    35. --connlimit-upto n: 连接的数量小于等于n
    36. 6limit扩展
    37. 基于收发报文的速率做检查;
    38. 令牌桶过滤器
    39. --limit rate[/second|/minute|/hour|/day]
    40. --limit-burst number
    41. 7state扩展
    42. 根据连接追踪机制检查连接的状态;
    43. 调整连接追踪功能所能够容纳的最大连接数量:
    44. /proc/sys/net/nf_conntrack_max
    45. 已经追踪到并记录下的连接:
    46. /proc/net/nf_conntrack
    47. 不同协议或连接类型追的时长:
    48. /proc/sys/net/netfilter/
    49. 可追踪的连接状态:
    50. NEW:新发出的请求;连接追踪模板中不存此连接相关的信息条目,因此,将其识别为第一次发出的请求;
    51. ESTABLISHEDNEW状态之后,连接追踪模板中为其建立的条目失效之前期间内所进行的通信的状态;
    52. RELATED:相关的连接;如ftp协议的命令连接与数据连接之间的关系;
    53. INVALIED:无法识别的连接;
    54. --state STATE1,STATE2,...
    55. 问题:如何开放被动模式的ftp服务?
    56. (1) 装载ftp追踪时的专用的模块:
    57. # modprobe nf_conntrack_ftp
    58. (2) 放行请求报文:
    59. 命令连接:NEW, ESTABLISHED
    60. 数据连接:RELATED, ESTABLISHED
    61. # iptables -A INPUT -d LocalIP -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j ACCEPT
    62. # iptables -A INPUT -d LocalIP -p tcp -m state --state RELATED,ESTABLISHED -j ACCEPT
    63. (3) 放行响应报文:
    64. ESTABLISEHD
    65. # iptables -A OUTPUT -s LocalIP -p tcp -m state --state ESTABLISHED -j ACCEPT
    66. 如何保存及重载规则:
    67. 保存规则至指定文件:
    68. iptables-save > /PATH/TO/SOMEFILE
    69. 从指定文件重载规则:
    70. iptables-restore < /PATH/FROM/SOMEFILE
    71. CentOS 6:
    72. service iptables save
    73. iptables-save > /etc/sysconfig/iptables
    74. service iptables restart
    75. iptables-restore < /etc/sysconfig/iptables
    76. CentOS 7:
    77. 引入了新的iptables前端管理服务工具:firewalld
    78. firewalld-cmd
    79. firewalld-config
    80. 关于firewalld
    81. http://www.ibm.com/developerworks/cn/linux/1507_caojh/index.html
    82. 练习:
    83. 主机防火墙:
    84. 放行telnet, ftp, web服务;
    85. 放行samba服务;
    86. 放行dns服务(查询和区域传送);
    87. 网络防火墙:
    88. 放行telnet, ftp, web服务;
    89. 放行samba服务;
    90. 放行dns服务(查询和区域传送);

    回顾:
    telnet: 23/tcp
    samba: 137/udp, 138/udp, 139/tcp, 445/tcp
    dns: INPUT: 53/udp, OUTPUT: 53/udp

    1. 核心转发:/proc/sys/net/ipv4/ip_forward
    2. /etc/sysct.conf
    3. net.ipv4.ip_forward = 1
    4. iptables
    5. 显式扩展、网络防火墙
    6. 显式扩展:multiport, iprange, string, time, connlimit, limit, state
    7. state:
    8. /proc/net/nf_conntrack
    9. /proc/sys/net/nf_conntrack_max
    10. NEW, ESTABLISHED, RELATED, INVALID

    iptables:

    1. natNetwork Address Translation,安全性,网络层+传输层
    2. proxy:代理,应用层
    3. nat:
    4. SNAT: 只修改请求报文的源地址;
    5. DNAT:只修改请求报文的目标地址;
    6. nat表:
    7. PREROUTINGDNAT
    8. OUTPUT
    9. POSTROUTINGSNAT
    10. 源地址转换:iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j SNAT --to-source ExtIP
    11. iptables -t nat -A POSTROUTING -s LocalNET ! -d LocalNet -j MASQUERADE
    12. 目标地址转换:iptables -t nat -A PREROUTING -d ExtIP -p tcp|udp --dport PORT -j DNAT --to-destination InterSeverIP[:PORT]
    13. iptables的链接跟踪表最大容量为/proc/sys/net/ipv4/ip_conntrack_max,链接碰到各种状态的超时后就会从表中删除。
    14. 所以解決方法一般有两个:
    15. (1) 加大 ip_conntrack_max
    16. vi /etc/sysctl.conf
    17. net.ipv4.ip_conntrack_max = 393216
    18. net.ipv4.netfilter.ip_conntrack_max = 393216
    19. (2): 降低 ip_conntrack timeout时间
    20. vi /etc/sysctl.conf
    21. net.ipv4.netfilter.ip_conntrack_tcp_timeout_established = 300
    22. net.ipv4.netfilter.ip_conntrack_tcp_timeout_time_wait = 120
    23. net.ipv4.netfilter.ip_conntrack_tcp_timeout_close_wait = 60
    24. net.ipv4.netfilter.ip_conntrack_tcp_timeout_fin_wait = 120
    25. iptables -t nat -L -n
    26. 练习:INPUTOUTPUT默认策略为DROP
    27. 1、限制本地主机的web服务器在周一不允许访问;新请求的速率不能超过100个每秒;web服务器包含了admin字符串的页面不允许访问;web服务器仅允许响应报文离开本机;
    28. 2、在工作时间,即周一到周五的8:30-18:00,开放本机的ftp服务给172.16.0.0网络中的主机访问;数据下载请求的次数每分钟不得超过5个;
    29. 3、开放本机的ssh服务给172.16.x.1-172.16.x.100中的主机,x为你的座位号,新请求建立的速率一分钟不得超过2个;仅允许响应报文通过其服务端口离开本机;
    30. 4、拒绝TCP标志位全部为1及全部为0的报文访问本机;
    31. 5、允许本机ping别的主机;但不开放别的主机ping本机;
    32. 练习:判断下述规则的意义:
    33. # iptables -N clean_in
    34. # iptables -A clean_in -d 255.255.255.255 -p icmp -j DROP
    35. # iptables -A clean_in -d 172.16.255.255 -p icmp -j DROP
    36. # iptables -A clean_in -p tcp ! --syn -m state --state NEW -j DROP
    37. # iptables -A clean_in -p tcp --tcp-flags ALL ALL -j DROP
    38. # iptables -A clean_in -p tcp --tcp-flags ALL NONE -j DROP
    39. # iptables -A clean_in -d 172.16.100.7 -j RETURN
    40. # iptables -A INPUT -d 172.16.100.7 -j clean_in
    41. # iptables -A INPUT -i lo -j ACCEPT
    42. # iptables -A OUTPUT -o lo -j ACCEPT
    43. # iptables -A INPUT -i eth0 -m multiport -p tcp --dports 53,113,135,137,139,445 -j DROP
    44. # iptables -A INPUT -i eth0 -m multiport -p udp --dports 53,113,135,137,139,445 -j DROP
    45. # iptables -A INPUT -i eth0 -p udp --dport 1026 -j DROP
    46. # iptables -A INPUT -i eth0 -m multiport -p tcp --dports 1433,4899 -j DROP
    47. # iptables -A INPUT -p icmp -m limit --limit 10/second -j ACCEPT
    48. 补充:利用iptablesrecent模块来抵御DOS攻击: 22,建立一个列表,保存有所有访问过指定的服务的客户端IP
    49. ssh: 远程连接,
    50. iptables -I INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP
    51. iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --set --name SSH
    52. iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j LOG --log-prefix "SSH Attach: "
    53. iptables -I INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --seconds 300 --hitcount 3 --name SSH -j DROP
    54. 1.利用connlimit模块将单IP的并发设置为3;会误杀使用NAT上网的用户,可以根据实际情况增大该值;
    55. 2.利用recentstate模块限制单IP300s内只能与本机建立2个新连接。被限制五分钟后即可恢复访问。
    56. 下面对最后两句做一个说明:
    57. 1.第二句是记录访问tcp 22端口的新连接,记录名称为SSH
    58. --set 记录数据包的来源IP,如果IP已经存在将更新已经存在的条目
    59. 2.第三句是指SSH记录中的IP300s内发起超过3次连接则拒绝此IP的连接。
    60. --update 是指每次建立连接都更新列表;
    61. --seconds必须与--rcheck或者--update同时使用
    62. --hitcount必须与--rcheck或者--update同时使用
    63. 3.iptables的记录:/proc/net/xt_recent/SSH
    64. 也可以使用下面的这句记录日志:
    65. iptables -A INPUT -p tcp --dport 22 -m state --state NEW -m recent --update --name SSH --second 300 --hitcount 3 -j LOG --log-prefix "SSH Attack"
    66. iptables实现七层访问过滤:
    67. 模块:layer7
    68. 识别应用层协议
    69. iptables/netfilter
    70. iptables -m state,
    71. netfilter state
    72. 对内核中的netfilter,打补丁layer7,重新编译内核
    73. iptables打补丁,补上layer7模块,重新iptables