iptables使用及docker的iptables規(guī)則
iptables
處理流程
iptables是Linux中網(wǎng)絡(luò)鉤子,有四表五鏈。
- filter表即防火墻規(guī)則,允許、阻止或丟棄進出的數(shù)據(jù)包,使用是最多的
- nat表,網(wǎng)絡(luò)地址轉(zhuǎn)換,內(nèi)網(wǎng)的數(shù)據(jù)包收發(fā)室,有多種類型,常見的有SNAT,PNAT,DNAT,是第二常用的
- mangle表,修改數(shù)據(jù)包的TTL,給數(shù)據(jù)包做不同的標記,策略路由等
- raw表,一般用于跟蹤狀態(tài),調(diào)試,用的較少
優(yōu)先級:raw,mangle,nat,filter
五鏈:
- PREROUTING,到達本機前的路由規(guī)則
- INPUT,進入本機的規(guī)則
- FORWARD,轉(zhuǎn)發(fā)的規(guī)則
- OUTPUT,本機發(fā)出的規(guī)則
- POSTROUTING,發(fā)出后的路由規(guī)則
命令與擴展
清空表上的所有規(guī)則,默認為filter表:
iptables -F
鏈上操作規(guī)則,A追加,I前面插入,D刪除,R替換,N新建一個自定義鏈,例如:
在第5條規(guī)則前插入禁止非192.168.1.0/24
訪問80端口
iptables -I INPUT 5 -p tcp --dport 80 ! -s 192.168.1.0/24 -j DROP
查看某個表的所有鏈上的規(guī)則:
iptables -t nat -L -n -v --line-numbers
filter表,常將lo網(wǎng)卡和已建立連接的規(guī)則放在最前面,降低系統(tǒng)負擔(dān):
iptables -A INPUT -i lo -j ACCEPTiptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
允許ping:
iptables -A INPUT -p icmp --icmp-type 8 -j ACCEPT
允許連續(xù)范圍端口:
iptables -A INPUT -p udp --sport 1000:2000 -j ACCEPT
每個鏈都有默認規(guī)則,禁止時可以設(shè)置白名單,允許時可以設(shè)置黑名單
INPUT鏈默認禁止連接:
iptables -P INPUT DROP
iptables有很多擴展,不同的擴展有不同的功能,查看文檔,man iptables-extensions
常用的:
- 多端口擴展,
-m multiport --dports 80,443
- recent擴展,每30秒最多10個連接:
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --set
iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 30 --hitcount 10 -j DROP
- connlimit擴展,限制并發(fā)連接數(shù):
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
- string擴展,字符串匹配禁止:
iptables -I INPUT -p tcp --sport 443 -m string --string "xunlei" --algo kmp -j DROP
iptables規(guī)則都是保存在內(nèi)存中的,重啟規(guī)則會丟失,可以使用iptables-save
和iptables-restore
保存,還可以使用iptables-services
# 禁用firewalld #systemctl stop firewalld #systemctl disable firewalld yum -y install iptables-services service iptables save service iptables reload
系統(tǒng)默認規(guī)則
安裝iptables-services后,/etc/sysconfig/iptables
文件中有默認規(guī)則:
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT iptables -A INPUT -p icmp -j ACCEPT iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited iptables -A FORWARD -j REJECT --reject-with icmp-host-prohibited
第四個是允許ssh登錄
第五個是禁止其他連接通過INPUT,并返回icmp-host-prohibited錯誤
第六個是禁止FORWARD
ipset的使用
可與iptables結(jié)合,實現(xiàn)動態(tài)的白名單,并且可以設(shè)置過期時間ipset create ssh-allow hash:ip timeout 0
ipset add ssh-allow 192.168.47.1 timeout 86400
ipset list ssh-allow
iptables -A INPUT -p tcp --dport 22 -m set --match-set ssh-allow src -j ACCEPT
SNAT與DNAT
SNAT常用于內(nèi)部無法上網(wǎng)的機器通過網(wǎng)關(guān)上網(wǎng),需要調(diào)整安全組和解除網(wǎng)關(guān)MAC與IP綁定。
# 網(wǎng)關(guān)打開核心轉(zhuǎn)發(fā) echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf sysctl -p # 數(shù)據(jù)包離開前將源地址改為網(wǎng)關(guān)地址,動態(tài)上網(wǎng)時,常用-j MASQUERADE iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 172.16.8.1 # 不能上網(wǎng)的機器,修改網(wǎng)關(guān) route add default gw 192.168.1.1
DNAT常用于將內(nèi)部機器暴漏給外部用戶使用。
iptables -t nat -A PREROUTING -d 172.16.8.1 -p tcp --dport 80 -j DNAT --to-destination 192.168.1.20:8080
ftp規(guī)則
ftp分為主動模式和被動模式。
主動模式數(shù)據(jù)流是server主動連接client的隨機端口,一般客戶端都工作在NAT網(wǎng)絡(luò)中,客戶端端口須層層路由開放,所以這種模式很少使用。
被動模式,server告知client數(shù)據(jù)連接端口,客戶端連接server的數(shù)據(jù)連接端口,這個端口一般是隨機的,需要服務(wù)端開放,使用iptables的連接追蹤功能,可以很好的解決這個問題
加載ftp專用的追蹤模塊,modprobe nf_conntrack_ftp
開啟ftp追蹤模塊后,僅需開放21端口即可(INPUT默認DROP,OUTPUT默認ACCEPT)iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
RELATED指明ftp關(guān)聯(lián)的數(shù)據(jù)端口允許連接
firewall-cmd命令
iptables分為ipv4和ipv6,兩者是獨立的,firewalld是iptables的python腳本,已經(jīng)整合了ipv4和ipv6
與iptables不同的是,firewalld使用zone來管理防火墻
zone可以根據(jù)source,mac,ipset,interface等匹配,匹配不上的進入默認的public
查詢默認zone:firewall-cmd --get-default-zone
修改了規(guī)則需要重新加載才能生效:firewall-cmd --reload
列出zone的所有規(guī)則:firewall-cmd --list-all --zone=public
開放80端口:firewall-cmd --zone=public --add-port=80/tcp --permanent
進行復(fù)雜的控制,需要rich規(guī)則,命令比較復(fù)雜,不推薦使用
docker的iptables規(guī)則
docker網(wǎng)絡(luò)類型
- none:顧名思義,不使用網(wǎng)絡(luò),只使用lo
- host:使用主機的網(wǎng)絡(luò)
- bridge:橋接,相當(dāng)于nat,通過docker0分配一個
172.17.0.x
的地址使用 - container:使用指定容器的網(wǎng)絡(luò)
數(shù)據(jù)包處理流程
為便于測試,啟動兩個容器:
docker run -d --rm --name nginx -p 80:80 nginx:1.16.1 docker run -it --name busybox --rm busybox sh
filter表規(guī)則
iptables -N DOCKER iptables -N DOCKER-ISOLATION-STAGE-1 iptables -N DOCKER-ISOLATION-STAGE-2 iptables -N DOCKER-USER iptables -A FORWARD -j DOCKER-USER iptables -A FORWARD -j DOCKER-ISOLATION-STAGE-1 iptables -A FORWARD -o docker0 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT iptables -A FORWARD -o docker0 -j DOCKER iptables -A FORWARD -i docker0 ! -o docker0 -j ACCEPT iptables -A FORWARD -i docker0 -o docker0 -j ACCEPT iptables -A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2 iptables -A DOCKER-ISOLATION-STAGE-1 -j RETURN iptables -A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP iptables -A DOCKER-ISOLATION-STAGE-2 -j RETURN iptables -A DOCKER-USER -j RETURN
主要是轉(zhuǎn)發(fā)規(guī)則,默認FORWARD為DROP,DOCKER鏈處理到docker0的IP數(shù)據(jù)包,即容器對外的規(guī)則,例如:
iptables -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
允許非docker0訪問80端口
為了搞清楚DOCKER-ISOLATION-STAGE-2,需要創(chuàng)建一個bridge,開啟一個nginx,并安裝telnet
docker network create docker1 docker run -d --rm --name nginx1 -p 8080:80 --net docker1 nginx:1.16.1 docker exec -it nginx /bin/bash # 在nginx中安裝telnet #apt update #apt install telnet #telnet 172.18.0.2 80
可以看到telnet 172.18.0.2 80
并不通,怎么實現(xiàn)的呢?
DOCKER-ISOLATION-STAGE-1規(guī)則是源網(wǎng)卡是docker0,而目的地不是docker0就進入DOCKER-ISOLATION-STAGE-2
而DOCKER-ISOLATION-STAGE-2中,有一條規(guī)則,iptables -A DOCKER-ISOLATION-STAGE-2 -o br-afba712bfb32 -j DROP
,即不允許不同的網(wǎng)卡互相訪問,這對于docker-compose非常有用,設(shè)計非常精妙
DOCKER-USER鏈用于自定義轉(zhuǎn)發(fā)規(guī)則,優(yōu)先級最高,可以限制進入容器的源IP地址:iptables -I DOCKER-USER ! -s 192.168.47.1 -p tcp --dport 80 -j DROP
以上規(guī)則禁止非192.168.47.1的IP地址訪問容器的80端口
nat表規(guī)則
iptables -t nat -N DOCKER iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER iptables -t nat -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER iptables -t nat -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE iptables -t nat -A DOCKER -i docker0 -j RETURN
DOCKER鏈方便container自定義規(guī)則
POSTROUTING規(guī)則,使得container使用宿主機docker0的IP作為網(wǎng)關(guān),便于接收外部返回的數(shù)據(jù)
有如下規(guī)則:iptables -t nat -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
通過PREROUTING鏈和DOCKER鏈將主機的80端口流量轉(zhuǎn)發(fā)給172.17.0.2,并通過filter表的FORWARD鏈返回給客戶端
宿主機通過nat表的OUTPUT鏈是可以訪問container的80端口的
nat表的POSTROUTING規(guī)則使得container可以訪問外網(wǎng)
很奇怪的一條規(guī)則:iptables -t nat -A POSTROUTING -s 172.17.0.2/32 -d 172.17.0.2/32 -p tcp -m tcp --dport 80 -j MASQUERADE
使得容器通過自己的IP172.17.0.2也可以訪問80端口
最后網(wǎng)上的一張流程圖:
到此這篇關(guān)于iptables使用及docker的iptables規(guī)則的文章就介紹到這了,更多相關(guān)docker iptables規(guī)則內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- docker的iptables策略詳解和用戶自定義策略的添加方式
- Docker iptables的錯誤解決
- docker的WARNING:bridge-nf-call-iptables is disabled的解決方案
- 解決docker安裝完成報:bridge-nf-call-iptables is disabled問題
- Docker與iptables及實現(xiàn)bridge方式網(wǎng)絡(luò)隔離與通信操作
- Docker中iptables規(guī)則在iptables重啟后丟失的完整過程
- 詳解Docker使用Linux iptables 和 Interfaces管理容器網(wǎng)絡(luò)
- 在Docker容器中使用iptables時的最小權(quán)限的開啟方法
- iptables如何限制宿主機跟Docker IP和端口訪問(安全整改)
相關(guān)文章
關(guān)于docker部署的jenkins跑git上的程序的問題
這篇文章主要介紹了docker部署的jenkins跑git上的程序的相關(guān)知識,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2020-11-11使用Docker容器部署MongoDB并支持遠程訪問及遇到的坑
MongoDB是一個介于關(guān)系數(shù)據(jù)庫和非關(guān)系數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系數(shù)據(jù)庫當(dāng)中功能最豐富,最像關(guān)系數(shù)據(jù)庫的,今天通過本文給大家介紹使用Docker容器部署MongoDB并支持遠程訪問及遇到的坑,感興趣的朋友一起看看吧2022-07-07Docker Compose 網(wǎng)絡(luò)設(shè)置詳解
這篇文章主要介紹了Docker Compose 網(wǎng)絡(luò)設(shè)置詳解,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-10-10Docker Compose環(huán)境變量與配置文件管理全解析
這篇文章主要介紹了Docker Compose環(huán)境變量與配置文件管理全解析,本文給大家介紹的非常詳細,對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友參考下吧2025-04-04Docker安裝RabbitMQ AMQP協(xié)議及重要角色
這篇文章主要為大家介紹了Docker安裝RabbitMQ AMQP協(xié)議和主要角色詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05