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 鏈將直接忽略 。