透明代理调试内网服务

我迫切希望各家公司能把网络连通性搞搞好。

配置 Socks 代理

首先开启 Socks 代理,端口为 12345,此处假设在 .ssh/config 里配置了 Host 名为 target

ssh -D 12345 target

# 测试代理可用性
curl -x socks://localhost:12345 -X POST http://10.x.x.x

将 socks 代理设置纳入 systemd 管理(/etc/systemd/system/sshtunnel@.service):

[Unit]
Description=SSH Tunnel to XX for %I
After=network.target
 
[Service]
Type=oneshot
ExecStart=ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -i /home/%I/.ssh/id_rsa -f -N -T -D 12345 user@X.X.X.X
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

启动服务:

sudo systemctl enable sshtunnel@lingsamuel
sudo systemctl start sshtunnel@lingsamuel

配置 Redsocks

安装 Redsocks:

yay -S redsocks # 以 archlinux/manjaro AUR 为例

配置 Redsocks:

sudo vim /etc/redsocks.conf
sudo redsocks -c /etc/redsocks.conf

conf 中需要配置的部分:

redsocks {
	local_ip = 127.0.0.1;
	local_port = 31338; // 默认值就是 31338 可以不改
	ip = 127.0.0.1;
	port = 12345; // 上面启动的 ssh tunnel 的端口
	type = socks5;
}

配置 iptables

执行:

sudo iptables -t nat -N REDSOCKS # 新增链
sudo iptables -t nat -A OUTPUT -p tcp -j REDSOCKS # OUTPUT转到REDSOCKS链
sudo iptables -t nat -A REDSOCKS -p tcp -d 10.254.0.0/16 -j REDIRECT --to-ports 31338 # 将 10.254.0.0/16 转到 31338
sudo iptables -t nat -A REDSOCKS -p tcp -d 172.30.0.0/16 -j REDIRECT --to-ports 31338 # 将 172.30.0.0/16 转到 31338

配置了这个之后,应该可以直接访问,而不需要设置代理了:

curl --noproxy '*' -X POST http://10.x.x.x

持久化 iptables

配置:

# /usr/lib/systemd/system/iptables.service
[Unit]
Description=iptables from file
Before=network-pre.target
Wants=network-pre.target

[Service]
Type=oneshot
ExecStart=/usr/bin/iptables-restore /etc/iptables/iptables.rules
ExecReload=/usr/bin/iptables-restore /etc/iptables/iptables.rules
ExecStop=/usr/lib/systemd/scripts/iptables-flush
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

然后,执行:

sudo sh -c 'iptables-save > /etc/iptables/iptables.rules'

将规则保存在 unit file 所读取的文件里。

随后,执行:

sudo systemctl enable iptables

添加 DNS

/etc/resolv.conf 增加:

search default.svc.cluster.local svc.cluster.local cluster.local
options ndots:5

当然,如果使用的是 NetworkManager:

nmcli connection show # 首先查看connection的名字
nmcli c modify Wired1 ipv4.dns-search "default.svc.cluster.local svc.cluster.local cluster.local" # Wired1 是第一步查找到的名字
nmcli c modify Wired1 ipv4.dns-option "options ndots:5"
nmcli c down Wired1
nmcli c up Wired1

测试:

curl --noproxy '*' -X POST http://service.namespace