ssh -N -L 3307:127.0.0.1:3306 <username>@<ssh-server-ip>
로컬 연결만 가능하도록 127.0.0.1 로 binding 된 MySQL 서버에 원격에서 접속하고 싶을 때, 해당 서버에 ssh 권한이 있다면 위의 명령을 통해 ssh 터널을 구성한 후 원격에서 3307로 접속하면 된다.
ssh -N -L 3307:127.0.0.1:3306 <username>@<ssh-server-ip>
로컬 연결만 가능하도록 127.0.0.1 로 binding 된 MySQL 서버에 원격에서 접속하고 싶을 때, 해당 서버에 ssh 권한이 있다면 위의 명령을 통해 ssh 터널을 구성한 후 원격에서 3307로 접속하면 된다.
adb pair <IP>:<PORT> 실행
adb pair 192.168.0.4:33917Enter pairing code: 656685adb devices 를 실행하면 연결된 기기가 보일 것. dasomoli> ~> adb devices
List of devices attached
adb-R3CRC0G1A8L-FkwYCP._adb-tls-connect._tcp device
bcrypt는 1999년에 Niels Provos와 David Mazieres가 개발한 암호화 해시 함수로, Blowfish 대칭 키 암호화 알고리즘을 기반으로 만들어졌습니다. 주로 웹 애플리케이션에서 사용자의 비밀번호를 안전하게 저장하기 위해 사용됩니다.
$2b$10$Qcfksu5KwUepA.zVDkkw4Oco0z14Kz2jgfD6sdoGieQfztY1KaIhK
└┬┘└┬┘└─────── Salt ────────┘└─────── Hashed result ───────┘
│ │
│ └── Cost factor (2의 10제곱 = 1024번 해싱)
└────── 버전 (2a, 2b, 2y 등)
brew install bcrypt
🔹 비밀번호 해싱
echo "yourPasswordHere" | bcrypt
$2a$06$D9f2gKT8iJ1Lg/YhH9QpneCn7vD0Qx7xDdwU5k7AlhOPKfMyVPMta
mkdir bcrypt-demo && cd bcrypt-demo
npm init -y
npm install bcrypt
const bcrypt = require('bcrypt');
// 커맨드라인에서 입력받은 비밀번호
const [,, password] = process.argv;
// 유효성 검사
if (!password) {
console.error("❗ 사용법: node bcrypt-hash.js <비밀번호>");
process.exit(1);
}
const saltRounds = 10; // 기본 비용 계수 (2^10 = 1024번 해시 반복)
// 해시 생성
bcrypt.hash(password, saltRounds, (err, hash) => {
if (err) {
console.error("❌ 에러:", err.message);
process.exit(1);
}
console.log("🔐 bcrypt 해시 결과:");
console.log(hash);
});
✅ 사용 방법
테스트 예시:
node bcrypt-hash.js mySecretPassword
const bcrypt = require('bcrypt');
// 커맨드라인 인자 받아오기
const [,, inputPassword, hashedPassword] = process.argv;
// 유효성 검사
if (!inputPassword || !hashedPassword) {
console.error("❗ 사용법: node bcrypt-test.js <암호> <해시>");
process.exit(1);
}
// 비밀번호 검증
bcrypt.compare(inputPassword, hashedPassword, (err, result) => {
if (err) {
console.error("❌ 에러 발생:", err.message);
process.exit(1);
}
if (result) {
console.log("✅ 비밀번호가 일치합니다!");
} else {
console.log("❌ 비밀번호가 일치하지 않습니다.");
}
});
✅ 사용 방법
테스트 예시:
node bcrypt-test.js mySecretPassword '$2b$10$WnV2Kk1aR8...'
ssh 서버 A를 거쳐 ssh 서버 B를 접속하고 싶다면 다음과 같이 ~/.ssh/config에 ProxyJump 를 쓰면 ssh b.dasomoli.org 명령으로 바로 접근하는 것처럼 쓸 수 있다.
Host a.dasomoli.org 11.22.33.44
Hostname 11.22.33.44
User dasomoli
IdentityFile ~/.ssh/a.dasomoli.org.pem
Host b.dasomoli.org 11.22.33.55
Hostname 11.22.33.55
User dasomoli
IdentityFile ~/.ssh/b.dasomoli.org.pem
ProxyJump dasomoli@a.dasomoli.org
Ubuntu 24.04 에 repository 방식으로 설치할 때 다음과 같이 한다.
curl -1sLf \\
'<https://dl.redpanda.com/public/redpanda/setup.deb.sh>' | sudo -E bash
sudo apt-get install -y redpanda-rpk
sudo apt update
sudo apt install redpanda
broker.dasomoli.org 로 사용한다면, /etc/redpanda/redpanda.yaml 설정 파일 편집. 다음 부분을 고침.
- address: "broker.dasomoli.org"
port: 9092
서비스 시작
sudo systemctl enable --now redpanda
서비스 상태 확인
sudo systemctl status redpanda
rpk cluster info --brokers broker.dasomoli.org:9092
사용 중인 토픽 리스트 확인
rpk topic list --brokers broker.dasomoli.org:9092
위의 절차는 인증 없이 사용하게 된다.
ipsec.secrets 와 당연히 동일(e.g. mySecretKey)해야 한다.ipsec.conf의 leftid와 동일(e.g. dasomoli.org)해야 한다.FortiGate CLI에서 확인
diagnose vpn ike gateway list
또는:
diagnose vpn tunnel list
strongswan 을 설치한다.
brew install strongswan
/opt/homebrew/etc/ipsec.conf 설정 파일을 작성한다.
config setup
charondebug="ike 2, knl 2, cfg 2, net 2, esp 2"
conn fortigate
keyexchange=ikev1
aggressive=no
authby=psk
forceencaps=yes
installpolicy=yes
type=tunnel
left=%defaultroute
leftid=@dasomoli.org
right=11.13.3.1
rightid=11.13.3.1
leftsubnet=192.168.0.0/24
rightsubnet=192.168.64.0/19,10.30.0.0/16
leftupdown=/opt/homebrew/etc/ipsec-updown.sh
ike=aes256-sha256-modp2048!
esp=aes256-sha256-modp2048!
ikelifetime=86400s
lifetime=3600s
dpdaction=restart
auto=start
설정 파일에서 사용하는 /opt/homebrew/etc/ipsec-updown.sh 를 작성한다. 이는 strongSwan은 macOS에서 커널 라우팅 테이블에 자동으로 라우트를 추가하지 않기 때문이다. 이는 macOS 커널이 PF_ROUTE를 통해 정책 기반 라우팅을 제공하지 않기 때문이다. 따라서 updown 스크립트를 활용해 수동 라우팅을 추가한다.
#!/bin/sh
case "$PLUTO_VERB" in
up-client)
/sbin/route add -net 10.30.0.0/16 -interface $PLUTO_INTERFACE
/sbin/route add -net 192.168.64.0/19 -interface $PLUTO_INTERFACE
;;
down-client)
/sbin/route delete -net 10.30.0.0/16
/sbin/route delete -net 192.168.64.0/19
;;
esac
PSK를 /opt/homebrew/etc/ipsec.secrets 파일 안에 다음과 같이 넣는다.
@dasomoli.org @fortigate : PSK "mySecretKey"
macOS에서는 시스템 서비스로 실행되지 않기 때문에, 수동으로 아래와 같이 실행한다.
sudo ipsec start
또는
sudo ipsec down fortigate
sudo ipsec up fortigate
로그 확인:
log show --predicate 'process == "charon"' --info --last 5m
연결 확인:
ipsec statusall
종료:
sudo ipsec stop
라우팅 확인:
route -n get 10.30.0.1
혹은:
netstat -rn | grep 10.
IPSec 터널은 인터넷 프로토콜 보안(IPSec, IP Security)을 이용해 두 네트워크 간에 암호화된 통신 경로(터널)를 만드는 기술입니다. 보통 VPN(Virtual Private Network)의 핵심 기술 중 하나로 사용되며, 안전하게 데이터를 송수신할 수 있도록 해줍니다.
IPSec 연결은 보통 두 단계로 나뉩니다:
목표: 두 장비 간에 안전한 제어 채널 (IKE SA)을 먼저 수립하여, 이후 민감한 설정 정보를 안전하게 교환할 수 있게 함.
목표: 실제 데이터를 암호화하기 위한 IPSec 터널 (IPSec SA)을 만들고, 트래픽을 전송할 준비를 마침
| 단계 | 설명 | 키워드 |
|---|---|---|
| Phase 1 | 제어 채널 설정 | IKE, DH 키 교환, PSK/인증서, 암호화 |
| Phase 2 | 터널 설정 | ESP, IPSec SA, 트래픽 선택자 |
| 이후 | 암호화된 데이터 전송 | 실제 사용자 데이터 암호화 |
| 포트 번호 | 프로토콜 | 설명 |
|---|---|---|
| UDP 500번 포트 | IKE (v1, v2 모두) | IKE SA를 설정하기 위한 초기 패킷 전송에 사용됨 |
| UDP 4500번 포트 | NAT-T (NAT Traversal) | NAT 환경에 있는 경우 ESP 대신 이 포트를 사용하여 UDP로 터널링 |
| ESP 프로토콜 (IP 프로토콜 번호 50) | 암호화된 실제 데이터 | IKE 설정 후 데이터 트래픽에 사용됨 (포트 X, IP 프로토콜 50) |
| AH 프로토콜 (IP 프로토콜 번호 51) | 인증 전용 (거의 안 씀) | 선택적 사용 |
만약 장비 뒤에 NAT가 있을 경우 (예: 공유기):
참고 예시 (방화벽 설정 시)
| 허용해야 할 포트/프로토콜 | 목적 |
|---|---|
| UDP 500 | IKE Phase 1/2 |
| UDP 4500 | NAT 환경에서의 IKE 및 ESP 트래픽 |
| ESP (IP 프로토콜 50) | 암호화된 데이터 (터널링된 트래픽) |
| AH (IP 프로토콜 51) | 인증용 데이터 (선택적) |
주의: ESP는 TCP/UDP 포트가 아니라 IP 프로토콜 번호 50입니다. 방화벽에서는 포트가 아닌 프로토콜 번호로 허용해줘야 합니다.
https://besu.hyperledger.org/private-networks/tutorials/ibft/validators 를 참고한다.
추가를 하려면, 예를 들어:
curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0xd67073156211f895b2d4be3a86260b0554768ac0", true], "id":1}' http://127.0.0.1:8545/ -H "Content-Type: application/json"
제거를 하려면, 예를 들어:
curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_proposeValidatorVote","params":["0xd67073156211f895b2d4be3a86260b0554768ac0", false], "id":1}' http://127.0.0.1:8545/ -H "Content-Type: application/json"
Validator 노드들은 다음과 같이 확인할 수 있다.
curl -X POST --data '{"jsonrpc":"2.0","method":"ibft_getValidatorsByBlockNumber","params":["latest"], "id":1}' http://127.0.0.1:8545/ -H "Content-Type: application/json"
터미널에서 다음 명령어 입력:
ip addr show
혹은 간단하게
ip a
인터페이스 별로 확인하려면:
ip -4 addr show eth0
외부 서버에 요청해서 확인:
curl ifconfig.me
또는
curl ipinfo.io/ip
Get-AppXPackage -AllUsers | Foreach {Add-AppxPackage -DisableDevelopmentMode -Register “$($_.InstallLocation)\AppXManifest.xml”}
이후 재부팅