k8s访问localhosts思考

sysctl -w net.ipv4.conf.all.route_localnet=1
sysctl -w net.ipv4.conf.lo.route_localnet=1
sysctl -w net.ipv4.conf.all.log_martians=1

iptables -t nat -I PREROUTING -m addrtype ! --src-type LOCAL --dst-type LOCAL -p tcp --dport 56 -j DNAT --to-destination 127.0.0.2:36912

! --src-type LOCAL 表示源地址不是本机地址
--dst-type LOCAL 表示目标地址是本机地址

注意 LOCAL 全大写


这三条 `sysctl` 命令都是用来调整 Linux 内核网络栈的参数,具体解释如下:

---

### 1. `net.ipv4.conf.all.route_localnet=1`

* **作用**:允许将数据包路由到本地回环地址(127.0.0.0/8)
* **默认值**:`0`,表示不允许路由到本地回环地址,只能由本机生成或接收回环地址的数据包
* **设置为1的意义**:

* 开启此项后,允许网络中的其他接口或设备发送到本机回环地址的数据包,并且内核会路由这些数据包到本机回环接口。
* 这在需要做**端口转发、NAT或iptables把外部流量转发到本机127.0.0.1地址**时非常关键。
* **安全性注意**:开启可能带来安全风险,因为允许外部主机访问本机回环地址上的服务,需要确保防火墙和访问控制合理配置。

---

### 2. `net.ipv4.conf.lo.route_localnet=1`

* **作用**:针对回环接口(lo),是否允许接收路由到本地回环地址的数据包
* **默认值**:通常是 `0`
* **设置为1的意义**:和上面类似,确保回环接口也允许此类路由数据包通过
* **与 `all.route_localnet` 配合使用**,通常两者都要设置为 `1`,才能完整支持从外部转发到本地回环地址的流量。

---

### 3. `net.ipv4.conf.all.log_martians=1`

* **作用**:开启记录“马奇包(martian packets)”的日志。
* **马奇包** 是指内核认为异常、可疑或不合理的网络包,比如:

* 源地址或目标地址不符合路由规则的包
* 可能是错误配置或恶意攻击产生的包
* **设置为1的意义**:开启此项后,内核会将这些异常包记录到系统日志(如 `/var/log/kern.log` 或 `/var/log/messages`),方便排查网络故障或安全问题。
* **对调试很有用**,但生产环境开启可能产生大量日志。

---

## 总结

| 参数 | 作用 |
| ------------------------------------ | ------------------------- |
| `net.ipv4.conf.all.route_localnet=1` | 允许从外部路由到本机回环地址(127.0.0.1) |
| `net.ipv4.conf.lo.route_localnet=1` | 允许回环接口接收路由到本机回环地址的包 |
| `net.ipv4.conf.all.log_martians=1` | 记录异常或可疑的网络包,方便排查和安全审计 |

---

如果你有做端口转发到 `127.0.0.1` 相关需求,前两条必须打开;第三条用于观察和调试网络异常。

 

 

你想用 socat 把 Pod 内监听的 127.0.0.1:8000 的流量转发给物理机(宿主机)IP 10.0.0.1:36912,这其实是个典型的端口转发。


关键点

  • socat 命令运行在 Pod 内,监听 Pod 内的端口 8000

  • 当 Pod 内访问 127.0.0.1:8000 时,socat 会把流量转发到物理机 IP(例如 10.0.0.1)的端口 36912

  • 物理机上的服务必须监听对应端口,且宿主机防火墙允许 Pod 访问该 IP 和端口


命令示例

socat TCP-LISTEN:8000,fork,reuseaddr TCP:10.0.0.1:36912

说明

  • TCP-LISTEN:8000:Pod 内监听本地端口 8000

  • fork:支持多客户端连接

  • reuseaddr:允许端口重用,防止重启报错

  • TCP:10.0.0.1:36912:把连接转发到物理机内网 IP 的 36912 端口


物理机配置建议

  1. 物理机服务必须监听 36912 端口

  2. 物理机防火墙(iptables、firewalld)允许 Pod 的网络 CIDR 访问此端口

  3. 网络策略、K8s 网络插件不要阻止 Pod 访问物理机 IP


使用场景示例

  • Pod 内访问 127.0.0.1:8000 实际请求被转发到物理机的 10.0.0.1:36912 服务

  • 适合应用只能访问 localhost:8000,通过 socat 代理实现访问物理机服务


明白了 ✅
你说的情况是:

  • 远端机器22 端口被运营商/防火墙封掉了(外网不能直接连 22)。

  • 你希望 在远端机器上监听 80 端口,并把到达 80 的流量内部转给它自己的 22,这样本地就能通过 ssh -p 80 访问远端。

这跟本地机器无关,操作必须在 远端机器 上完成。


方法一:远端机器用 iptables 做端口重定向(推荐)

远端机器 上执行(需要 root 权限):

# 开启内核转发
echo 1 > /proc/sys/net/ipv4/ip_forward

# 把访问 80 端口的 TCP 流量重定向到本机 22 端口
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 22

验证:

# 在本地
ssh -p 80 user@远端IP

如果能连通,说明流量已经被转到 22 成功了。


方法二:远端机器用 socat 转发(简单)

安装 socat(大部分 Linux 发行版自带包):

# 转发 80 → 22
socat TCP-LISTEN:80,fork TCP:127.0.0.1:22

然后在本地测试:

ssh -p 80 user@远端IP

缺点:socat 退出后就失效,适合临时使用。


方法三:systemd 管理 socat(持久化)

写一个 systemd unit,比如 /etc/systemd/system/ssh80.service

[Unit]
Description=SSH over port 80
After=network.target

[Service]
ExecStart=/usr/bin/socat TCP-LISTEN:80,fork TCP:127.0.0.1:22
Restart=always

[Install]
WantedBy=multi-user.target

启用并启动:

systemctl daemon-reload
systemctl enable --now ssh80

安全提示

  • 这样做等于是把 SSH 暴露在 HTTP 常用端口 80 上,容易被扫描和暴力破解。

  • 建议同时加上 防火墙规则限制来源 IP,例如只允许公司或家里的固定公网 IP 访问:

iptables -A INPUT -p tcp -s 1.2.3.4 --dport 80 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j DROP

✅ 总结:

  • 远端机器做转发,不是本地机器。

  • 推荐用 iptables(性能最好),次选 systemd+socat

  • 本地访问方式变为:

    ssh -p 80 user@远端IP
    

要不要我帮你写一个完整的 iptables 脚本,直接在远端机器上执行就能生效(支持只允许指定 IP)?

posted on 2025-08-11 14:18  吃草的青蛙  阅读(29)  评论(0)    收藏  举报

导航