Hero Image
SSH 证书登录教程

SSH 证书登录教程 证书登录的流程 SSH 证书登录之前,如果还没有证书,需要生成证书。具体方法是: 用户和服务器都将自己的公钥,发给 CA CA 使用服务器公钥,生成服务器证书,发给服务器 CA 使用用户的公钥,生成用户证书,发给用户。 有了证书以后,用户就可以登录服务器了。整个过程都是 SSH 自动处理,用户无感知。 用户登录服务器时,SSH 自动将用户证书发给服务器。 服务器检查用户证书是否有效,以及是否由可信的 CA 颁发。 SSH 自动将服务器证书发给用户。 用户检查服务器证书是否有效,以及是否由信任的 CA 颁发。 双方建立连接,服务器允许用户登录。 生成 CA 的密钥 虽然 CA 可以用同一对密码签发用户证书和服务器证书,但是出于安全性和灵活性,最好用不同的密钥分别签发。所以,CA 至少需要两对密钥,一对是签发用户证书的密钥,假设叫做 user_ca,另一对是签发服务器证书的密钥,假设叫做 host_ca。 # 生成 CA 签发用户证书的密钥 # 会在~/.ssh目录生成一对密钥:user_ca(私钥)和user_ca.pub(公钥) # 各个参数含义如下 # -t rsa:指定密钥算法 RSA。 # -b 4096:指定密钥的位数是4096位。安全性要求不高的场合,这个值可以小一点,但是不应小于1024。 # -f ~/.ssh/user_ca:指定生成密钥的位置和文件名。 # -C user_ca:指定密钥的识别字符串,相当于注释,可以随意设置。 $ ssh-keygen -t rsa -b 4096 -f ~/.ssh/user_ca -C user_ca # 生成 CA 签发服务器证书的密钥 # 会在~/.ssh目录生成一对密钥:host_ca(私钥)和host_ca.pub(公钥) # 现在,~/.ssh目录应该至少有四把密钥。 # - ~/.ssh/user_ca # - ~/.ssh/user_ca.pub # - ~/.ssh/host_ca # - ~/.ssh/host_ca.pub $ ssh-keygen -t rsa -b 4096 -f host_ca -C host_ca 服务器安装 CA 公钥 # 为了让服务器信任用户证书,必须将 CA 签发用户证书的公钥`user_ca.pub`,拷贝到服务器 $ scp ~/.ssh/user_ca.pub root@host.example.com:/etc/ssh/ 然后,将下面一行添加到服务器配置文件 /etc/ssh/sshd_config TrustedUserCAKeys /etc/ssh/user_ca.pub 上面的做法是将user_ca.pub加到/etc/ssh/sshd_config,这会产生全局效果,即服务器的所有账户都会信任user_ca签发的所有用户证书。

Hero Image
用 iptables 和 ip rule 做負載均衡

用 iptables 和 ip rule 做負載均衡 操作 這裡以一台透過有線 + 無線出口連線到網際網路的 Arch Linux 裝置為例。共有兩個出口,分別使用網卡 eth0 和 eth1。大致對應關係如下: 標記 10 (0xa) - 路由表 #110 - 使用 eth0 出口 標記 11 (0xb) - 路由表 #111 - 使用 eth1 出口 我們會根據封包上的標記值判斷它應該走哪個出口。首先,使用 ip rule 為每個標記值指定一張路由表。 通常預設路由表的權重是 32768。為了讓我們的路由表生效,需要將權重調高一些(例如 31000)。 # 讓帶標記 10 (0xa) 的封包使用 110 號路由表,權重 31000 ip rule add fwmark 10 table 110 prio 31000 # 讓帶標記 11 (0xb) 的封包使用 111 號路由表,權重 31000 ip rule add fwmark 11 table 111 prio 31000 # 如果你的連線更多,可以繼續新增標記 <-> 路由表的對應關係 # #110 路由表的路由 ip route add 10.20.0.0/24 dev eth0 table 110 ip route add default via 10.20.0.254 table 110 # #111 路由表的路由 ip route add 10.25.0.0/24 dev eth1 table 111 ip route add default via 10.25.0.254 table 111 # 如果這條連線已經被標記,將標記設定到封包上 iptables -t mangle -A OUTPUT -j CONNMARK --restore-mark # 如果封包已經有標記,直接放行 iptables -t mangle -A OUTPUT -m mark ! --mark 0 -j ACCEPT # 如果封包沒有被標記 # 把封包標記為 10 (0xa) iptables -t mangle -A OUTPUT -j MARK --set-mark 10 # 每 2 個封包就把一個封包標記為 11 (0xb) iptables -t mangle -A OUTPUT -m statistic --mode nth --every 2 --packet 0 -j MARK --set-mark 11 # 如果你有三條出口,這裡可以類似於 # iptables -t mangle -A OUTPUT -j MARK --set-mark 10 # iptables -t mangle -A OUTPUT -m statistic --mode nth --every 3 --packet 0 -j MARK --set-mark 11 # iptables -t mangle -A OUTPUT -m statistic --mode nth --every 3 --packet 1 -j MARK --set-mark 12 # 把封包的標記儲存到整條連線上,讓整個連線使用同一個出口 iptables -t mangle -A OUTPUT -j CONNMARK --save-mark # 讓封包的出口與我們選擇的一致 iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE 之後可以用 iptables -L OUTPUT -t mangle 看一下規則是否正確,再用 Wireshark 驗證連線是否真的分流。