iptables实战

五链(netfilter 5 个 Hook 点)

  1. PREROUTING:数据包刚进入网卡,路由决策之前;主要做 DNAT、目的地址改写
  2. INPUT:路由判断发现数据包是发给本机,交给本机应用前
  3. FORWARD:数据包需要经过本机转发(本机充当网关)
  4. OUTPUT:本机进程主动向外发出数据包
  5. POSTROUTING:数据包即将离开网卡,路由之后;主要做 SNAT、源地址改写

数据包两种典型流向

  1. 外部访问本机:网卡入 → PREROUTING → 路由 → INPUT → 本机程序
  2. 内网机器经本机网关访问外网:网卡入 → 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 2>/dev/null iptables -I INPUT -sTRUST1 -j ACCEPT

iptables -D INPUT -s TRUST2 -j ACCEPT 2>/dev/null iptables -I INPUT -sTRUST2 -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 -dHOST_IP -j ACCEPT 2>/dev/null
iptables -I INPUT -s HOST_IP -dHOST_IP -j ACCEPT

---------- 4.1. 本机发往可信 IP 的出站流量放行 ----------

iptables -D OUTPUT -d TRUST1 -j ACCEPT 2>/dev/null iptables -I OUTPUT -dTRUST1 -j ACCEPT

iptables -D OUTPUT -d TRUST2 -j ACCEPT 2>/dev/null iptables -I OUTPUT -dTRUST2 -j ACCEPT

4.2 新增:podman网桥网段访问本机HOST_IP TCP放行,带状态匹配,幂等

iptables -D OUTPUT -s PODMAN_SUBNET -dHOST_IP -p tcp -j ACCEPT 2>/dev/null
iptables -I OUTPUT -s PODMAN_SUBNET -dHOST_IP -p tcp -j ACCEPT

---------- 4.3 podman 容器网段 -> 宿主机 TCP 放行(入站方向,必须在 DROP 之前) ----------

作用:让 nginx 容器能访问宿主机上的 java(java 用 --net=host 监听在宿主机 9998/9990)

iptables -D INPUT -s PODMAN_SUBNET -dHOST_IP -p tcp -j ACCEPT 2>/dev/null
iptables -I INPUT -s PODMAN_SUBNET -dHOST_IP -p tcp -j ACCEPT

---------- 5. 拦截其他 IP 访问 5 个业务端口(追加到 INPUT 末尾) ----------

for p in PORTS; do iptables -D INPUT -p tcp --dportp -j DROP 2>/dev/null
iptables -A INPUT -p tcp --dport $p -j DROP
done

最后编辑于 :
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容