松鼠Mike的树洞 -- Make Each Day Count
  • 排序
  • 选择时间

iptables的配置

发布日期: 2014-07-16更新日期:2015-08-27

iptables是linux里用来制定通过本地网卡的数据通信规则的一个软件,能过滤转发数据包。是比较常用的防火墙和网络配置程序。下面就把iptables的一些基本知识总结出来备忘。
  1. iptables的表和链
    • filter表:用于实现通过网卡的数据包的过滤。
      1. INPUT链: 处理从外往内到达本地网卡的数据包
      2. OUTPUT链: 处理从内往外离开本地网卡的数据包
      3. FORWARD链: 处理经过本地网卡转发的数据包
    • NAT表:网络地址转换
      1. SNAT固定源地址转换
      2. PANT不固定源地址转换,用于PPP或PPPoE连接
      3. DNAT目的地址转换
      其中包含了一下三条链:
      1. PREROUTING链 数据包到达的时候改变目的地地址。
      2. OUTPUT链 改变本地产生的数据包的目的地地址。
      3. POSTROUTING链 数据包离开的时候改变源地址。
    • MANGLE表:修改数据包的头部信息
      1. PREROUTING链 数据包到达以后,通过路由表获得目的地地址以前
      2. POSTROUTING链 数据包通过路由表获得目的地地址以后
      3. OUTPUT链 离开本地网卡的数据包路由前
      4. INPUT链 到达本地网卡的数据包路由后
      5. FORWARD链 在第一次路由判断之后,最后一次路由判断之前改变数据包
  2. 数据包通过iptables的流程 网络A -> PREROUTING -> 路由 -> [INPUT -> 路由 -> OUTPUT | FORDWARD] -> POSTROUTING -> 网络B
  3. iptables的用法(引用自$ iptables --help)
    iptables -[ACD] chain rule-specification [options]
    iptables -I chain [rulenum] rule-specification [options]
    iptables -R chain rulenum rule-specification [options]
    iptables -D chain rulenum [options]
    iptables -[LS] [chain [rulenum]] [options]
    iptables -[FZ] [chain] [options]
    iptables -[NX] chain
    iptables -E old-chain-name new-chain-name
    iptables -P chain target [options]
    iptables -h (print this help information)
    
    解释如下:
    1. Command
      • --append -A chain Append to chain
      • --check -C chain Check for the existence of a rule
      • --delete -D chain Delete matching rule from chain
      • --delete -D chain rulenum Delete rule rulenum (1 = first) from chain
      • --insert -I chain [rulenum] Insert in chain as rulenum (default 1=first)
      • --replace -R chain rulenum Replace rule rulenum (1 = first) in chain
      • --list -L [chain [rulenum]] List the rules in a chain or all chains
      • --list-rules -S [chain [rulenum]] Print the rules in a chain or all chains
      • --flush -F [chain] Delete all rules in chain or all chains
      • --zero -Z [chain [rulenum]] Zero counters in chain or all chains
      • --new -N chain Create a new user-defined chain
      • --delete-chain -X [chain] Delete a user-defined chain
      • --policy -P chain target Change policy on chain to target
      • --rename-chain -E old-chain new-chain Change chain name, (moving any references)
    2. Options
      • --ipv4 -4 Nothing (line is ignored by ip6tables-restore)
      • --ipv6 -6 Error (line is ignored by iptables-restore)
      • [!] --protocol -p proto protocol: by number or name, eg. 'tcp', 'udp', 'icmp'
      • [!] --source -s address[/mask][...] source specification
      • [!] --destination -d address[/mask][...] destination specification
      • [!] --in-interface -i input name[+] network interface name ([+] for wildcard), e.g. 'eth0'
      • --jump -j target target for rule (may load target extension)
      • --goto -g chain jump to chain with no return
      • --match -m match extended match (may load extension)
      • --numeric -n numeric output of addresses and ports
      • [!] --out-interface -o output name[+] network interface name ([+] for wildcard), e.g. 'eth0'
      • --table -t table table to manipulate (default: `filter')
      • --verbose -v verbose mode
      • --wait -w wait for the xtables lock
      • --line-numbers print line numbers when listing
      • --exact -x expand numbers (display exact values)
      • [!] --fragment -f match second or further fragments only
      • --modprobe= try to insert modules using this command
      • --set-counters PKTS BYTES set the counter during insert/append
      • [!] --version -V print package version.
    3. -j Target for rule
      • ACCEPT 允许
      • REJECT 拒绝
      • DROP 拒绝并提示信息
      • SNAT 源地址转换
      • DNAT 目标地址转换
      • REDIRECT 重定向
      • MASQUERAED 地址伪装
      • LOG --log-prefix "" 记录日志
  4. 一个服务器常用的脚本
    iptables -F
    iptables -X
    iptables -Z
    iptables -A INPUT -i lo -j ACCEPT
    iptables -A INPUT -p tcp --dport 22 -j ACCEPT
    iptables -A INPUT -p tcp --dport 80 -j ACCEPT
    iptables -A INPUT -p tcp --dport 443 -j ACCEPT
    iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
    iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
    iptables -P INPUT DROP
    iptables -P FORWARD DROP
    iptables -P OUTPUT ACCEPT
    
  5. iptables的保存 对于iptables的操作如果不做保存将在重新启动以后全部清空,所以如果想要更改过的iptables能长期有效就需要在改动后保存下来。Ubuntu下可以使用iptables-save命令来进行保存。如果没有的话可以apt-get install一下。具体为
    1. iptables-save > /etc/iptables.rules
    2. 在/etc/network/interfaces的末尾添加pre-up iptables-restore < /etc/iptables.rules
    3. 在上面的pre-up下面再添加post-down iptables-save > /etc/iptables.rules可以让ubuntu在切断网络连接以后自动保存在这之前改动过的iptables命令,而不需要在手动敲一遍iptables-save命令。