*
# 25 個最常用的 Linux IPTables 規則示例
乍一看,IPTables 規則可能看起來很神秘。
在本文中,我給出了 25 條實用的 IPTables 規則,您可以復制/粘貼這些規則并根據需要使用它們。
這些示例將作為您調整這些規則以滿足您的特定要求的基本模板。
為便于參考,所有這 25 條 iptables 規則均采用 shell 腳本格式:[iptables-rules](https://bbs.huaweicloud.com/blogs/300486)
### 1\. 刪除現有規則
在開始構建新規則集之前,您可能需要清除所有默認規則和現有規則。使用如下所示的iptables flush 命令來執行此操作。
~~~javascript
iptables -F
(或者)
iptables --flush
~~~
### 2\. 設置默認鏈策略
默認的鏈策略是 ACCEPT。對于所有 INPUT、FORWARD 和 OUTPUT 鏈,將其更改為 DROP,如下所示。
~~~javascript
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT DROP
~~~
當您將 INPUT 和 OUTPUT 鏈的默認策略設置為 DROP 時,對于您擁有的每個防火墻規則要求,您應該定義兩個規則。即一種用于傳入,一種用于傳出。
在下面的所有示例中,每個場景都有兩個規則,因為我們已將 DROP 設置為 INPUT 和 OUTPUT 鏈的默認策略。
如果您信任內部用戶,則可以省略上面的最后一行。即默認情況下不要丟棄所有傳出數據包。在這種情況下,對于您擁有的每個防火墻規則要求,您只需定義一個規則。即只為傳入定義規則,因為所有數據包都接受傳出。
### 3\. 阻止特定的 ip 地址
在我們繼續進行其他示例之前,如果您想阻止特定的 ip 地址,您應該首先執行如下所示的操作。將下面示例中的“xxxx”更改為您要阻止的特定IP地址。
~~~javascript
BLOCK_THIS_IP="xxxx"
iptables -A INPUT -s "$BLOCK_THIS_IP" -j DROP
~~~
當您從日志文件中的特定 ip 地址中發現一些奇怪的活動時,這很有用,并且您希望在進一步研究時暫時阻止該 ip 地址。
您還可以使用以下變體之一,該變體僅阻止此 IP 地址的 eth0 連接上的 TCP 流量。
~~~javascript
iptables -A INPUT -i eth0 -s "$BLOCK_THIS_IP" -j DROP
iptables -A INPUT -i eth0 -p tcp -s "$BLOCK_THIS_IP" -j DROP
~~~
### 4\. 允許所有傳入的 SSH
以下規則允許 eth0 接口上的所有傳入 ssh 連接。
~~~javascript
iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
~~~
### 5\. 僅允許來自特定網絡的傳入 SSH
以下規則僅允許來自 192.168.100.X 網絡的傳入 ssh 連接。
~~~javascript
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
~~~
在上面的示例中,您還可以使用完整的子網掩碼來代替 /24。即“192.168.100.0/255.255.255.0”。
### 6\. 允許傳入的 HTTP 和 HTTPS
以下規則允許所有傳入的 Web 流量。即到端口 80 的 HTTP 流量。
~~~javascript
iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
~~~
以下規則允許所有傳入的安全 Web 流量。即到端口 443 的 HTTPS 流量。
~~~javascript
iptables -A INPUT -i eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A 輸出 -o eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
~~~
### 7\. 使用 MultiPorts 將多個規則組合在一起
當您允許來自外部世界的傳入連接到多個端口時,您可以使用多端口擴展將它們組合在一起,而不是為每個端口編寫單獨的規則,如下所示。
以下示例允許所有傳入的 SSH、HTTP 和 HTTPS 流量。
~~~javascript
iptables -A INPUT -i eth0 -p tcp -m multiport --dports 22,80,443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp -m multiport --sports 22,80,443 -m state --state ESTABLISHED -j ACCEPT
~~~
### 8\. 允許傳出 SSH
以下規則允許傳出 ssh 連接。即當您從內部 ssh 到外部服務器時。
~~~javascript
iptables -A OUTPUT -o eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
~~~
請注意,這與傳入規則略有不同。即我們在 OUTPUT 鏈上允許 NEW 和 ESTABLISHED 狀態,而在 INPUT 鏈上只允許 ESTABLISHED 狀態。對于傳入規則,反之亦然。
### 9\. 只允許傳出 SSH 到特定網絡
以下規則僅允許傳出 ssh 連接到特定網絡。即你的 ssh 只能從內部連接到 192.168.100.0/24 網絡。
~~~javascript
iptables -A OUTPUT -o eth0 -p tcp -d 192.168.100.0/24 --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
~~~
### 10\. 允許傳出 HTTPS
以下規則允許傳出安全 Web 流量。當您希望允許用戶訪問 Internet 流量時,這很有用。在服務器上,當您想使用 wget 從外部下載某些文件時,這些規則也很有用。
~~~javascript
iptables -A OUTPUT -o eth0 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
~~~
注意:對于傳出的 HTTP 網絡流量,添加兩個類似上面的額外規則,并將 443 更改為 80。
### 11\. 負載平衡傳入的 Web 流量
您還可以使用 iptables 防火墻規則對傳入的 Web 流量進行負載平衡。
這使用 iptables 第 n 個擴展。以下示例將 HTTPS 流量負載平衡到三個不同的 ip 地址。對于每 3 個數據包,它將負載平衡到適當的服務器(使用計數器 0)。
~~~javascript
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 0 -j DNAT --to-destination 192.168.1.101:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 1 -j DNAT --to-destination 192.168.1.102:443
iptables -A PREROUTING -i eth0 -p tcp --dport 443 -m state --state NEW -m nth --counter 0 --every 3 --packet 2 -j DNAT --to-destination 192.168.1.103:443
~~~
### 12\. 允許從外到內 Ping
以下規則允許外部用戶能夠 ping 您的服務器。
~~~javascript
iptables -A INPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A OUTPUT -p icmp --icmp-type echo-reply -j ACCEPT
~~~
### 13.允許從內到外ping
以下規則允許您從內部 ping 到任何外部服務器。
~~~javascript
iptables -A OUTPUT -p icmp --icmp-type echo-request -j ACCEPT
iptables -A INPUT -p icmp --icmp-type echo-reply -j ACCEPT
~~~
### 14\. 允許環回訪問
您應該允許在您的服務器上進行完全環回訪問。即使用 127.0.0.1 訪問
~~~javascript
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT
~~~
### 15\. 允許內部網絡到外部網絡。
在一個以太網卡連接到外部,另一個以太網卡連接到內部服務器的防火墻服務器上,使用以下規則允許內部網絡與外部網絡通信。
本例中eth1連接外網(internet),eth0連接內網(例如:192.168.1.x)。
~~~javascript
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
~~~
### 16\. 允許出站 DNS
以下規則允許傳出 DNS 連接。
~~~javascript
iptables -A OUTPUT -p udp -o eth0 --dport 53 -j ACCEPT
iptables -A INPUT -p udp -i eth0 --sport 53 -j ACCEPT
~~~
### 17\. 允許 NIS 連接
如果您正在運行 NIS 來管理您的用戶帳戶,您應該允許 NIS 連接。即使允許 SSH 連接,如果不允許 NIS 相關的 ypbind 連接,用戶將無法登錄。
NIS 端口是動態的。即當 ypbind 啟動時,它會分配端口。
首先執行如下所示的 rpcinfo -p 并獲取端口號。在此示例中,它使用端口 853 和 850。
~~~javascript
rpcinfo -p | grep ypbind
~~~
現在允許傳入連接到端口 111,以及 ypbind 使用的端口。
~~~javascript
iptables -A INPUT -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -p udp --dport 111 -j ACCEPT
iptables -A INPUT -p tcp --dport 853 -j ACCEPT
iptables -A INPUT -p udp --dport 853 -j ACCEPT
iptables -A INPUT -p tcp --dport 850 -j ACCEPT
iptables -A INPUT -p udp --dport 850 -j ACCEPT
~~~
當您重新啟動 ypbind 時,上述內容將不起作用,因為那時它將具有不同的端口號。
有兩種解決方案:1) 為您的 NIS 使用靜態 ip-address,或 2) 使用一些巧妙的 shell 腳本技術從“rpcinfo -p”命令輸出中自動獲取動態端口號,并使用上面的那些iptables 規則。
### 18\. 允許來自特定網絡的 Rsync
以下規則僅允許來自特定網絡的 rsync。
~~~javascript
iptables -A INPUT -i eth0 -p tcp -s 192.168.101.0/24 --dport 873 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 873 -m state --state ESTABLISHED -j ACCEPT
~~~
### 19\. 只允許來自特定網絡的 MySQL 連接
如果您正在運行 MySQL,通常您不希望允許來自外部的直接連接。在大多數情況下,您可能在運行 MySQL 數據庫的同一臺服務器上運行 Web 服務器。
然而,DBA 和開發人員可能需要使用 MySQL 客戶端從他們的筆記本電腦和臺式機直接登錄到 MySQL。在這種情況下,您可能希望允許您的內部網絡直接與 MySQL 對話,如下所示。
~~~javascript
iptables -A INPUT -i eth0 -p tcp -s 192.168.100.0/24 --dport 3306 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 3306 -m state --state ESTABLISHED -j ACCEPT
~~~
### 20\. 允許 Sendmail 或 Postfix 流量
以下規則允許郵件通信。它可能是sendmail 或postfix。
~~~javascript
iptables -A INPUT -i eth0 -p tcp --dport 25 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 25 -m state --state ESTABLISHED -j ACCEPT
~~~
### 21\. 允許 IMAP 和 IMAPS
以下規則允許 IMAP/IMAP2 流量。
~~~javascript
iptables -A INPUT -i eth0 -p tcp --dport 143 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 143 -m state --state ESTABLISHED -j ACCEPT
~~~
以下規則允許 IMAPS 流量。
~~~javascript
iptables -A INPUT -i eth0 -p tcp --dport 993 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 993 -m state --state ESTABLISHED -j ACCEPT
~~~
### 22\. 允許 POP3 和 POP3S
以下規則允許 POP3 訪問。
~~~javascript
iptables -A INPUT -i eth0 -p tcp --dport 110 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 110 -m state --state ESTABLISHED -j ACCEPT
~~~
以下規則允許 POP3S 訪問。
~~~javascript
iptables -A INPUT -i eth0 -p tcp --dport 995 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 995 -m state --state ESTABLISHED -j ACCEPT
~~~
### 23\. 防止 DoS 攻擊
以下 iptables 規則將幫助您防止對您的網絡服務器的拒絕服務 (DoS) 攻擊。
~~~javascript
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
~~~
在上面的例子中:
* \-m 限制:這使用限制 iptables 擴展
* –limit 25/minute:這限制每分鐘最多 25 個連接。根據您的特定要求更改此值
* –limit-burst 100:此值表示僅在連接總數達到限制突發級別后才會強制執行限制/分鐘。
### 24\. 端口轉發
以下示例將所有到達端口 442 的流量路由到 22。這意味著傳入的 ssh 連接可以來自端口 22 和 422。
~~~javascript
iptables -t nat -A PREROUTING -p tcp -d 192.168.102.37 --dport 422 -j DNAT --to 192.168.102.37:22
~~~
如果您執行上述操作,您還需要明確允許端口 422 上的傳入連接。
~~~javascript
iptables -A INPUT -i eth0 -p tcp --dport 422 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o eth0 -p tcp --sport 422 -m state --state ESTABLISHED -j ACCEPT
~~~
### 25\. 記錄丟棄的數據包
您可能還想記錄所有丟棄的數據包。這些規則應該在底部。
首先,創建一個名為 LOGGING 的新鏈。
~~~javascript
iptables -N LOGGING
~~~
接下來,確保所有剩余的傳入連接都跳轉到 LOGGING 鏈,如下所示。
~~~javascript
iptables -A INPUT -j LOGGING
~~~
接下來,通過指定自定義“日志前綴”來記錄這些數據包。
~~~javascript
iptables -A LOGGING -m limit --limit 2/min -j LOG --log-prefix "IPTables Packet Dropped:" --log-level 7
~~~
最后,丟棄這些數據包。
~~~javascript
iptables -A LOGGING -j DROP
~~~
以上25條iptables規則都是shell腳本格式:[iptables-rules](https://bbs.huaweicloud.com/blogs/300486)
- 空白目錄
- containerd
- php
- php常用函數
- 點語法
- 依賴注入
- 反射
- 迭代器和yield
- array_walk
- str_replace
- openssl_decrypt
- array_merge
- 閉包
- 深拷貝與淺拷貝
- 面向對象
- 魔術方法
- __invoke
- __isset 和 __unset
- __clone
- 常用知識點
- 訪問權限
- 抽象類
- 多態
- php框架
- tp
- tp3
- tp5
- job
- laravel
- 中間件
- laravel閉包
- symfony
- 小工具
- phpexcel
- xlswrite
- 設計模式
- 事件event
- 里氏替換原則
- 借鑒
- RESTful API
- 環境安裝
- 編譯安裝
- 編譯安裝后擴展補充
- php小記錄
- php-fpm
- 容器(Container)
- composer
- composer踩坑
- mysql
- 基礎知識
- 外鍵
- 索引
- 觸發器
- 定時器
- 分表
- 分區
- 連接查詢
- 事務
- 鎖機制
- 視圖
- 存儲過程
- 查詢
- 字符截取
- 批量修改表名(前綴)
- explain
- when_case
- pdo
- mysql優化
- 主從復制
- 權限分配
- 實用例子
- 查詢用戶
- 常見問題
- 5.7group by問題
- 遠程鏈接慢問題
- 查看進程
- 遠程訪問
- 常用小記
- mysqldump
- 備份還原
- 系統盤遷移數據盤
- 安裝sql
- 安裝MariaDB
- docker
- 安裝docker
- 配置centos開發環境
- docker運行程序
- rabbitmq
- 刪除無用鏡像
- 解決Centos firewalld導致的docker容器內無法訪問外網,無法訪問其他容器(host沒辦法解析)
- docker-compose
- docker-selenium
- ports 配置
- docker-compose-settings
- 安裝
- docker-compose常用配置
- docker常用命令
- build
- docker-hub加速
- docker-run
- Dockerfile
- apt-get update 無法升級
- 阿里打標簽
- 打包流程
- docker-network
- ufw 允許 docker 容器聯網
- 安裝containerd
- linux
- centos7
- 常用語法
- chmod
- chown
- find
- grep
- /etc/passwd
- chattr
- In軟連接
- 文件目錄大小
- xargs
- 管道用法
- top
- free
- 端口占用
- 壓縮解壓
- tar
- gzip
- zip
- 2>&1
- 環境變量
- 服務管理
- systemctl
- sed
- shell腳本
- time
- journal
- history
- linux-set
- linux-curl
- cp
- umask
- mkdir
- http狀態碼
- awk
- lsof
- crontab
- supervisor
- 常用命令匯總
- 用戶權限
- 普通用戶添加sudo權限
- sudo su
- 添加用戶
- 查看用戶信息
- 修改用戶信息
- 特殊權限
- 系統命令
- 常用小技巧
- vim小技巧
- 防火墻
- 常用規則
- iptables
- 磁盤清理
- 分區掛載
- linux-sh
- tmux
- 多命令執行
- 常用工具
- telnet
- ip轉發
- nohup
- watch
- dig
- 查看磁盤IO
- ssh
- 修改ssh端口
- ssh免密登錄
- 配置文件
- 公鑰分發
- xsync
- 國內鏡像站
- github加速
- 測網速
- 網卡
- 清理日志備份
- 配置sftp
- shell
- rpm
- 安全
- 安裝openssl
- 安裝openssh
- 禁用selinux和防火墻
- lanp環境安裝
- versionTool
- git
- git基本用法
- Gogs搭建
- git鉤子
- git的習慣配置
- phpStorm設置git bash
- git bash 設置代理
- gitignore 不起作用的解決辦法
- gitea搭建
- 同步主干到fork
- git修改地址
- svn
- svn基本操作
- svn 鉤子應用
- svn多版本操作
- Go語言
- Go語言基礎
- 安裝環境
- linux安裝
- window安裝
- 工具使用教程
- linux終端分屏Screen
- keepass 帳號密碼管理
- phpstorm
- 去掉window換行符
- php_cs
- 自定義快捷模塊
- phpstorm快捷鍵
- curl
- 正則
- 設計架構
- 設計模式的六大原則
- 計算機基礎
- TCP三次握手
- OSI7層
- http狀態返回碼
- 前端框架
- Vue
- Angular
- React
- node
- 服務端渲染(SSR)
- MVVM
- nuxt
- pm2
- js
- Promise
- es6
- 常用站點
- 工具類
- 學習類
- ps常用命令
- nginx
- 緩存
- 配置
- TCP
- 常用配置
- ng優先級
- vhost注意點
- nginx第一層驗證
- 轉發(跨域問題)
- 404
- nginx日志格式化
- 重啟腳本
- 寶塔禁用境外ip訪問
- ng統計
- ng編譯安裝
- 防盜鏈
- 技術相關了解
- ddos
- xss
- mysql防注入
- csrf攻擊
- 郵箱系統原理
- DNS
- python
- Selenium
- 微信
- 公眾號
- 公眾號配置
- 用戶授權
- 小程序
- 公有云
- 華為云
- JAVA
- springboot
- windows
- service
- WSL
- 目錄遷移
- wsl2 踩坑
- NoSql
- mongodb
- 安裝mongodb
- redis
- redis-windows
- redis-linux
- openstack
- ====副業====
- 擼茅臺
- 網絡
- 單位換算
- DB
- clickhouse
- mac