1. 程式人生 > >iptables 簡單介紹及應用 Linux防火墻

iptables 簡單介紹及應用 Linux防火墻

報文 防火 哪裏 慢慢 and 假設 命令 class dna

iptables 即 Linux防火墻 的簡單介紹及使用

iptables生效位置如下圖:

  其中, 網絡防火墻也可以使用一臺啟用了iptables的Linux主機代替; 路由器或集線器等設施在拓撲中省略了;

技術分享圖片

那麽上圖顯示出了iptables在哪裏, 下面說一下iptables的工作原理:

我們知道Linux中所有的數據包接收和發送都是在 內核 中完成的, 但是iptables並不是工作在內核中的, 那如何實現防火墻的功能?

iptables工作在用戶空間, 並向工作在內核中的netfilter定義規則, 由netfilter來完成過濾數據包的功能; netfilter是內核提供的框架;

技術分享圖片

那麽iptables是怎麽指揮的呢? (iptables規則定義, 四表五鏈)

技術分享圖片

五鏈包括: INPUT, OUTPUT, FORWARD, PREROUTING, POSTROUTING, 位置請參照上圖, 如有不對請指正;

四表包括: filter <-- nat <-- mangle <-- raw (有優先級順序)

鏈表的功能實現:

filter: 過濾: INPUT, FORWARD, OUTPUT
nat: PREROUTING (DNAT做目標地址轉換), OUTPUT, POSTROUTING(SNAT, 目標地址轉換)
mangle: 拆解報文, 全部位置

raw: 連接追蹤, PREROUTING, OUTPUT

  註意: 連接追蹤是一件比較耗資源的事情, 一般情況下不要使用;

小結: iptables用四表五鏈來設定過濾報文的規則, 而netfilter則根據大哥設定的規則辦事;

那麽我們下面就簡單描述一下iptables的命令應用:

iptables命令使用:

  iptables [-t table] SUBCOMMAND CHAIN CRETERIA -j TARGET

   作用於哪個表 子命令 匹配標準 處理動作

  -t table 省略時, 默認作用於filter

具體使用說明請查看 鏈接, 詳細易懂

iptables -t 表名 <-A/I/D/R> 規則鏈名 [規則號] <-i/o 網卡名> -p 協議名 <-s 源IP/源子網> --sport 源端口 <-d 目標IP/目標子網> --dport 目標端口 -j 動作

我們列幾個常用的:

  查看: iptables -L -n

  清空: iptables -F

  刪除空的自定義鏈: iptables -X

  設定指定鏈的默認策略: iptables -P {INPUT | OUTPUT | ... } {DROP | ACCEPT | REJECT ... }

我們假設你已經看過了上面的鏈接, 並了解了 -s -d -p -i -o 這些選項的含義, 那麽下面就舉幾個簡單實例:

首先, 我們打開一臺CentOS 7 的虛擬機, 使用 iptables -L -n 查看當前規則設定:

  註意: 如果發現規則比較多, 可以先禁用Firewalld, 並使用 iptables -F && iptables -X 清理, 然後再顯示;

    備註: 禁用 firewalld 方法: systemctl disable firewalld

技術分享圖片

這時, 我們是通過 ssh 遠程登陸到 Linux的, 那麽我們首先要確保 ssh 登陸的 通過性, 換句話說, 就是, 開放 22 端口的INPUT和OUTPUT

# iptables -I INPUT -d 你的Linux的IP地址 -p tcp -dport 22 -j ACCEPT

# iptables -I OUTPUT -s 你的Linux的IP地址 -p tcp -sport 22 -j ACCEPT

接下來, 我們將 INPUT 和 OUTPUT 的默認策略改為 DROP

# iptables -P INPUT DROP

# iptables -P OUTPUT DROP

不出意外的話, 如果你的主機上有80端口提供web服務, 那麽現在已經無法訪問了; 為什麽呢?

因為我們 DROP 掉了所有的包, 除了訪問22端口的, 和從22端口響應出去的;

為什麽我要先說明 開放22端口 呢? 因為我第一次設置的時候, 先改了INPUT的默認策略為DROP, 然後我就被自己鎖在門外面了......

那麽, 現在我需要讓web服務能夠訪問:

# iptables -I INPUT -d 你的Linux的IP地址 -p tcp -dport 80 -j ACCEPT

# iptables -I OUTPUT -s 你的Linux的IP地址 -p tcp -sport 80 -j ACCEPT

那這樣一來, 豈不是跟上面開放22端口一模一樣, 只是換了個端口? 對, 就是換了個端口...

有沒有辦法能夠一次搞定呢? 有:

# iptables -I INPUT -d 你的Linux的IP地址 -p tcp -m multiport --dports 22,80 -j ACCEPT

# iptables -I OUTPUT -s 你的Linux的IP地址 -p tcp -m multiport --sports 22,80 -j ACCEPT

-m 是什麽呢?

顯式擴展: 必須顯式指明使用的擴展模塊; 查看當前主機支持的擴展模塊方法: rpm -ql iptables | grep "\.so"

有關顯式擴展的文章

如何保存及重載規則:

保存規則至指定文件:
iptables-save > /root/iptables.1 存儲當前防火墻規則

從指定文件重載規則:
iptables-restore < /root/iptables.1 讀取並啟用以保存的防火墻規則

上文提到過使用Linux做為網絡防火墻來使用, 下面簡單介紹下:

  • 準備: Linux主機四臺, 一臺做網絡防火墻,配置兩個網卡; 一臺做外網主機; 兩臺做內網主機;
  • 網絡防火墻主機: 一個網卡對內, 設置ip地址為 192.168.50.1/24; 一個網卡對外
  • 需要打開Linux的地址轉發功能:
    • sysctl -w net.ipv4.ip_forward=1
    • cat /proc/sys/net/ipv4/ip_forward 為1
  • 內網主機: 添加 192.168.50.0/24 的任意一個地址
  • 外網主機: 添加路由規則 route add -net 192.168.50.0/24 gw 10.0.0.5 --> 註意此處用的是外網主機同一網段IP地址
  • 測試ping
  • 網絡防火墻主機設置 iptables 的 FORWARD 鏈
    # iptables -P FORWARD DROP
    # iptables -I FORWARD -d 192.168.50.2 -p tcp --dport 80 -j ACCEPT --> 放行進來的
    # iptables -I FORWARD -s 192.168.50.2 -p tcp --sport 80 -j ACCEPT --> 放行出去的
  • 同時放行httpd和ssh服務
    # iptables -I FORWARD -m state --state ESTABLISHED -j ACCEPT
    # iptables -A FORWARD -d 192.168.50.2 -p tcp -m multiport --dports 22,80 -m state --state NEW -j ACCEPT

  • 外網主機需要訪問內網ftp服務器怎麽辦?
    • 網絡防火墻 完成上面的三步走
      # modprobe nf-conntrack_ftp --> 加載模塊
      # iptables -R FORWARD 1 -m state --state RELATED,ESTABLISHED --> 添加RELATED規則
      # iptables -R FORWARD 2 -d 192.168.50.2 -p tcp -m multiport --dports 21,22,80 -m state --state NEW -j ACCEPT

總結: iptables的使用靈活多變, 稍顯復雜, 但只要弄懂了原理, 再復雜的規則也經不起慢慢推敲;

iptables 簡單介紹及應用 Linux防火墻