iptables使用及docker的iptables規(guī)則
iptables
處理流程
iptables是Linux中網(wǎng)絡(luò)鉤子,有四表五鏈。
- filter表即防火墻規(guī)則,允許、阻止或丟棄進(jìn)出的數(shù)據(jù)包,使用是最多的
- nat表,網(wǎng)絡(luò)地址轉(zhuǎn)換,內(nèi)網(wǎng)的數(shù)據(jù)包收發(fā)室,有多種類型,常見(jiàn)的有SNAT,PNAT,DNAT,是第二常用的
- mangle表,修改數(shù)據(jù)包的TTL,給數(shù)據(jù)包做不同的標(biāo)記,策略路由等
- raw表,一般用于跟蹤狀態(tài),調(diào)試,用的較少
優(yōu)先級(jí):raw,mangle,nat,filter
五鏈:
- PREROUTING,到達(dá)本機(jī)前的路由規(guī)則
- INPUT,進(jìn)入本機(jī)的規(guī)則
- FORWARD,轉(zhuǎn)發(fā)的規(guī)則
- OUTPUT,本機(jī)發(fā)出的規(guī)則
- POSTROUTING,發(fā)出后的路由規(guī)則
命令與擴(kuò)展
清空表上的所有規(guī)則,默認(rèn)為filter表:
iptables -F
鏈上操作規(guī)則,A追加,I前面插入,D刪除,R替換,N新建一個(gè)自定義鏈,例如:
在第5條規(guī)則前插入禁止非192.168.1.0/24
訪問(wèn)80端口
iptables -I INPUT 5 -p tcp --dport 80 ! -s 192.168.1.0/24 -j DROP
查看某個(gè)表的所有鏈上的規(guī)則:
iptables -t nat -L -n -v --line-numbers
filter表,常將lo網(wǎng)卡和已建立連接的規(guī)則放在最前面,降低系統(tǒng)負(fù)擔(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
每個(gè)鏈都有默認(rèn)規(guī)則,禁止時(shí)可以設(shè)置白名單,允許時(shí)可以設(shè)置黑名單
INPUT鏈默認(rèn)禁止連接:
iptables -P INPUT DROP
iptables有很多擴(kuò)展,不同的擴(kuò)展有不同的功能,查看文檔,man iptables-extensions
常用的:
- 多端口擴(kuò)展,
-m multiport --dports 80,443
- recent擴(kuò)展,每30秒最多10個(gè)連接:
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擴(kuò)展,限制并發(fā)連接數(shù):
iptables -I INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 100 -j REJECT
- string擴(kuò)展,字符串匹配禁止:
iptables -I INPUT -p tcp --sport 443 -m string --string "xunlei" --algo kmp -j DROP
iptables規(guī)則都是保存在內(nèi)存中的,重啟規(guī)則會(huì)丟失,可以使用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)默認(rèn)規(guī)則
安裝iptables-services后,/etc/sysconfig/iptables
文件中有默認(rèn)規(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
第四個(gè)是允許ssh登錄
第五個(gè)是禁止其他連接通過(guò)INPUT,并返回icmp-host-prohibited錯(cuò)誤
第六個(gè)是禁止FORWARD
ipset的使用
可與iptables結(jié)合,實(shí)現(xiàn)動(dòng)態(tài)的白名單,并且可以設(shè)置過(guò)期時(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ú)法上網(wǎng)的機(jī)器通過(guò)網(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)地址,動(dòng)態(tài)上網(wǎng)時(shí),常用-j MASQUERADE iptables -t nat -A POSTROUTING -o eth0 -s 192.168.1.0/24 -j SNAT --to 172.16.8.1 # 不能上網(wǎng)的機(jī)器,修改網(wǎng)關(guān) route add default gw 192.168.1.1
DNAT常用于將內(nèi)部機(jī)器暴漏給外部用戶使用。
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分為主動(dòng)模式和被動(dòng)模式。
主動(dòng)模式數(shù)據(jù)流是server主動(dòng)連接client的隨機(jī)端口,一般客戶端都工作在NAT網(wǎng)絡(luò)中,客戶端端口須層層路由開放,所以這種模式很少使用。
被動(dòng)模式,server告知client數(shù)據(jù)連接端口,客戶端連接server的數(shù)據(jù)連接端口,這個(gè)端口一般是隨機(jī)的,需要服務(wù)端開放,使用iptables的連接追蹤功能,可以很好的解決這個(gè)問(wèn)題
加載ftp專用的追蹤模塊,modprobe nf_conntrack_ftp
開啟ftp追蹤模塊后,僅需開放21端口即可(INPUT默認(rèn)DROP,OUTPUT默認(rèn)ACCEPT)iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
RELATED指明ftp關(guān)聯(lián)的數(shù)據(jù)端口允許連接
firewall-cmd命令
iptables分為ipv4和ipv6,兩者是獨(dú)立的,firewalld是iptables的python腳本,已經(jīng)整合了ipv4和ipv6
與iptables不同的是,firewalld使用zone來(lái)管理防火墻
zone可以根據(jù)source,mac,ipset,interface等匹配,匹配不上的進(jìn)入默認(rèn)的public
查詢默認(rèn)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
進(jìn)行復(fù)雜的控制,需要rich規(guī)則,命令比較復(fù)雜,不推薦使用
docker的iptables規(guī)則
docker網(wǎng)絡(luò)類型
- none:顧名思義,不使用網(wǎng)絡(luò),只使用lo
- host:使用主機(jī)的網(wǎng)絡(luò)
- bridge:橋接,相當(dāng)于nat,通過(guò)docker0分配一個(gè)
172.17.0.x
的地址使用 - container:使用指定容器的網(wǎng)絡(luò)
數(shù)據(jù)包處理流程
為便于測(cè)試,啟動(dòng)兩個(gè)容器:
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ī)則,默認(rèn)FORWARD為DROP,DOCKER鏈處理到docker0的IP數(shù)據(jù)包,即容器對(duì)外的規(guī)則,例如:
iptables -A DOCKER -d 172.17.0.2/32 ! -i docker0 -o docker0 -p tcp -m tcp --dport 80 -j ACCEPT
允許非docker0訪問(wèn)80端口
為了搞清楚DOCKER-ISOLATION-STAGE-2,需要?jiǎng)?chuàng)建一個(gè)bridge,開啟一個(gè)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
并不通,怎么實(shí)現(xiàn)的呢?
DOCKER-ISOLATION-STAGE-1規(guī)則是源網(wǎng)卡是docker0,而目的地不是docker0就進(jìn)入DOCKER-ISOLATION-STAGE-2
而DOCKER-ISOLATION-STAGE-2中,有一條規(guī)則,iptables -A DOCKER-ISOLATION-STAGE-2 -o br-afba712bfb32 -j DROP
,即不允許不同的網(wǎng)卡互相訪問(wèn),這對(duì)于docker-compose非常有用,設(shè)計(jì)非常精妙
DOCKER-USER鏈用于自定義轉(zhuǎn)發(fā)規(guī)則,優(yōu)先級(jí)最高,可以限制進(jìn)入容器的源IP地址:iptables -I DOCKER-USER ! -s 192.168.47.1 -p tcp --dport 80 -j DROP
以上規(guī)則禁止非192.168.47.1的IP地址訪問(wèn)容器的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使用宿主機(jī)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
通過(guò)PREROUTING鏈和DOCKER鏈將主機(jī)的80端口流量轉(zhuǎn)發(fā)給172.17.0.2,并通過(guò)filter表的FORWARD鏈返回給客戶端
宿主機(jī)通過(guò)nat表的OUTPUT鏈?zhǔn)强梢栽L問(wèn)container的80端口的
nat表的POSTROUTING規(guī)則使得container可以訪問(wèn)外網(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
使得容器通過(guò)自己的IP172.17.0.2也可以訪問(wèn)80端口
最后網(wǎng)上的一張流程圖:
到此這篇關(guān)于iptables使用及docker的iptables規(guī)則的文章就介紹到這了,更多相關(guān)docker iptables規(guī)則內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- 解決docker安裝完成報(bào):bridge-nf-call-iptables is disabled問(wèn)題
- 在Docker容器中使用iptables時(shí)的最小權(quán)限的開啟方法
- Docker中iptables規(guī)則在iptables重啟后丟失的完整過(guò)程
- 詳解Docker使用Linux iptables 和 Interfaces管理容器網(wǎng)絡(luò)
- Docker與iptables及實(shí)現(xiàn)bridge方式網(wǎng)絡(luò)隔離與通信操作
- iptables如何限制宿主機(jī)跟Docker IP和端口訪問(wèn)(安全整改)
- docker的iptables策略詳解和用戶自定義策略的添加方式
- Docker iptables的錯(cuò)誤解決
- docker的WARNING:bridge-nf-call-iptables is disabled的解決方案
- 基于iptables的Docker端口白名單控制實(shí)現(xiàn)
相關(guān)文章
Docker多平臺(tái)安裝與配置指南的實(shí)現(xiàn)
這篇文章主要介紹了Docker多平臺(tái)安裝與配置指南的實(shí)現(xiàn),深入研究了Docker在Linux、Windows、和macOS等不同平臺(tái)上的安裝過(guò)程及Docker鏡像管理、容器運(yùn)維、使用Docker Compose進(jìn)行多容器管理,以及網(wǎng)絡(luò)與數(shù)據(jù)管理等,感興趣的可以了解一下2024-01-01Docker搭建LibreSpeed的實(shí)現(xiàn)步驟
LibreSpeed 是一個(gè)輕量級(jí)的網(wǎng)絡(luò)速度測(cè)試工具,本文主要介紹了Docker搭建LibreSpeed的實(shí)現(xiàn)步驟,具有一定的參考價(jià)值,感興趣的可以了解一下2024-04-04Docker安裝Tomcat無(wú)法訪問(wèn)的問(wèn)題及解決
這篇文章主要介紹了Docker安裝Tomcat無(wú)法訪問(wèn)的問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-07-07Ollma本地部署Qwen2.5 14B的詳細(xì)過(guò)程(不使用docker)
本文介紹了如何在不使用Docker的情況下部署Ollama模型和Open-webui實(shí)現(xiàn)可視化界面,Ollama模型通過(guò)命令行操作,包括啟動(dòng)、創(chuàng)建、運(yùn)行等,Open-webui則需要安裝Anaconda環(huán)境,安裝并啟動(dòng)服務(wù)后,通過(guò)瀏覽器訪問(wèn)即可使用,感興趣的朋友跟隨小編一起看看吧2024-11-11Docker鏡像修改hosts及dockerfile修改hosts文件的實(shí)現(xiàn)方式
這篇文章主要介紹了Docker鏡像修改hosts及dockerfile修改hosts文件的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2025-04-04