五链(netfilter 5 个 Hook 点)
- PREROUTING:数据包刚进入网卡,路由决策之前;主要做 DNAT、目的地址改写
- INPUT:路由判断发现数据包是发给本机,交给本机应用前
- FORWARD:数据包需要经过本机转发(本机充当网关)
- OUTPUT:本机进程主动向外发出数据包
- POSTROUTING:数据包即将离开网卡,路由之后;主要做 SNAT、源地址改写
数据包两种典型流向
-
外部访问本机:
网卡入 → PREROUTING → 路由 → INPUT → 本机程序 -
内网机器经本机网关访问外网:
网卡入 → PREROUTING → 路由 → FORWARD → POSTROUTING → 网卡出
image.png
配置 192.168.3.2与192.168.3.1互通,并限制端口访问,防止被nmap扫描
本脚本幂等方式配置 192.168.3.2 的 iptables
- 放行 192.168.3.1、192.168.3.155 访问本机所有端口
- 放行本机发往上述两个可信 IP 的出站流量
- 拦截其他 IP 访问 6379、80、3306
- 放行本机回环(lo),保证本机进程互相访问
确认网段
sudo podman network inspect podman -f '{{range .Subnets}}{{.Subnet}}{{end}}'
docker network inspect bridge -f '{{range .IPAM.Config}}{{.Subnet}}{{end}}'
直接看完整信息 docker network inspect bridge,Docker 默认网段是 172.17.0.0/16
确认 INPUT 顺序(容器 ACCEPT 必须在 DROP 之前)
iptables -L INPUT -n -v --line-numbers
关键验证:容器 → 宿主 java
sudo podman exec -it nginxwky sh -c "nc -zv 192.168.32.21 9998"
浏览器 155 访问 http://192.168.3.2:80
- 其余端口权限由 INPUT 默认策略决定
HOST_IP=192.168.3.2
TRUST1=192.168.3.1
TRUST2=192.168.3.155
PODMAN_SUBNET="10.88.0.0/16"
PORTS="6379 80 3306"
---------- 1. 可信 IP 入站全放行(先删再插,删除条件与插入一致) ----------
iptables -D INPUT -s TRUST1 -j ACCEPT
iptables -D INPUT -s TRUST2 -j ACCEPT
---------- 2. 本机回环放行(本机进程互相访问的关键) ----------
iptables -D INPUT -i lo -j ACCEPT 2>/dev/null
iptables -I INPUT -i lo -j ACCEPT
---------- 3. 本机 IP 自访放行(进程连 192.168.32.21:port 时命中) ----------
注意:只放行 源和目的都是本机 IP,避免把外部访问也一起放行
iptables -D INPUT -s HOST_IP -j ACCEPT 2>/dev/null
iptables -I INPUT -s HOST_IP -j ACCEPT
---------- 4.1. 本机发往可信 IP 的出站流量放行 ----------
iptables -D OUTPUT -d TRUST1 -j ACCEPT
iptables -D OUTPUT -d TRUST2 -j ACCEPT
4.2 新增:podman网桥网段访问本机HOST_IP TCP放行,带状态匹配,幂等
iptables -D OUTPUT -s HOST_IP -p tcp -j ACCEPT 2>/dev/null
iptables -I OUTPUT -s HOST_IP -p tcp -j ACCEPT
---------- 4.3 podman 容器网段 -> 宿主机 TCP 放行(入站方向,必须在 DROP 之前) ----------
作用:让 nginx 容器能访问宿主机上的 java(java 用 --net=host 监听在宿主机 9998/9990)
iptables -D INPUT -s HOST_IP -p tcp -j ACCEPT 2>/dev/null
iptables -I INPUT -s HOST_IP -p tcp -j ACCEPT
---------- 5. 拦截其他 IP 访问 5 个业务端口(追加到 INPUT 末尾) ----------
for p in p -j DROP 2>/dev/null
iptables -A INPUT -p tcp --dport $p -j DROP
done
