iptables使用详解( 四 )

iptables-save > /etc/iptables.conf 这一步,每次修改后都要做

  • 第二步,在/etc/rc.local中添加命令iptables-restore < /etc/iptables.conf 。从此之后,每次重启,系统会自动从/etc/iptables.conf恢复对应的iptables配置 。这一步只需要做一次
  • ubuntu安装iptables-persistent,它会在系统启动时,从/etc/iptables/rules.v4/etc/iptables/rules.v6分别加载ipv4 和ipv6的iptables 规则
    sudo apt install iptables-persistent所以,每次我们对iptables进行了任何改动 , 使用下面的命令 , 将当前生效的iptables配置,导出到/etc/iptables/rules.v4/etc/iptables/rules.v6即可
    sudo iptables-save > /etc/iptables/rules.v4 //如果添加了ipv4 规则,执行这步sudo ip6tables-save > /etc/iptables/rules.v6 //如果添加了ipv6规则,执行这步自定义链除了在现有的链中添加规则,我们也可以自定义链,自定义链可以帮助我们将一组规则收纳在一起,方便我们管理 。比如:
    1. 我们可以定义一个名为ssh-rules的链来管理ssh登录的一些规则
    iptables -t filter -N ssh-rules
    1. 在这个链中添加具体的规则
    iptables -t filter -A ssh-rules -s 18.130.0.0/16 -j ACCEPTiptables -t filter -A ssh-rules -s 18.11.0.0/16 -j ACCEPTiptables -t filter -A ssh-rules -j DROP
    1. 然后将该链作为一个规则出口,挂在到iptable内置的链上 。
    iptables -A INPUT -p tcp -m tcp --dport 22 -j ssh-rules以上含义就是在Input链中添加一个规则,所有22号端口的访问,都会导向ssh-rules再次强调: 只要不指定具体使用的表,默认都是filter表
    删除自定义链当我们想要删除自定义链时,使用命令:iptables -X ssh-rules
    如何屏蔽docker 暴露的端口一般我们会在filter中的input链中 , 配置对某个端口的限制 。但是在装有docker的linux服务器上,docker暴露的任何端口,我们却无法通过在filter表中的input链的规则进行限制,这是为什么呢? 我们通过上文的对整个iptables的工作机制,来拆解下原因 。
    访问docker服务时,iptables的工作机制比如,我们在docker 中启动一个mysql,暴露端口是3306 。docker宿主机所在ip: 192.168.31.102 。docker 服务启动的虚拟网段:172.17.0.1/16  ,  启动的mysql在该虚拟网络的ip是: 172.17.0.2
    iptables使用详解

    文章插图

    iptables使用详解

    文章插图
    该机器真正的网口是enp0s3 。docker 启动的虚拟网口是docker0
    docker服务本身会在iptables中插入很多规则,甚至定义许多自定义化的链
    当我们我们在192.68.31.23 这台机器上访问192.168.31.102的3306端口时 。
    首先数据包被nat表中PREROUTING链命中
    iptables使用详解

    文章插图
    该链中的规则会被命中 , 同时将数据包导向nat表的DOCKER 链
    nat中的DOCKER链修改目标地址
    iptables使用详解

    文章插图
    • 第一条规则的输入网口是docker0,显然从192.168.31.102外部访问该机器不可能走这个网口进入,因为docker建立了虚拟网络 , 不可能被外部访问 , 所以第一条规则不会命中
    • 第二条规则的输入网口是!docker0,表示非docker网络 , 该规则能被匹配 。由于mysql 实际安装在docker内,如果最终要实现访问,就要对请求包的目标地址进行修改,于是该条规则在匹配后的动作是:tcp dpt:3306 to:172.17.0.2:3306,即将目标网络端口改成docker网段下的172.17.0.2:3306
    路由决策到filter中的forward链
    iptables使用详解

    文章插图
    由于prerouting对包进行了目标地址的修改,于是路由决策会将该包路由到foward链 。所有表中的input 链将直接忽略 。