Day: February 20, 2025

  • Install Strongswan on Amazon Linux 2023 ARM64

    這個問題困擾我很久了,Amazon Linux 2023 ARM64 的repo 中軟體太過稀有,以至於很多的軟體都要從Redhat9 的binary 去獲取。

    為什麼是ARM64?感覺是個趨勢吧,畢竟是這麼“節儉”的公司,不會亂花錢去做到目前的Graviton 4。

    但問題是,官方並沒有明確Amazon Linux 2023 對應到哪一個版本的Fedora 或者RHEL,這就有點玄學的意思,自己試?我試了幾個版本,失敗。

    直接從source code 來compile 算了。

    dnf install gcc make openssl-devel -y 
    mkdir src && cd src
    wget https://download.strongswan.org/strongswan-6.0.0.tar.gz
    tar zxf strongswan-6.0.0.tar.gz && cd strongswan-6.0.0
    ./configure --prefix=/usr/local/strongswan --enable-libipsec --enable-stroke && make && make install
    sudo tee /etc/systemd/system/strongswan.service > /dev/null <<EOL
    [Unit]
    Description=strongSwan IPsec IKEv1/IKEv2 daemon
    After=network.target
    [Service]
    ExecStart=/usr/local/strongswan/sbin/ipsec start --nofork
    ExecStop=/usr/local/strongswan/sbin/ipsec stop
    Restart=on-failure
    [Install]
    WantedBy=multi-user.target
    EOL

    寫入幾個微小的配置檔。

    sudo tee /usr/local/strongswan/etc/ipsec.secrets > /dev/null <<EOL
    2100:ab16:796:5a00:bg29:6r8d:4dca:b02a someone@aws.net : PSK "86f6g7da3316a95b0f4e6416f4f0b15c44083a8b4c2da0dee8ac"
    EOL
    sudo tee /usr/local/strongswan/etc/ipsec.conf > /dev/null <<EOL
    config setup
        uniqueids=never
        charondebug="cfg 2, dmn 2, ike 3, net 2"
    conn Someone2AWS-v6
            authby=secret
            left=2100:ab16:796:5a00:bg29:6r8d:4dca:b02a
            leftid=2100:ab16:796:5a00:bg29:6r8d:4dca:b02a
            leftsubnet=10.4.0.0/16
            right=2406:520:88:5cb::1
            #right=host.domain.org
            rightid=someone@aws.net
            rightsubnet=10.1.3.0/24
            ike=aes128gcm128-sha256-modp2048!
            esp=aes128gcm128-modp2048!
            keyingtries=0
            ikelifetime=8h
            lifetime=1h
            auto=start
    EOL

    嘗試啟動

    systemctl stop strongswan
    systemctl disable strongswan
    systemctl daemon-reload
    systemctl enable strongswan
    systemctl restart strongswan
    systemctl status strongswan

    把ipsec command link 一下

    ln -s /usr/local/strongswan/sbin/ipsec /usr/sbin/ipsec
    ipsec status

    查看一下log 是否正常

    journalctl -u strongswan --since -1min

    還需要對防火牆進行一點點改動,打開相應的port 和forward

    dnf install firewalld -y
    systemctl enable firewalld
    systemctl start firewalld
    firewall-cmd --zone=public --add-masquerade --permanent
    firewall-cmd --zone=public --add-service=ipsec --permanent
    firewall-cmd --zone=public --add-service=ssh --permanent
    firewall-cmd --permanent --zone=public --add-interface=ens5
    firewall-cmd --reload


    Update 20250429

    cd src
    curl -O https://download.strongswan.org/strongswan-6.0.1.tar.gz
    tar zxf strongswan-6.0.1.tar.gz
    cd strongswan-6.0.1
    dnf install systemd-devel
    ./configure --enable-systemd && make && make install
    rm /etc/systemd/system/strongswan.service
    sudo tee /etc/systemd/system/strongswan.service > /dev/null <<EOL
    [Unit]
    Description=strongSwan IPsec IKEv1/IKEv2 daemon using swanctl
    After=network-online.target
    Documentation=man:charon-systemd(8) man:swanctl(8)
    
    [Service]
    Type=notify
    ExecStart=/usr/local/sbin/charon-systemd
    ExecStartPost=/usr/local/sbin/swanctl --load-all
    ExecReload=/usr/local/sbin/swanctl --reload
    Restart=on-abnormal
    
    [Install]
    WantedBy=multi-user.target
    EOL

    是時候拋棄ipsec command了,啟用systemd 和swanctl

    一個使用swanctl 的conf

    connections {
        AWS2BuyVM {
            local_addrs = 2605:6600:10:e95:62cb:d245:1888:eeee
            local {
                id = 2605:6600:10:e95:62cb:d245:1888:eeee
                auth = psk
            }
            remote {
                auth = psk
                id = 2406:da16:7e3:5a00:ca98:6f8d:4cfe:bbbb
            }
            remote_addrs = 2406:da16:7e3:5a00:ca98:6f8d:4cfe:bbbb
            children {
                AWS2BuyVM {
                    local_ts = 10.30.96.0/24
                    remote_ts = 10.2.0.0/16,10.3.0.0/16,10.4.0.0/16,10.5.0.0/16
                    esp_proposals = aes128gcm128-modp2048
                    life_time = 1h
                    start_action = route
                }
            }
            version = 2
            proposals = aes128gcm128-sha256-modp2048
            rekey_time = 8h
            keyingtries = 0
        }
    }
    
    secrets {
        ike-AWS2BuyVM {
            id-local = 2605:6600:10:e95:62cb:d245:1888:eeee
            id-remote = 2406:da16:7e3:5a00:ca98:6f8d:4cfe:bbbb
            secret = "0000000000000000_r"
        }
    }

    查看一下連結的情況:

    swanctl --list-sas
    BuyVM2AWS: #17, ESTABLISHED, IKEv2, 6e00f87f2e29ab73_i* b801ad6c15b17e01_r
      local  '2406:da16:7e3:5a00:ca98:6f8d:4cfe:bbbb' @ 2406:da16:7e3:5a00:ca98:6f8d:4cfe:bbbb[4500]
      remote '2605:6600:10:e95:62cb:d245:1888:eeee' @ 2605:6600:10:e95:62cb:d245:1888:eeee[4500]
      AES_GCM_16-128/PRF_HMAC_SHA2_256/MODP_2048
      established 85s ago, rekeying in 26399s
      BuyVM2AWS: #7, reqid 5, INSTALLED, TUNNEL, ESP:AES_GCM_16-128
        installed 86s ago, rekeying in 2873s, expires in 3515s
        in  ce702c32,   4620 bytes,    55 packets,    31s ago
        out c273aa68,   4872 bytes,    58 packets,    12s ago
        local  10.2.0.0/16 10.3.0.0/16 10.4.0.0/16 10.5.0.0/16
        remote 10.30.96.0/24