iptables

iptables

Posted by nomadli on September 22, 2017

内核

  • 数组[proto][hooks]
  • proto AP_INET(PF_INET) AP_INET6…
  • hooks PRE_ROUTING LOCAL_IN FORWARD LOCAL_OUT POST_ROUTING
    • PRE_ROUTING -> FORWARD -> POST_ROUTING
    • PRE_ROUTING -> LOCAL_IN
    • LOCAL_OUT -> POST_ROUTING

iptable 提供了 raw filter nat mangle 表操作hooks点

  • 表排名分先后
    • raw 决定是否进行数据跟踪和nat -j xxx 应用于 PRE_ROUTING LOCAL_OUT
    • mangle 包修改 数据修改应用于 所有hook
    • nat 网络地址转换 PRE_ROUTING LOCAL_OUT POST_ROUTING
    • filter 包过滤 LOCAL_IN LOCAL_OUT FORWARD
  • 现有表 cat /proc/net/ip_tables_names
  • -t 指定操作表名,默认filter

命令(command)

  • -A 在指定链的末尾添加一条新的规则
  • -D 删除指定链中的某一条规则,可以按规则序号和内容删除
  • -I 在指定链中插入一条新的规则,默认在第一行添加
  • -R 修改、替换指定链中的某一条规则,可以按规则序号和内容替换
  • -L 列出指定链中所有的规则进行查看
  • -E 重命名用户定义的链,不改变链本身
  • -F 清空(flush)
  • -N 新建一条用户自己定义的规则链
  • -X 删除指定表中用户自定义的规则链
  • -P 设置指定链的默认策略
  • -Z 将所有表的所有链的字节和数据包计数器清零
  • -n 使用数字形式显示输出结果
  • -v 查看规则表详细信息的信息
  • -V 查看版本
  • -h 获取帮助

入站链(chain) 排名分先后

  1. PREROUTING(nat mangle raw)内核判断是否为本机数据
  2. INPUT(filter mangle) 用户空间输入过滤

转发链(chain) 排名分先后

  1. PREROUTING(nat mangle raw)内核判断是否为本机数据
  2. FORWARD(filter mangle) 内核判断
  3. POSTROUTING(nat raw mangle)输出内核过滤

出站链(chain) 排名分先后

  1. OUTPUT(filter nat mangle raw) 用户空间输出过滤
  2. POSTROUTING(nat raw mangle)输出内核过滤

条件(condition)

  • -p TCP UDP ICMP all /etc/protocols 中任意name
  • -s networ name hostname 192.0../24 IP 源地址
  • -d networ name hostname 192.0../24 IP 目的地址
  • -i eth0 eth+ 入口设备
  • -o eth0 eth+ 出口设备
  • –sport 80 80:8080 源端口或范围
  • –dport 80 80:8080 目的端口或范围

结果(target)

  1. ACCEPT 允许数据包通过
  2. DROP 丢弃数据包不响应
  3. REJECT 拒绝数据包并发送拒绝响应 –reject-with tcp-reset
  4. LOG 记录日志并检查下一条规则 –log-prefix “…”
  5. REDIRECT 重新导向另一端口并继续检查规则 –to–ports
  6. MASQUERADE 修改源IP为当前IP可指定端口并继续 –to–ports
  7. SNAT 修改源IP或端口,并继续 –to-souce 10.1..-10.2..:2-9
  8. DNAT 修改目标IP后端口,并继续 –to-destination 1.1..-1.2..:2-9
  9. MIRROR 将源和目的地址互换并发回。
  10. QUEUE 放入队列等待用户防火墙程序处理
  11. RETURN 结束当前子过滤程序并返回上一级过滤继续执行
  12. MARK 做标记继续下面的规则 –set-mark 2

iptables 语法

  1. iptables [-t filter] command [chian] [condtion] [-j target]

举例

  • service iptables save 保存规则到/etc/sysconfig/iptables
  • iptables -D INPUT 1 删除IPUT链的filter表的第一条规则
  • iptables -I INPUT -p icmp -j REJECT 拒绝进入防火墙的所有ICMP协议包
  • iptables -A FORWARD -p ! icmp -j ACCEPT 允许转发除ICMP协议外所有数据包
  • iptables -nL –line-number -t nat 显示nat表所有管道的规则及行号

firewalld

  • 动态防火墙
  • /etc/firewalld/优先加载
  • /usr/lib/firewalld/
  • 9个区域
    • trusted(信任区域) 允许所有的传入流量
    • public(公共区域) 允许ssh等预定义服务的传入流量,默认区域包含所有网卡
    • external(外部区域) 允许ssh等预定义服务的传入流量,做伪路由
    • home(家庭区域) 允许ssh(更多)等预定义服务的传入流量
    • internal(内部区域) 默认值与homel区域相同
    • work(工作区域) 允许ssh等预定义服务的传入流量
    • nm-share
    • dmz(隔离 非军事区域) 允许ssh等预定义服务的传入流量
    • block(限制区域) 拒绝所有传入流量
    • drop(丢弃区域) 丢弃所有传入流量,并且不产生包含ICMP的错误响应
  • 根据源IP:PORT IP PORT 的顺序筛选区域判断规则,无对应规则使用public
  • firewall-cmd 命令行规则配置、firewall-config 图形配置界面、直接编辑xml ```shell firewall-cmd -h, –help #帮助 -V, –version #版本信息 -q, –quiet #不输出状态信息 –state #当前状态 –reload #重新加载配置,保持已有链接 –complete-reload #重新加载配置,断开所有链接 –list-all #查看当前配置概览 –get-log-denied #当前拒绝日志级别 –set-log-denied=all|unicast|broadcast|multicast|off –check-config #检测当前保存配置是否有误 –panic-on #启用拒绝所有包模式 –panic-off #禁用拒绝所有包模式 –query-panic #是否启用拒绝所有包模式 –permanent #指定针对保存的配置、或修改保存的配置 –runtime-to-permanent #将临时规则保存,成为永久规则 –timeout= #'s' or 'm' or 'h'规则启用时长

    –get-default-zone #显示当前默认区域 –set-default-zone=zone #设置默认区域 –get-active-zones #当前正在使用的区域及对应网卡 [–permanent] –get-zones #显示所有预定义的区域 [–permanent] –get-zone-of-interface=l #显示指定网卡绑定的区域 [–permanent] –get-zone-of-source=ip/24|mac|ipset:ipset [–permanent] –list-all-zones #显示所有区域及其规则 –permanent –new-zone=zone #创建一个新的区域 –permanent –new-zone-from-file=path [–name=zone] –permanent –delete-zone=zone #删除一个区域 –permanent –load-zone-defaults=zone #加载区域默认配置 –info-zone=zone #显示指定区域的规则 –permanent –path-zone=zone #显示指定区域保存路径 –zone=zone #指定某个区域作为后面子命令的目标

    –get-policies #显示预定义策略 –get-active-policies #显示当前使用的策略规则 –list-all-policies #显示所有策略的规则及配置 –new-policy= #添加一个策略 --permanent --new-policy-from-file=path [--name=policy] --delete-policy= #删除一个策略 --load-policy-defaults= #加载指定策略的默认规则 --info-policy= #显示某策略的规则及配置 --path-policy= #显示某策略保存路径 --policy= #指定某个策略作为后面子命令的目标

    –get-ipset-types #显示支持的ipset类型 –new-ipset= --type= [--option=[=]].. --permanent --new-ipset-from-file=path [--name=] --permanent --delete-ipset= #删除指定的ipset --permanent --load-ipset-defaults= --info-ipset= #显示指定ipset的配置 --permanent --path-ipset= #显示指定ipset的保存路径 --get-ipsets #显示预定义ipset --permanent --ipset= --set-description="xx" --permanent --ipset= --get-description --permanent --ipset= --set-short="sort description" --permanent --ipset= --get-short #显示指定ipset的简短说明 [--permanent] --ipset= --add-entry= [--permanent] --ipset= --remove-entry= [--permanent] --ipset= --query-entry= [--permanent] --ipset= --get-entries [--permanent] --ipset= --add-entries-from-file= [--permanent] --ipset= --remove-entries-from-file=

    [–permanent] –get-icmptypes #显示所有预定义的ICMP类型 –permanent –new-icmptype= #添加icmp类型 --permanent --new-icmptype-from-file= [--name=] --permanent --delete-icmptype=#删除icmp类型 --permanent --load-icmptype-defaults= --info-icmptype= #显示icmptype的配置信息 --permanent --path-icmptype= #显示icmptype配置保存路径 --permanent --icmptype= --set-description="xxx" --permanent --icmptype= --get-description --permanent --icmptype= --set-short="sort description" --permanent --icmptype= --get-short --permanent --icmptype= --add-destination=ipv4/ipv6:ip/24 --permanent --icmptype= --remove-destination=ipv4/ipv6:ip/24 --permanent --icmptype= --query-destination=ipv4/ipv6:ip/24 --permanent --icmptype= --get-destinations

    [–permanent] –get-services #显示所有预定义的服务 –permanent –new-service= #添加新服务 --permanent --new-service-from-file=path [--name=] --permanent --delete-service= #删除服务 --permanent --load-service-defaults= --info-service= #显示服务配置 --permanent --path-service= #显示服务保存地址 --permanent --service= --set-description="xxx" --permanent --service= --get-description --permanent --service= --set-short="short description" --permanent --service= --get-short --permanent --service= --add-port=[-port]/ --permanent --service= --remove-port=[-port]/ --permanent --service= --query-port=[-port]/ --permanent --service= --get-ports --permanent --service= --add-protocol= --permanent --service= --remove-protocol= --permanent --service= --query-protocol= --permanent --service= --get-protocols --permanent --service= --add-source-port=<p>[-p]/ --permanent --service= --remove-source-port=<p>[-p]/ --permanent --service= --query-source-port=<p>[-p]/ --permanent --service= --get-source-ports --permanent --service= --add-helper= --permanent --service= --remove-helper= --permanent --service= --query-helper= --permanent --service= --get-service-helpers --permanent --service= --set-destination=:<address>[/] --permanent --service= --remove-destination= --permanent --service= --query-destination=:[/] --permanent --service= --get-destinations --permanent --service= --add-include= --permanent --service= --remove-include= --permanent --service= --query-include= --permanent --service= --get-includes

    –get-helpers #显示预定义helper列表 –permanent –new-helper= --module= [--family=] --permanent --new-helper-from-file= [--name=] --permanent --delete-helper= #删除helper --permanent --load-helper-defaults= --info-helper= #显示helper信息 --permanent --path-helper= #显示helper保存路径 --permanent --helper= --set-description= --permanent --helper= --get-description --permanent --helper= --set-short= --permanent --helper= --get-short --permanent --helper= --add-port=[-]/ --permanent --helper= --remove-port=[-port>]/ --permanent --helper= --query-port=[-]/ --permanent --helper= --get-ports --permanent --helper= --set-module= --permanent --helper= --get-module --permanent --helper= --set-family={ipv4|ipv6|} --permanent --helper= --get-family

    #[P] permanent #[Z] zone= #[O] policy= #[T] timeout= –<P|Z|O> –list-all #显示指定类型的所有对象 –permanent –<Z|O> –set-description= --permanent --<Z|O> --get-description #显示指定类型的描述 --permanent --<Z|O> --get-target #获取指定类型的目标 --permanent --<Z|O> --set-target= --<Z|O> --set-short= #设置指定类型的短描述 --permanent --<Z|O> --get-short #显示指定类型的短描述 --<P|Z> --list-services #显示之地类型中的服务列表 --<P|Z|O|T> --add-service= #添加服务到指定类型中 --<P|Z|O> --remove-service= #从指定类型中删除服务 --<P|Z|O> --query-service= #查询指定类型中是否有指定服务 --<P|Z|O> --list-ports #显示指定类型中设置的端口 --<P|Z|O|T> --add-port=[-port]/ --<P|Z|O> --remove-port=[-]/ --<P|Z|O> --query-port=[-]/ --<P|Z|O> --list-protocols #显示指定类型中设置的协议列表 --<P|Z|O|T> --add-protocol= #添加协议到指定类型中 --<P|Z|O> --remove-protocol= #从指定类型中删除指定协议 --<P|Z|O> --query-protocol= #查询指定类型中是否有指定协议 --<P|Z|O> --list-source-ports #显示指定类型中配置的端口 --<P|Z|O|T> --add-source-port=[-]/ --<P|Z|O> --remove-source-port=[-]/ --<P|Z|O> --query-source-port=[-]/ --<P|Z|O> --list-icmp-blocks #显示指定类型是否有icmp类型 --<P|Z|O|T> --add-icmp-block= #在指定类型中添加icmp类型 --<P|Z|O> --remove-icmp-block=#删除指定类型中icmp类型 --<P|Z|O> --query-icmp-block= #查询指定类型中是否有icmp类型 --<P|Z|O> --list-forward-ports #显示指定类型的转发端口 --<P|Z|O|T> --add-forward-port=port=[-sport]:proto=[:toport=dport[-dport]][:toaddr=<address>[/]] --<P|Z|O> --remove-forward-port=port=[-]:proto=[:toport=[-]][:toaddr=<address>[/]] --<P|Z|O> --query-forward-port=port=[-]:proto=[:toport=[-]][:toaddr=<address>[/]] --<P|Z|O|T> --add-masquerade #在指定类型上添加nat转换 --<P|Z|O> --remove-masquerade #删除指定类型上的nat转换 --<P|Z|O> --query-masquerade #查询指定类型上是否有nat转换 --<P|Z|O> --list-rich-rules #显示指定类型上复杂规则 --<P|Z|O|T> --add-rich-rule= #在指定类型上添加复杂规则 --<P|Z|O> --remove-rich-rule= #在指定类型上删除复杂规则

    –<P Z O> –query-rich-rule= #查询指定类型上是否有指定复杂规则
    –<P Z> –add-icmp-block-inversion #在指定类型启用icmp阻止规则反转  
    –<P Z> –remove-icmp-block-inversion #失效指定类型icmp阻止规则反转  
    –<P Z> –query-icmp-block-inversion #查询指定类型是否启用icmp阻止规则反转  
    –<P Z T> –add-forward #启用指定类型的包转发
    –<P Z> –remove-forward #禁用指定类型的包转发  
    –<P Z> –query-forward #查询指定类型是否启用包转发  
    –<P O> –get-priority #显示指定策略优先级
    –<P O> –set-priority= #设置指定策略优先级
    –<P O> –list-ingress-zones #显示指定策略in流量涉及的区域
    –<P O> –add-ingress-zone= #为指定策略添加in流量区域
    –<P O> –remove-ingress-zone= #移除指定策略in流量区域
    –<P O> –query-ingress-zone= #查询指定策略in流量是否有指定区域
    –<P O> –list-egress-zones #显示指定策略out流量涉及的区域
    –<P O> –add-egress-zone= #为指定策略添加out流量区域
    –<P O> –remove-egress-zone= #移除指定策略out流量区域
    –<P O> –query-egress-zone= #查询指定策略out流量是否有指定区域
    –<P Z> –list-sources #显示指定区域源列表    
    –<P Z> –add-source=[/] ipset:
    –<P Z> –change-source=[/] ipset:
    –<P Z> –query-source=[/] ipset:
    –<P Z> –remove-source=[/] ipset:
    –<P Z> –list-interfaces #显示指定区域网卡列表    
    –<P Z> –add-interface= #为指定区域添加网卡    
    –<P Z> –change-interface= #修改指定区域网卡    
    –<P Z> –query-interface= #查询指定区域是否包含指定网卡    
    –<P Z> –remove-interface= #删除指定区域的指定网卡    

    #类似iptable的规则 [–permanent] –direct –get-all-chains #获取网络栈列表 [–permanent] –direct –get-chains {ipv4|ipv6|eb} <table> [–permanent] –direct –add-chain {ipv4|ipv6|eb} <table> [--permanent] --direct --remove-chain {ipv4|ipv6|eb} <table> [--permanent] --direct --query-chain {ipv4|ipv6|eb} <table> [--permanent] --direct --get-all-rules #获取所有规则 [--permanent] --direct --get-rules {ipv4|ipv6|eb} <table> [--permanent] --direct --add-rule {ipv4|ipv6|eb} <table> ... [--permanent] --direct --remove-rule {ipv4|ipv6|eb} <table> ... [--permanent] --direct --remove-rules {ipv4|ipv6|eb} <table> [--permanent] --direct --query-rule {ipv4|ipv6|eb} <table> ... [--permanent] --direct --passthrough {ipv4|ipv6|eb} ... [--permanent] --direct --get-all-passthroughs [--permanent] --direct --get-passthroughs {ipv4|ipv6|eb} ... [--permanent] --direct --add-passthrough {ipv4|ipv6|eb} ... [--permanent] --direct --remove-passthrough {ipv4|ipv6|eb} ... [--permanent] --direct --query-passthrough {ipv4|ipv6|eb} ...

    –lockdown-on #开启lockdown –lockdown-off #禁用lockdown –query-lockdown #查询lockdown状态 [–permanent] –list-lockdown-whitelist-commands [–permanent] –add-lockdown-whitelist-command= [–permanent] –remove-lockdown-whitelist-command= [–permanent] –query-lockdown-whitelist-command= [–permanent] –list-lockdown-whitelist-contexts [–permanent] –add-lockdown-whitelist-context= [--permanent] --remove-lockdown-whitelist-context= [--permanent] --query-lockdown-whitelist-context= [--permanent] --list-lockdown-whitelist-uids [--permanent] --add-lockdown-whitelist-uid= [--permanent] --remove-lockdown-whitelist-uid= [--permanent] --query-lockdown-whitelist-uid= [--permanent] --list-lockdown-whitelist-users [--permanent] --add-lockdown-whitelist-user= [--permanent] --remove-lockdown-whitelist-user= [--permanent] --query-lockdown-whitelist-user=

firewall-cmd –permanent –add-rich-rule=”rule family=”ipv4” source address=”192.168.142.166” port protocol=”tcp” port=”5432” accept” ```