我迫切希望各家公司能把网络连通性搞搞好。
配置 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